Java - 在Default Constructor之前执行的方法

Roh*_*gam 30 java constructor

我正在学习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执行构造函数体之前调用.


pra*_*mar 6

在方法之前调用构造函数.方法的执行发生在之后,它是对象创建的一部分,其中评估实例变量.从以下代码可以更好地理解这一点.

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()方法之前调用它.