我想知道这里发生了什么:
我有抽象超类
public abstract class Superclass {
public Superclass()
{
doSth();
}
public abstract void doSth();
}
和子类
public class Subclass extends Superclass{
private int x = 10;
public void doSth()
{
System.out.println("Value x="+this.x);
}
}
当我做
Subclass x= new Subclass();
x.doSth();
我明白了:
Value x=0
Value x=10
我不知道为什么首先得到x = 0(为什么从一开始x = 10?)然后x = 10?
答案 0 :(得分:7)
超类的构造函数在子类的isntance初始化表达式之前执行,这就是x
在第一次调用doSth()
时仍然具有默认值0的原因。第二次调用x.doSth()
在Subclass
实例完全初始化后发生,因此x
包含10
。
更多详情:
当您致电Subclass
的建设者时,首先调用Superclass
的构造函数,该构造函数调用Object
的构造函数。然后执行Superclass
构造函数的主体,因此执行doSth()
。只有在完成Superclass
构造函数之后,才会评估Subclass
的实例初始化表达式(在您的情况下,赋值x = 10;
。在评估它们之前,x
仍然包含默认值 - 0,这是您第一次调用doSth()
时看到的值。