我一直在阅读关于Java中构造函数的 article ,并遇到以下文本:
执行实例变量初始值设定项和实例初始值设定项 无论是否为超类构造函数,都会执行 调用实际上显示为显式构造函数调用 声明或自动提供。 (另一种构造函数 调用不执行此额外的隐式执行。)
关于括号中的句子,我有点不清楚。这是否意味着如果我们没有指定要显式调用的备用构造函数,它将不会被隐式调用为this()
,对吧?
答案 0 :(得分:4)
是。它说你总是会打电话给super()
构造函数作为构造函数中的第一个语句(除非你使用this()
,但是那将是super()
调用,因为它是第一个声明 - 或替代呼叫,最终将被调用super()
。
考虑在假设类的空构造函数中发生了什么,例如Main
带有String value
字段和三个构造函数,如
private String value;
public Main() {
this(10); // alternate constructor, super() isn't invoked yet.
}
public Main(int val) {
this(String.valueOf(val)); // alternate constructor, no super() yet
}
public Main(String str) {
// super(); // <-- will now implicitly or explicitly super()
this.value = str;
}
答案 1 :(得分:2)
Base s = new Base();
将自动调用Super()构造函数
但是像参数构造函数这样的替代构造函数实际上不会调用super();
您已明确调用超级类
中的super()
或super(argument)
Alternate构造函数还包含this(),它将调用Base()构造函数,该构造函数不允许执行super()构造函数,因此不会进行初始化