在多级继承下,创建子类对象时将从继承树的最上层的父类开始,依次执行各个类的构造方法,这可以保证子类所有的对象从所有 的直接或间接父类中继承的实例变量都被正确的初始化。
看到下面的例程,我有一些疑惑
package test.java; class Base{ private int a; public Base(int a){ this.a=a; } public int getA(){ return this.a; } } public class Sub extends Base{ private int b; public Sub(int a,int b){ super(a); this.b=b; } public int getB(){ return this.b; } public static void main(String[] args) { Sub sub=new Sub(1,2); System.out.println(sub.getA()+" "+sub.getB()); } }
要是Sub中咩有 调用super方法,那不是只能初始化b而没有初始化a 吗 ?(我之前看到的很多程序里并没有写这个语句) ,额、、其实往后面看书上是讲了这个情况的。
如果子类的构造方法没有用super语句显式的调用父类的构造方法,那么JV会自动调用父类的默认构造方法。
那如果父类没有默认构造方法(而且其他的构造方法也都没有),jv 就会调用那个自动提供的隐含的默认构造方法咯,这个隐含的默认构造方法啥也没有做啊,还是不能初始化a的吧
额、、、后面书上又讲了
当子类没有用super语句显式的调用父类的构造方法,而且父类没有提供默认的构造方法是,讲出现编译错误 。
soga,刚刚试验了一下确实如此。
其实,之前还有个地方没有注意到,Base中的a是private型的,Sub并不会继承这个private型的属性,那a要是没有初始化也没事咯??反正a又不是Sub的属性。但是试验一下是编译错误,额,那它这句话的意思是不是完整的继承树一路下来每个类的对象的属性值都要初始化? 先留个坑在这里 。