繁体   English   中英

在Java中实例化对象时,究竟发生了什么?

[英]What exactly happens when an object is instantiated in Java?

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

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

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

编译器为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节

Car constructor被调用时,其超级构造函数将由编译器进行默认调用,然后编译器会初始化所有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
}
  1. JVM被告知必须构造Car
  2. JVM确定它是Vehicle ,因此触发了Vehicle构造。
  3. JVM了解到, Vehicle的构造需要初始化int a实例变量。
  4. int a变量必须初始化是调用的结果func所以func被调用。
  5. func已被调用,因此代码显示为“ 9”

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

该语句创建一个对象引用,并且该对象的引用为c 声明new Car(); 创建一个对象,并将该对象的引用存储在c发送。

创建对象时,它将初始化该对象中存在的所有实例变量(如果未指定赋值,则返回其变量的默认值)。

如果调用了某个特定类( Car )的默认构造函数,则将首先对其父类( Vehicle )的默认构造函数进行调用。 并且在创建Vehicle对象时,将其即时变量“ a”分配给函数func()并将其执行,因此输出9。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM