在Java中实例化对象时到底发生了什么?

use*_*042 0 java constructor default-constructor

我知道在创建类的对象时,构造函数会构建该对象.说我有这两个类:

class Vehicle {
    public int a = func();

    public int func() { 
        System.out.println("9"); 
        return 9;
    }
}

class Car extends Vehicle  {

    public static void main(String[] args) {
        Car c = new Car();
    }
} 
Run Code Online (Sandbox Code Playgroud)

该项目的输出为"9".但为什么会这样呢?调用Car构造函数时到底发生了什么?我知道有一些类型的默认构造函数,但我不确定它是如何工作的.

有谁可以用上面的例子解释我的对象构造?

Jon*_*eet 9

编译器提供一个默认的构造函数Car这是有效的:

Car() {
    super();
}
Run Code Online (Sandbox Code Playgroud)

同样Vehicle作为默认构造函数:

Vehicle() {
    super();
}
Run Code Online (Sandbox Code Playgroud)

在调用超类构造函数之后,字段被初始化为初始化的一部分.所以就好像这个Vehicle类实际上是这样编写的:

class Vehicle {
    public int a;

    Vehicle() {
        super();
        a = func();
    }

    public int func() { 
        System.out.println("9"); 
        return 9;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在这有意义吗?

有关更详细的说明,请参阅Java语言规范的第15.9.4节.