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)
- 无法通过变量引用的对象就是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就接近了。
计划学习时间:10小时
实际学习时间:10小时
改进情况: