观点:
父类构造函数 -> 子类属性按照声明顺序初始化 -> 子类构造函数。
代码:
class ClassA {
public ClassA(int v){
System.out.println("ClassA(int v) v = " + v);
init(v);
}
public ClassA(ClassA a){
System.out.println("ClassA(ClassA a) a = " + a);
init(a);
}
public void init(int v){
System.out.println("ClassA init(int v) v = " + v);
}
public void init(ClassA a){
System.out.println("ClassA init(ClassA a) a = " + a);
}
}
class ClassB extends ClassA {
int v = 1;
ClassA a = new ClassA(3);
public ClassB(){
super(2);
System.out.println("ClassB () this.v = " + this.v);
}
public ClassB(ClassA a){
super(a);
System.out.println("ClassB(ClassA a) a = " + a);
System.out.println("ClassB(ClassA a) this.a = " + this.a);
}
@Override
public void init(int v) {
this.v = v;
System.out.println("ClassB init(int v) this.v = " + this.v);
}
@Override
public void init(ClassA a) {
this.a = a;
System.out.println("ClassB init(ClassA a) this.a = " + this.a);
}
}
public class HelloWord
{
public static void main(String args[])
{
ClassB c = new ClassB();
System.out.println("main c.v = " + c.v);
ClassA a = new ClassA(4);
System.out.println("main a = " + a);
ClassB cc = new ClassB(a);
System.out.println("main cc.a = " + cc.a);
}
}
运行结果:
ClassA(int v) v = 2
ClassB init(int v) this.v = 2
ClassA(int v) v = 3
ClassA init(int v) v = 3
ClassB () this.v = 1
main c.v = 1
ClassA(int v) v = 4
ClassA init(int v) v = 4
main a = ClassA@7852e922
ClassA(ClassA a) a = ClassA@7852e922
ClassB init(ClassA a) this.a = ClassA@7852e922
ClassA(int v) v = 3
ClassA init(int v) v = 3
ClassB(ClassA a) a = ClassA@7852e922
ClassB(ClassA a) this.a = ClassA@4e25154f
main cc.a = ClassA@4e25154f
得出结论:首先,运行父类的构造函数。
其次,按照声明顺序,运行子类属性的初始化操作。
最后,运行子类的构造函数。
这样,也保证在构造函数中给属性赋值是有效的。
推翻观点“构造方法执行完毕,才进行属性的初始化操作”。
也证明了“构造函数是实例化对象的最后一个操作”。