public class SuperClassTest {
private int id;
SuperClassTest(){
super();
}
public SuperClassTest(SuperClassTest sct){
this.id=sct.id;
}
public int getId() {
return this.id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return "SUPERCLASS ID" + id;
}
}
在第一种情况下调用super是无用的。事实上,除非扩展一个类,否则(所有类都隐式扩展Object.)调用super()
将毫无用处。
SuperClassTest(){
super();
}
如果构造函数以显式调用超类构造函数开始
( a super() invocation)
,其构造函数将调用相应的超类构造函数。
例如,如果构造函数以显式调用"super(int,String)构造函数"开始,则相应的构造函数将以调用超类的"(int,String)"构造函数开始。
如果构造函数不是以显式this()或super()调用开始,则默认情况下,相应的构造函数将调用超类的无参数构造函数。
您的第二个构造函数,即采用自己类型的参数的构造函数,是复制构造函数。它正在将新对象初始化为与传递给它的对象相同的状态。
现在,由于您已经定义了此构造函数,编译器将不再为类提供默认无参数构造函数。这就是为什么现在必须显式指定SuperClassTest()
构造函数的原因。
然而,在这里提供对super();
的显式调用是不必要的,因为编译器会在它丢失的情况下自动添加它。当父类需要一些构造函数参数时,可以指定super
构造函数调用。编译器无法代表您进行调用,因为它无法猜测应该将哪些值传递给super
构造函数。