有两个构造函数的目的是什么,一个调用super(),另一个调用自己对象的参数


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构造函数。

最新更新