20145214 《Java程序设计》第4周学习总结

教材学习内容总结

继承

  • 继承基本上就是避免多个类间重复定义共同行为。要避免在程序设计上出现重复,可以把相同的程序代码提升为父类。

  • 关键字extends的用法:A extends B表示A会扩充B的行为,A继承了B的行为,也可以在A的程序中继续扩充B原本没有的行为。

  • 关于继承的代码如下。

      public class RPG1
    {
    public static void main (String[] args)
    {
    demoSwordsMan();
    demoMagician();
    }
    static void demoSwordsMan()
    {
    SwordsMan1 swordsMan1 = new SwordsMan1();
    swordsMan1.setName("Justin");
    swordsMan1.setLevel(1);
    swordsMan1.setBlood(200);
    System.out.printf("剑士 : (%s, %d, %d)%n",swordsMan1.getName(),
    swordsMan1.getLevel(),swordsMan1.getBlood());
    }
    static void demoMagician()
    {
    Magician1 magician = new Magician1();
    magician.setName("Moinca");
    magician.setLevel(1);
    magician.setBlood(100);
    System.out.printf("魔法师 :(%s ,%d ,%d)%n",magician.getName(),
    magician.getLevel(),magician.getBlood()); }
    }
  • 运行结果如下。

  • 子类和父类之间有 is-a 的关系,检查语法逻辑是否正确的方法是看等号的右边类是不是左边类的子类。通过使用 is-a 规则,可以避免使用重载的繁琐,使程序具有更高的可维护性。代码如下。

      public class RPG2
    {
    public static void main(String[] args)
    {
    SwordsMan1 swordsMan = new SwordsMan1();
    swordsMan.setName("Justin");
    swordsMan.setLevel(1);
    swordsMan.setBlood(200); Magician1 magician = new Magician1();
    magician.setName("Monica");
    magician.setLevel(1);
    magician.setBlood(100); showBlood(swordsMan);
    showBlood(magician); }
    static void showBlood(Role1 role)
    {
    System.out.printf("%s 血量 %d%n",role.getName(),role.getBlood());
    }
    }
  • 运行结果如下。

  • 子类在继承父类之后,定义与父类中相同的方法部署,但执行内容不同,这称为重新定义。要注意重新定义父类中某个方法时,子类必须撰写与父类中相同的签署。代码如下。

      public class RPG3
    {
    public static void main(String[] args)
    {
    SwordsMan3 swordsMan3 = new SwordsMan3();
    swordsMan3.setName("Justin");
    swordsMan3.setLevel(1);
    swordsMan3.setBlood(200); Magician3 magician3 = new Magician3();
    magician3.setName("Monica");
    magician3.setLevel(1);
    magician3.setBlood(100); drawFight(swordsMan3);
    drawFight(magician3); }
    static void drawFight(Role3 role)
    {
    System.out.print(role.getName());
    role.fight3();
    }
    }
  • 运行结果如下。

  • 内建的标准标注为@Override,表示要求编译程序检查该方法是不是真的重新定义了父类中某个方法。

  • 若某方法区块中没有任何程序代码操作,则可用abstract标示该方法为抽象方法,直接";"结束即可,表示这个类定义不完整。

继承语法

  • 如果父类中数据成员被定义为private无法直接在子类中存取,又不想开放访问权限时,可以定义这些数据成员为protected。

  • 被声明为protected的成员,相同包中的类可以直接存取,不同包中的类可以在继承后的子类直接存取。

  • Java中共有四个权限范围:private,无关键字,protected,public,权限依次从小到大。

  • 如果想取得父类中的方法定义,可以在调用方法前,加上super关键字,使用super关键字调用的父类方法,不能定义为private。

  • 如果想执行父类中某构造函数,可以使用super()指定。子类构造函数中没有指定执行父类中哪个构造函数,默认会调用父类中无参数构造函数。

  • 如果class前使用了final关键字,表示这个类是最后一个,不会再有子类,也就是不能被继承。

  • 使用数组收集各种对象,可声明为Object[]类型,不限长度地收集对象代码如下。

      import java.util.Arrays;
    
      public class ArrayList {
    private Object[] list;
    private int next; public ArrayList(int capacity)
    {
    list=new Object[capacity];
    } public ArrayList() {
    this(16);
    } public void add(Object o) {
    if(next==list.length) {
    list=Arrays.copyOf(list, list.length*2);
    }
    list[next++]=o;
    }
    public Object get(int index) {
    return list[index];
    } public int size() {
    return next;
    }
    }
  • 使用上述自定义的Arraylist类,收集访客名称,并将名单转为大写后显示的代码如下。

      import java.util.Scanner;
    import static java.lang.System.out; public class Guest {
    public static void main(String[] args) {
    ArrayList names=new ArrayList();
    collectNameTo(names);
    out.println("访客名单:");
    printUpperCase(names);
    } static void collectNameTo(ArrayList names) {
    Scanner console=new Scanner(System.in);
    while(true) {
    out.print("访客名称:");
    String name=console.nextLine();
    if(name.equals("quit")) {
    break;
    }
    names.add(name);
    }
    } static void printUpperCase(ArrayList names) {
    for(int i=0;i<names.size();i++) {
    String name=(String) names.get(i);
    out.println(name.toUpperCase());
    }
    }
    }
  • 运行结果如下。

  • 执行流程中,无法通过变量参考的对象,就是JVM垃圾收集机制认定的垃圾对象。

  • 在取得用户输入、显示结果的环境未定时,可以通过设计来解决。以猜数字游戏为例,可以将此程序分为GuessGame.java、ConsoleGame.java和Guess.java三个部分。最后程序执行结果如下。

