2019.10.21课堂总结
一、动手试验1
TestInherits.java代码如下:
1 package HomeTest; 2 3 class Grandparent { 4 public Grandparent(){ 5 System.out.println("GrandParent Created."); 6 } 7 public Grandparent(String string) { 8 System.out.println("GrandParent Created.String:" + string); 9 } 10 } 11 class Parent2 extends Grandparent{ 12 public Parent2(){ 13 super("Hello.Grandparent."); 14 System.out.println("Parent Created"); 15 // super("Hello.Grandparent."); 16 } 17 } 18 class Child2 extends Parent2 { 19 public Child2() { 20 System.out.println("Child Created"); 21 } 22 } 23 24 public class TestInherits { 25 public static void main(String args[]) { 26 Child2 c = new Child2(); 27 } 28 }
运行结果:
结论:
(1)子类的构造方法在运行之前,必须调用父类的构造方法;
(2)通过 super 调用基类构造方法,必须是子类构造方法中的第一个语句。
思索:为什么子类的构造方法在运行之前,必须调用父类的构造方法?能不能反过来?为什么不能反过来?
结论:
因为子类继承了父类的属性和方法,要想初始化子类的对象,则需要父类的属性和方法,所以需要先构造父类的属性和方法,所以要调用父类的构造方法,然后再构造自己在父类的基础上增加的属性和方法。
二、探索技术的奥秘
反编译结果:
经查看源码后得出结论:
前面示例中,main方法实际上调用的是: public void println(Object x),这一方法内部调用了String类的valueOf方法。
valueOf方法内部又调用Object.toString方法:
public String toString(){
return getClass().getName() +"@" + Integer.toHexString(hashCode());
}
hashCode方法是本地方法,由JVM设计者实现: public native int hashCode();
三、方法覆盖
编写的代码:
1 package HomeTest; 2 3 public class override { 4 public static void main(String[] args) { 5 BBB b = new BBB(); 6 b.f1(); 7 b.f2(); 8 } 9 } 10 11 class AAA { 12 public void f1() { 13 System.out.println("A run!"); 14 } 15 } 16 17 class BBB extends AAA { 18 public void f1() { 19 System.out.println("B run!"); 20 } 21 22 public void f2() { 23 super.f1(); 24 } 25 }
结果如下:
四、在实践中理解把握复杂的知识
运行结果:
五、接口多态
1 package HomeTest; 2 3 public class TestDuotai { 4 5 public static void main(String[] args) { 6 Feeder feeder = new Feeder(); 7 feeder.feed(new lion()); 8 feeder.feed(new cat_1()); 9 } 10 } 11 12 class Feeder { 13 14 public void feed(Animal m) { 15 m.eat(); 16 } 17 } 18 19 interface Animal { 20 public void eat(); 21 } 22 23 class lion implements Animal { 24 public void eat() { 25 System.out.println("狮子要吃肉!"); 26 } 27 } 28 29 class cat_1 implements Animal { 30 public void eat() { 31 System.out.println("猫咪爱吃鱼!"); 32 } 33 }
运行结果: