继承与多态
1.
package reserve; 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 Main { public static void main(String args[]) { Child c = new Child(); } }
构造一个对象,先调用其构造方法,来初始化其成员函数和成员变量。
子类拥有父类的成员变量和成员方法,如果不调用,则从父类继承而来的成员变量和成员方法得不到正确的初始化。
不能反过来调用也是这的原因,因为父类根本不知道子类有什么变量而且这样一来子类也得不到初始化 的父类变量,导致程序运行出错。
2.不可变类是指,一旦一个类的对象被创建出来,在其整个生命周期中,它的成员变量就不能被修改,java平台的类库中包含许多不可变的类,比如说String,基本类型的包装类,BigInteger和BigDecimal,存在不可变的类有许多理由:不可变的类比可变的类更加容易设计,实现和使用,它们不容易出错,而且更加安全。
3.在子类中若要调用父类中被覆盖的方法,可以使用super关键字
4.下面哪一个会导致程序运行时错误?
m=d; d=m; d=(Dog)m; d=c; c=(Cat)m;
先进行自我判断,得出结论后,运行相关代码,看看你的判断是否正确。
自我判断:"d=m","d=c"引起编译错误
“c=(Cat)m”引起运行时错误
原因:“d=m”编译错误是因为Mammal类是Dog类的父类,子类中的成员比父类的多,父类无法将子类初始化;
“d=c”编译错误是因为两者代表不同的类,不能给对方赋值;
“c=(Cat)m”会引起运行时错误是因为Dog类的对象d已将Mammal类的对象m初始化,m被转换为Dog类后不能再转换为Cat类。