接口

  • 对于定义行为,可以使用interface关键字定义,接口中的方法不能操作,直接标示为abstract,而且一定是public。

  • 类要操作接口,必须使用implements关键字。

  • 操作同一个接口,提高可维护性的代码如下。

     public class Ocean{
    public static void main(String[] args)
    {
    doSwim(new Anemonefish("尼莫"));
    doSwim(new Shark("兰尼"));
    doSwim(new Human("贾斯汀"));
    doSwim(new Submarine("黄色一号"));
    } static void doSwim(Swimmer swimmer){
    swimmer.swim();
    }
    }
  • 运行结果如下。

  • 类与接口之间是实现关系,而且类可以继承一个类的同时实现多个接口,接口与接口之间可以有继承关系。各个类与接口代码已托管至开源中国,程序运行结果如下。

接口语法

  • 可使用interface来定义抽象的行为与外观,接口中的方法没有操作时,一定得是公开且抽象,此时可以省略public abstract。

  • 使用匿名内部类,直接建立操作对象代码如下。

      public class MultiChat{
    public static void main(String[] args){
    Client c1=new Client("127.0.0.1","Caterpillar");
    Client c2=new Client("192.168.0.2","Justin"); ClientQueue queue=new ClientQueue();
    queue.addClientListener(new ClientListener(){
    @Override
    public void clientAdded(ClientEvent event){
    System.out.printf("%s 从 %s 联机%n",
    event.getName(),event.getIp());
    }
    @Override
    public void clientRemoved(ClientEvent event){
    System.out.printf("%s 从 %s 脱机%n",
    event.getName(),event.getIp());
    }
    });
    queue.add(c1);
    queue.add(c2);
    queue.remove(c1);
    queue.remove(c2);
    }
    }
  • 运行结果如下。

  • enum语法可用于定义枚举常数。enum定义了特殊的类,直接撰写程序继承Enum类会被编译程序拒绝。对enum的使用代码如下。

      import static java.lang.System.out;
    public class Game2{
    public static void main(String[] args){
    play(Action2.RIGHT);
    play(Action2.UP);
    }
    public static void play(Action2 action){
    switch(action){
    case STOP:
    out.println("播放停止动画");
    break;
    case RIGHT:
    out.println("播放向右动画");
    break;
    case LEFT:
    out.println("播放向左动画");
    break;
    case UP:
    out.println("播放向上动画");
    break;
    case DOWN:
    out.println("播放向下动画");
    break;
    }
    }
    }
  • 运行结果如下。

代码调试中的问题和解决过程

  • 问题:如果没有使用IDEA,还有什么方法可以让有继承和接口的程序正确执行?
  • 解决:尚未解决。

开源中国代码托管截图如下









其他(感悟、思考等,可选)

进入java学习的第四周,完成每一周的学习任务已经成为一种习惯了,学会了怎样在周一发布学习任务后到周日提交博客前合理地分配学习时间,不会再像之前把任务都堆积到周末完成。这样的学习模式让我每一天过得更充实了。自己动手敲代码,让代码成功运行也成为了一种乐趣。本周还学会了统计代码行数,这让我对自己的学习情况有了量化指标的掌握,也更有了满足感。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 200/200 2/2 20/20
第二周 300/500 1/3 20/40
第三周 400/900 1/4 25/65
第四周 1236/2136 1/5 30/95

参考资料

