我知道在创建类的对象时,构造函数会构建该对象。说我有这两个类:
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构造函数时到底发生了什么?我知道有一些类型的默认构造函数,但我不确定它是如何工作的。
有人可以用上面的例子向我解释对象构造吗?
答案 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)
Car
。Vehicle
,因此会触发Vehicle
构造。Vehicle
需要初始化int a
实例变量。int a
变量必须初始化为调用func
的结果,因此调用func
。func
已被调用,因此代码打印“9”。答案 3 :(得分:1)
我认为你误解了Car c = new Car();
的含义。
该语句创建一个对象引用,该对象的引用为c
。语句new Car();
创建一个对象,该对象的引用存储在c
中。
答案 4 :(得分:0)
创建对象时,它会启动该对象中存在的所有实例变量。(如果未给出赋值,则为其变量的默认值)。
如果调用特定类( Car )的默认构造函数,则首先调用其超类( Vehicle )的默认构造函数。在创建Vehicle对象时,它的即时变量“a”被赋值给函数func()并且它将被执行,因此打印9。