我想知道这里发生了什么:
我有抽象父类(super class)
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?
最佳答案
父类(super class)的构造函数在子类的实例初始化表达式之前执行,这就是为什么x
在第一次调用doSth时仍然具有默认值0 ()
。第二次调用 x.doSth()
发生在 Subclass
实例完全初始化之后,因此 x
包含 10
.
更多详细信息:
当你调用Subclass
的构造函数时,它首先调用Superclass
的构造函数,而Superclass
又调用Object
的构造函数。然后执行Superclass
构造函数的主体,因此执行doSth()
。仅在 Superclass
构造函数完成后,Subclass
的实例初始化表达式(在您的情况下,赋值 x = 10;
才会被评估。之前它们被评估后,x
仍然包含默认值 - 0,这是您在第一次调用 doSth()
时看到的打印值。
关于Java抽象类构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35348504/