20145214 《Java程序设计》第4周学习总结的更多相关文章

  1. 20145213《Java程序设计》第九周学习总结

    20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...

  2. 20145213《Java程序设计》第二周学习总结

    20145213<Java程序设计>第二周学习总结 教材学习内容总结 本周娄老师给的任务是学习教材的第三章--基础语法.其实我觉得还蛮轻松的,因为在翻开厚重的书本,一股熟悉的气息扑面而来, ...

  3. 20145213《Java程序设计》第一周学习总结

    20145213<Java程序设计>第一周学习总结 教材学习内容总结 期待了一个寒假,终于见识到了神秘的娄老师和他的Java课.虽说算不上金风玉露一相逢,没有胜却人间无数也是情理之中,但娄 ...

  4. 21045308刘昊阳 《Java程序设计》第九周学习总结

    21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...

  5. 20145330孙文馨 《Java程序设计》第一周学习总结

    20145330孙文馨 <Java程序设计>第一周学习总结 教材学习内容总结 刚开始拿到这么厚一本书说没有压力是不可能的,开始从头看觉得很陌生进入不了状态,就稍微会有一点焦虑的感觉.于是就 ...

  6. 20145337 《Java程序设计》第九周学习总结

    20145337 <Java程序设计>第九周学习总结 教材学习内容总结 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JDBC可以 ...

  7. 20145337 《Java程序设计》第二周学习总结

    20145337 <Java程序设计>第二周学习总结 教材学习内容总结 Java可分基本类型与类类型: 基本类型分整数(short.int.long).字节(byte).浮点数(float ...

  8. 20145218《Java程序设计》第一周学习总结

    20145218 <Java程序设计>第一周学习总结 教材学习内容总结 今天下午看了Java学习的视频,感觉很是新奇,之前觉得Java学起来是艰难枯燥的,但通过第一章的学习觉得如果自己可以 ...

  9. 《Java程序设计》第九周学习总结

    20145224 <Java程序设计>第九周学习总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的 ...

  10. 《Java程序设计》第二周学习总结

    20145224陈颢文<Java程序设计>第二周学习总结 教材学习内容总结 一.类型.变量与运算符 1.类型 整数: 可细分为为short整数(占2字节),int整数(占4字节),long ...

随机推荐

  1. 导入jar包和创建jar文件

    具体步骤   导入jar包 1.在第一个工程中编写工具类并运行生成.class文件 2.在myeclipse工具栏找到open in 文件夹图标找到.class文件所在的包,将其全部复制到某个盘符下( ...

  2. 剑指Offer-迭代

    1.大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0) 备注:斐波那契数列指的是这样一个数列从第3项开始,每一项都等于前两项之和. public st ...

  3. mybatis报错:未找到参数导致绑定异常

    问题: 在映射文件中使用parameterMap元素时出现以下异常: org.mybatis.spring.MyBatisSystemException: nested exception is or ...

  4. UEditor代码实现高亮显示

    在公司开发一个论坛系统,由于用的是UEditor(百度编辑器),单独使用的话,里面的代码不会高亮,网上找了很多,最后决定使用 highlight.js 实现代码高亮显示.效果如下: 这个是我修改其他的 ...

  5. python中函数参数的引用方式

    值传递和引用传递时C++中的概念,在python中函数参数的传递是变量指向的对象的物理内存地址!!! python不允许程序员选择采用传值还是传引用.Python参数传递采用的肯定是“传对象引用”的方 ...

  6. kafka zk常用命令

    1  创建topic: kafka-topics.sh --create --zookeeper 3.3.3.3:2181 --replication-factor 1 --partitions 3 ...

  7. 第九篇:S3C2400时钟体系

    S3C2400时钟体系 S3C2400时钟配置流程 该学习板使用了外部晶振12Mhz 晶振--->经过MPLL(锁相环) --->(倍频得到)FCLK--->(对FCLK分频得到)H ...

  8. 生成Ipa安装包的plist文件后生成下载链接

    假设生成的plist文件的下载链接是: https://www.xx.com/download/xx.plist 那么如果想让苹果手机的浏览器点击后开始下载苹果软件包,则网页中的下载链接需要拼接成 i ...

  9. C语言,初次见面~

    C语言是一门介于低级语言(如汇编语言)和高级语言(如Java,Python)之间的一门编程语言,所以它兼有两类语言的一些优点,并且具有自身的一些特点. 1.c语言的高效性.c语言具有通常是汇编语言才具 ...

  10. Docker入门系列01

    前两篇写了 Docker 如何安装和相关的概念,当然概念的东西省略了很多,主要是自己水平有限,所以后期会可能增添.但以上内容都是用别人的建好的 镜像(Image) ,这怎么行,我们应该自己动手造轮子, ...