一、动手实验:继承条件下的构造方法调用
代码
1 class Grandparent 2 { 3 4 5 public Grandparent() 6 { 7 8 System.out.println("GrandParent Created."); 9 10 } 11 12 13 public Grandparent(String string) 14 { 15 16 System.out.println("GrandParent Created.String:" + string); 17 18 } 19 20 } 21 22 23 24 class Parent extends Grandparent 25 { 26 27 28 public Parent() 29 { 30 31 //super("Hello.Grandparent."); 32 33 System.out.println("Parent Created"); 34 35 // super("Hello.Grandparent."); 36 37 } 38 39 } 40 41 42 43 class Child extends Parent 44 { 45 46 47 public Child() 48 { 49 50 System.out.println("Child Created"); 51 52 } 53 54 } 55 56 57 58 public class Text 59 { 60 61 62 public static void main(String args[]) 63 { 64 65 Child c = new Child(); 66 67 } 68 69 }
运行结果:
GrandParent Created.
Parent Created
Child Created
结论:
通过 super 调用基类构造方法,必须是子类构造方法中的第一个语句。
二、请自行编写代码测试以下特性(动手动脑):
在子类中,若要调用父类中被覆盖的方法,可以使用super关键字。
代码
1 class Father 2 { 3 public void multiplication(double a,double b) 4 { 5 System.out.println("父类的函数:"+a+"*"+b+"="+a*b); 6 } 7 } 8 9 class Me extends Father 10 { 11 public void multiplication(double a,double b) 12 { 13 super.multiplication(a+1, b+2); 14 System.out.println("父类的函数:"+a+"*"+b+"="+a*b); 15 16 } 17 } 18 19 public class TestInherit 20 { 21 public static void main(String[] args) 22 { 23 Me a=new Me(); 24 a.multiplication(1,1.2); 25 } 26 }
三、 左边的程序运行结果是什么?
你如何解释会得到这样的输出?
计算机是不会出错的,之所以得
到这样的运行结果也是有原因的,
那么从这些运行结果中,你能总
结出Java的哪些语法特性?
当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。
这个特性实际上就是面向对象“多态”特性的具体表现。
如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。
如果子类被当作父类使用,则通过子类访问的字段是父类的!
牢记:在实际开发中,要避免在子类中定义与父类同名 的字段。不要自找麻烦!——但考试除外,考试 中出这种题还是可以的。