首页 > 技术文章 > 20155324 2016-2017-2 《Java程序设计》第4周学习总结

wang5324 2017-03-19 18:37 原文

20155324 2016-2017-2 《Java程序设计》第4周学习总结

教材学习内容总结

继承

面对对象中,子类继承父类,避免重复定义行为就使用继承。在Java中,继承时使用extends关键字,private成员也会被继承,只不过子类无法直接存取,必须通过父类提供的方法来存取。

package cc.openhome;

public class RPG {
    public static void main(String[] args) {
        demoSwordsMan();
        demoMagician();
    }

    static void demoSwordsMan() {
        SwordsMan swordsMan = new SwordsMan();
        swordsMan.setName("Justin");
        swordsMan.setLevel(1);
        swordsMan.setBlood(200);
        System.out.printf("劍士:(%s, %d, %d)%n", swordsMan.getName(), 
                swordsMan.getLevel(), swordsMan.getBlood());
    }

    static void demoMagician() {
        Magician magician = new Magician();
        magician.setName("Monica");
        magician.setLevel(1);
        magician.setBlood(100);
        System.out.printf("魔法師:(%s, %d, %d)%n", magician.getName(), 
                magician.getLevel(), magician.getBlood());
    }
}

执行结果如下:

剑士:(Justin,1,200)
魔法师:(Monica,1,200)

继承也符合DRY(Don't Repeat Yourself)原则

多态与is-a

子类只能继承一个父类,继承有个重要的关系,就是子类与父类间会有is-a的关系。

以抽象讲法解释,就是使用单一接口操作多种类型的对象。

  • 继承可以复用代码,更大的用处是实现「多态」
  • 封装是继承的基础,继承是多态的基础
  • 「用父类声明对象引用,用子类生成对象」就有了多态

抽象方法、抽象类

  • abstract
  • Java中有抽象方法的类一定是抽象类,但抽象类中的方法不一定都是抽象方法
  • 抽象类不能使用new生成对象

public/package/protected/private

  • super与this
  • java.lang.Object
toString
equals
hashCode
instanceof
  • 垃圾收集(Garbage Collection,GC)
  1. 无法通过变量引用的对象就是GC认定的垃圾对象

2.垃圾回收前会调用finalize()方法,但由于调用时机无法确定,建议不要使用finalize()方法

  • 设计模式
    参考实验二 Java面向对象程序设计中的「模式」

接口定义行为

  • 对于“定义行为”,可以使用interface关键字定义,接口中的方法不能操作,直接标示为abstract,而且一定是public。类要操作接口,必须使用implements关键字。操作某借口时,对接口中定义的方法有两种处理方式,一是操作接口中定义的方法,二是再度将该方法标示为abstract。
package cc.openhome;

public abstract class Fish implements Swimmer {
    protected String name;
    public Fish(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    @Override
    public abstract void swim();
}

人类

package cc.openhome;

public class Human implements Swimmer {
    private String name;
    public Human(String name) {
        this.name = name;
    } 
    public String getName() {
        return name;
    }
    
    @Override
    public void swim() {
        System.out.printf("人類 %s 游泳%n", name);
    }
}

鲨鱼

package cc.openhome;

public class Shark extends Fish {
   public Shark(String name) {
       super(name);
   }
   
    @Override
    public void swim() {
        System.out.printf("鯊魚 %s 游泳%n", name);
    }
}
  • 继承会是有“一种关系”,操作接口则表示“拥有行为”,但不会有“是一种”的关系。对于接口多态语法的判断,方式是“右边是不是拥有左边的行为”,或者“右边对象是不是操作了左边接口”。
package cc.openhome;

public class Ocean {
    public static void main(String[] args) {
        doSwim(new Anemonefish("尼莫"));
        doSwim(new Shark("蘭尼"));
        doSwim(new SwimPlayer("賈斯汀"));
        doSwim(new Submarine("黃色一號"));
        doSwim(new Seaplane("空軍零號"));
        doSwim(new FlyingFish("甚平"));
    }

    static void doSwim(Swimmer swimmer) {
        swimmer.swim();
    }
}
package cc.openhome;

public class Seaplane extends Airplane implements Swimmer {
    public Seaplane(String name) {
        super(name);
    }
    
    @Override
    public void fly() {
        System.out.print("海上");
        super.fly();
    }

    @Override
    public void swim() {
        System.out.printf("海上飛機 %s 航行海面%n", name);
    }
}
  • 类可以操作两个以上的类,也就是拥有两种以上的行为。类可以同时继承某个类,并操作某些接口。接口可以继承自另一个接口,也就是继承父接口行为,再在子接口中额外定义行为。

教材学习中的问题和解决过程

  • 如果两个接口都定义了某方法,操作两个接口的类并不会有错误,照样通过编译,但两个接口都有定义额方法是否表示不同的行为?
  • 可能有不同的行为,接口可以继承别的接口,也可以同时继承两个以上的接口,同样也是使用extends关键字,这代表了继承父接口的行为。

代码托管

  • 代码提交过程截图:
  • 代码量截图:

上周考试错题总结

  • 调用p145 sum函数计算1+2+3+4+5的代码是(MathTool.sum(1,2,3,4,5))
  • 做题的时候没有想到利用MathTool.sum来解决问题导致错误。
  • public void someMethod()和public int someMethod()是方法重载。(x)
  • 对概念的理解错误。导致了问题的错误。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第四周 400/500 1/1 15/20

尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

参考:软件工程软件的估计为什么这么难软件工程 估计方法

参考资料

推荐阅读