[英]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
}
Car
。 Vehicle
,因此触发了Vehicle
构造。 Vehicle
的构造需要初始化int a
实例变量。 int a
变量必须初始化是调用的结果func
所以func
被调用。 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.