我正在从演讲幻灯片中做一些修改,它说构造函数以下列方式执行:
如果构造函数以此开头,则递归执行指示的构造函数,然后转到步骤4.
调用显式或隐式指示的超类构造函数(除非此类为java.lang.Object
)。
按照在此类中声明对象的顺序初始化对象的字段。
执行此构造函数的其余部分。
我不明白的是,构造函数永远不能“启动”,因为即使它没有形成类层次结构/关系,默认情况下也会插入super()。
这如何符合上述说明?
答案 0 :(得分:8)
构造函数(对于除java.lang.Object之外的每个类)必须以“super()”开头,调用其超类'构造函数或“this()”,以调用同一个类的另一个构造函数。如果在构造函数中没有包含其中任何一个,编译器将插入对super()的调用。构造函数可以从调用同一个类中的另一个构造函数开始,只要最终调用类中的构造函数来调用超类构造函数。
答案 1 :(得分:2)
我不认为你是对的,或者我不明白这个问题。来自Java Language Spec:
如果构造函数体不以显式构造函数开头 调用和构造函数 声明不是原始的一部分 class Object,然后是构造函数 身体被隐含地假设了 编译器以超类开头 构造函数调用“super();”,an 调用它的构造函数 没有的直接超类 参数。
因为这样的构造函数可以从this(...)
开始,它调用同一个类的另一个构造函数。只有当调用的构造函数不以this(...)或super(...)开头时,才会自动调用super()。
我要说的是,在构造一个对象之后,调用了super(...)(如果该类不是java.lang.Object)。
答案 2 :(得分:2)
这里使用this(...)
public class Car {
private final int numberOfDoors;
public Car(int doors) {
numberOfDoors = doors;
}
public Car() {
this(4); // default is 4 doors, calls the constructor above
}
}
答案 3 :(得分:0)
构造函数体中的第一个语句应该是this或super,如果没有,那么defalt的编译器会保留一个super()关键字(没有参数)。 所以构造函数体以这种方式执行:
执行将基于this或super关键字,然后
它将执行所有IIB(作为自上而下的方法),然后
它将执行程序员保存的所有语句(如sop,initilization)
Class A{
A() {
this(10); //or super,....... execution statement 1
// executing IIB's, execution statement 2
System.out.println("from A()"); // execution statement 3
}
A(int i) {
System.out.println("from A(int)");
}
{
System.out.println("from IIB-1");
}
public static void main(String[] args){
A a = new A(); //calling constructor A()
System.out.println("from main");
}
{
System.out.println("from IIB-2");
}
}
输出:
from IIB-1
from IIB-2
from A(int)
from A()
from main