继承与多态课后作业
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子类之间不能转换。
结果截图: