欢迎来到刘瑞欣的博客

人生三从境界:昨夜西风凋碧树,独上高楼,望尽天涯路。 衣带渐宽终不悔,为伊消得人憔悴。 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。

继承与多态课后作业

1.

 1 class Grandparent {
 2 
 3     public Grandparent() {
 4 
 5         System.out.println("GrandParent Created.");
 6 
 7     }
 8 
 9     public Grandparent(String string)
10      {
11 
12         System.out.println("GrandParent Created.String:" + string);
13 
14     }
15 
16 }
17 
18 class Parent extends Grandparent 
19 {
20     public Parent() {
21         //super("Hello.Grandparent.");
22 
23         System.out.println("Parent Created");
24 
25        // super("Hello.Grandparent.");
26 
27     }
28 }
29 
30 class Child extends Parent 
31 {
32     public Child() 
33     {
34         System.out.println("Child Created");
35     }
36 }
37 public class TestInherits 
38 {
39 
40     public static void main(String args[])
41     {
42 
43         Child c = new Child();
44     }
45 
46 }    

结果截图:

修改之前:                                                                                                                                     修改之后:

   

 

 

 

 

 

 

 

 

在java语言的继承中,在执行子类的构造方法之前,会先调用父类没有参数的构造方法,其目的是为了要帮助继承自父类的成员做初始化操作。子类的构造方法通过super()来调用父类特定的构造方法(如果没有super语句还是会自动调用父类没有参数的构造方法),调用父类特定的构造方法的super语句必须写在子类构造方法的第一行,否则编译时出错,如果父类只定义了有参数的构造方法,而在子类中又没有用super关键字来调用父类的特定构造方法,则编译时出错。

 

2.

源代码:

 1 package jicheng;
 2 
 3 class Parent 
 4 {
 5     public void show()
 6     {
 7         System.out.println("Parent .");
 8     }
 9 }
10 
11 class Child extends Parent
12 {
13     public void show()
14     {
15         super.show();
16         System.out.println("Child ");
17     }
18 }
19 public class Test 
20 {
21 
22     public static void main(String[] args) 
23     {
24        Child c=new Child();
25        c.show(); 
26     }
27 }

运行结果截图:

 

(1)覆盖方法的允许访问范围不能小于原方法。

(2)覆盖方法所抛出的异常不能比原方法更多。

(3)声明为final方法不允许覆盖。

例如,Object的getClass()方法不能覆盖。

(4)不能覆盖静态方法。

 

 3.

 

程序运行结果(猜想):

Parent.printValue(),myValue=100

Child.printValue(),myValue=200

Child.printValue(),myValue=200

Child.printValue(),myValue=200

Child.printValue(),myValue=101

结果截图:

原因:在调用的时候,对象是子类的,就调用子类的方法,对象是父类的,就调用父类的方法。父类对象访问子类成员,调用相同的函数名的函数属于子类的;父类的变量进行相关的原算,但是,如果这时父类变量指向子类对象,继续调用得方法和变量仍然是子类覆盖后的新的变量和方法的。

但是如果代码顺序改变:

变为:

则结果为:

 

总结:

1.当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。

2.如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。如果子类被当作父类使用,则通过子类访问的字段是父类的!

 

 4.

 

 

第二行错误:编译错误,基类对象要赋给子类对象变量,必须执行类型转换(子类对象变量=(子类名)基类对象名;)

 

第四行错误:编译错误,对象之间不可赋值。

 

第五行错误:运行时错误, m已经转换成Dog, Dog和Cat子类之间不能转换。

 

 结果截图:

 

posted on 2017-11-10 07:44  吃藕八怪。  阅读(201)  评论(0编辑  收藏  举报