动手动脑(四)
1,继承条件下的构造方法调用
class Grandparent { public Grandparent() { System.out.println("GrandParent Created."); } public Grandparent(String string) { System.out.println("GrandParent Created.String:" + string); } } class Parent extends Grandparent { public Parent() { //super("Hello.Grandparent."); System.out.println("Parent Created"); // super("Hello.Grandparent."); } } class Child extends Parent { public Child() { System.out.println("Child Created"); } } public class TestInherits { public static void main(String args[]) { Child c = new Child(); } }
运行结果:
package pers.liqin.shiyan.java; class Grandparent { public Grandparent() { System.out.println("GrandParent Created."); } public Grandparent(String string) { System.out.println("GrandParent Created.String:" + string); } } class Parent extends Grandparent { public Parent() { super("Hello.Grandparent."); System.out.println("Parent Created"); // super("Hello.Grandparent."); } } class Child extends Parent { public Child() { System.out.println("Child Created"); } } public class TestInherits { public static void main(String args[]) { Child c = new Child(); } }
运行结果:
总结:子类的构造方法在运行之前,必须调用父类的构造方法;通过super调用基类构造方法,必须是子类构造方法中的第一个语句。
2,类型转换知识点考核2:
错误语句:
d=m;
原因:m为父类对象,d为子类对象,父类对象赋值给子类对象时需进行强制类型转换。
d=c;
原因:d和c虽然都为子类对象,但不属于同一类型,不能赋值。
3,
回答问题:
1上述的程序运行结果是什么?
2.你如何解释会得到这样的输出?
3.计算机是不会出错的,之所以得到这样的运行结果也是有原因的,那么从这些运行结果中,你能总结出Java的哪些语法特性?
结果截图:
原因分析
首先创建父类对象parent,调用父类方法printvalue(),输出100;然后创建子类对象child,调用子类方法printvalue(),输出200;将子类对象赋值给父类对象,调用parent.printvalue()相当于调用child.printvalue();所以输出200;虽然把子类对象赋值给父类对象,但被赋值后的父类对象对数据成员的操作依然是对父类的数据成员进行操作,所以parent.myvalue++是将父类的myvalue值加1,对子类的myvalue值没有影响,所以最后输出200,((child)parent).myvalue++却使用了强制类型转换,则对子类的myvalue值进行操作,而在上面parent已经被子类对象,所以输出201。
Java语法特性
⑴当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。
⑵如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。