动手动脑

一、动手实验:继承条件下的构造方法调用

代码

 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关键字来访问它。
如果子类被当作父类使用,则通过子类访问的字段是父类的!
牢记:在实际开发中,要避免在子类中定义与父类同名 的字段。不要自找麻烦!——但考试除外,考试 中出这种题还是可以的。

posted @ 2019-10-23 20:48  城南漠北  阅读(111)  评论(0编辑  收藏  举报