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

时间:2013-02-22 09:32:55

标签: 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();
    }
} 

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

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

5 个答案:

答案 0 :(得分:9)

编译器为Car提供有效的default constructor

Car() {
    super();
}

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

Vehicle() {
    super();
}

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

class Vehicle {
    public int a;

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

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

现在这样做有意义吗?

有关更详细的说明,请参阅section 15.9.4 of the Java language specification

答案 1 :(得分:2)

Car constructor被调用时,默认调用它的超级constroctor由编译器生成,然后初始化所有Super class's instance fields。在a field初始化期间,因为它调用具有sysout的func()方法,因此它会打印9。

public Car() {
super();// this invokes parent class's default cons
}

public Vehical() {
super();// invokes Object constructor then initializes all the instance variables of class vehical
}

答案 2 :(得分:1)

  1. JVM被告知必须构建Car
  2. JVM确定它是Vehicle,因此会触发Vehicle构造。
  3. JVM理解构造Vehicle需要初始化int a实例变量。
  4. int a变量必须初始化为调用func的结果,因此调用func
  5. func已被调用,因此代码打印“9”

答案 3 :(得分:1)

我认为你误解了Car c = new Car();的含义。

该语句创建一个对象引用,该对象的引用为c。语句new Car();创建一个对象,该对象的引用存储在c中。

答案 4 :(得分:0)

创建对象时,它会启动该对象中存在的所有实例变量。(如果未给出赋值,则为其变量的默认值)。

如果调用特定类( Car )的默认构造函数,则首先调用其超类( Vehicle )的默认构造函数。在创建Vehicle对象时,它的即时变量“a”被赋值给函数func()并且它将被执行,因此打印9。