0

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

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 构造函数时究竟会发生什么?我知道有某种类型的默认构造函数,但我不确定它是如何工作的。

谁能用上面的例子解释一下对象的构造?

4

5 回答 5

9

编译器提供了一个默认构造函数Car它实际上是:

Car() {
    super();
}

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

Vehicle() {
    super();
}

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

class Vehicle {
    public int a;

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

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

现在这有意义吗?

有关更详细的描述,请参阅Java 语言规范的第 15.9.4 节。

于 2013-02-22T09:35:27.603 回答
2

Car constructor被调用时,它的超级构造函数的默认调用由编译器进行,然后初始化所有Super class's instance fields. 在您的初始化期间,a field它调用func()具有 sysout 的方法,因此它打印 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
}
于 2013-02-22T09:35:00.617 回答
1
  1. JVM 被告知Car必须构造 a。
  2. JVM 确定它是 aVehicle并因此触发Vehicle构造。
  3. JVM 理解 a 的构造Vehicle需要初始化int a实例变量。
  4. 必须将int a变量初始化为调用funcso的结果func
  5. func已被调用,因此代码打印出"9"
于 2013-02-22T09:39:25.233 回答
1

我想你误解了 的意思Car c = new Car();

该语句创建一个对象引用,该对象的引用是c. 该语句new Car();创建一个对象,并且该对象的引用存储在c.

于 2013-02-22T09:43:23.183 回答
0

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

If a default constructor of a particular class(Car) is called, a call to the default constructor of its super class(Vehicle) is made first. And while creating Vehicle object its instant variable "a" is assigned to function func() and it ll be executed, Hence printing 9.

于 2013-02-22T10:14:21.923 回答