我正在学习java并且偶然地遇到了以下代码,其中在方法之后执行默认构造函数.
public class ChkCons {
int var = getVal();
ChkCons() {
System.out.println("I'm Default Constructor.");
}
public int getVal() {
System.out.println("I'm in Method.");
return 10;
}
public static void main(String[] args) {
ChkCons c = new ChkCons();
}
}
输出:
I'm in Method. I'm Default Constructor.
有人可以解释一下为什么会这样吗?
谢谢.
Era*_*ran 40
实例变量初始化表达式,例如int var = getVal();在执行超类构造函数之后但在执行当前类构造函数体之前计算.
因此getVal()在ChkCons执行构造函数体之前调用.
在方法之前调用构造函数.方法的执行发生在之后,它是对象创建的一部分,其中评估实例变量.从以下代码可以更好地理解这一点.
class SuperClass{
SuperClass(){
System.out.println("Super constructor");
}
}
public class ChkCons extends SuperClass{
int var = getVal();
ChkCons() {
System.out.println("I'm Default Constructor.");
}
public int getVal() {
System.out.println("I'm in Method.");
return 10;
}
public static void main(String[] args) {
ChkCons c = new ChkCons();
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码有以下输出
Super constructor
I'm in Method.
I'm Default Constructor.
Run Code Online (Sandbox Code Playgroud)
这里编译器自动添加super();为ChkCons()构造函数中的第一个语句,因此在getVal()方法之前调用它.