java语言课堂动手动脑

99封情书 提交于 2019-12-02 02:56:34

1

运行 TestInherits.java 示例,观察输出,注意总结父类与子类之间构造方法的调用关系修改Parent构造方法的代码,显式调用GrandParent的另一个构造函数,注意这句调用代码是否是第一句,影响重大!

代码如下

 

 1 package testInherits;
 2 
 3 class Grandparent 
 4 {
 5 
 6 
 7     public Grandparent()
 8      {
 9 
10             System.out.println("GrandParent Created.");
11     
12 }
13 
14 
15     public Grandparent(String string) 
16     {
17 
18             System.out.println("GrandParent Created.String:" + string);
19     
20  }
21 
22 }
23 
24 
25 
26 class Parent extends Grandparent
27 {
28 
29 
30     public Parent()
31      {
32 
33             //super("Hello.Grandparent.");
34 
35             System.out.println("Parent Created");
36     
37        //super("Hello.Grandparent.");
38 
39       }
40 
41 }
42 
43 
44 
45 class Child extends Parent 
46 {
47 
48 
49     public Child()
50      {
51     
52         System.out.println("Child Created");
53 
54       }
55 
56 }
57 
58 
59 
60 public class TestInherits 
61 {
62 
63 
64     public static void main(String args[])
65      {
66 
67             Child c = new Child();
68     
69   }
70 
71 }

 

 

 

第一个是将两个super注释掉

 

 

 

 这是将第二个注释掉

 

 

这是将第一个注释掉的结果

 

 

 

结论:通过 super 调用基类构造方法,必须是子类构造方法中的第一个语句。如果不是则会出现错误。

 

 

2.

为什么子类的构造方法在运行之前,必须调用父类的构造方法?能不能反过来?为什么不能反过来?

构造函数是一种特殊的构造方法,在创建对象的时候初始化对象,构造一个对象,先调用其构造方法,而子类拥有父类的成员变量,如果不先调用父类的构造方法,则子类的成员变量也不能正确的初始化,不能反过来是因为,子类继承父类会由多得成员变量,而反过来,父类压根不知道子类有什么成员变量,构造方法就会出错,因此如果反过来,也是错误的。

用反编译结果如图:

 

 

 

 

 

 

 

 

3

参看ExplorationJDKSource.java示例
此示例中定义了一个类A,它没有任何成员:
class A { }
示例直接输出这个类所创建的对象
 public static void main(String[] args)    {
  System.out.println(new A());
}

 

在“+”运算中,当任何一个对象与一个String对象,连接时,会隐式地调用其toString()方法,默认情况下,此方法返回“类名 @ + hashCode”。为了返回有意义的信息,子类可以重写toString()方法

 

 

4

请自行编写代码测试以下特性(动手动脑):
在子类中,若要调用父类中被覆盖的方法,可以使用super关键字。

代码如下:

 1 package test;
 2 
 3 class Pa 
 4 {
 5     int x;
 6     public Pa()
 7     {
 8         
 9             System.out.println("Parent Created1");
10       }
11     public void show(){
12         System.out.println("Parent Created2");
13     }
14 
15 }
16 
17 
18 
19 class Ch extends Pa
20 {
21     int y;
22     public Ch()
23      {
24     
25         System.out.println("Child Created1");
26 
27       }
28     public void show(){
29         super.show();
30         System.out.println("Parent Created3");
31     }
32 
33 }
34 
35 
36 
37 public class text 
38 {
39 
40 
41     public static void main(String args[])
42      {
43 
44             Ch c = new Ch();
45     c.show();
46   }
47 
48 }

 

 

 

 

 

 

 5

 

 

1.   左边的程序运行结果是什么?
2.   你如何解释会得到这样的输出?
3.   计算机是不会出错的,之所以得
  到这样的运行结果也是有原因的,
  那么从这些运行结果中,你能总
  结出Java的哪些语法特性?

 请务必动脑总结,然后修改或编写一些代码进行测试,验证自己的想法,最后再看 后面的PPT给出的结论。
运行结果:
 

 

 当子类与父类拥有一样的方法,再调用时看对象是什么类型的就调用什么类型的方法。如果具有相同的字段,子类方法中访问的是子类的字段,如果想访问父类的字段则可以用,super方法来实现。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!