子类是否需要构造函数?

zay*_*ynv 6 java subclass superclass

我一直在学习继承,我只是好奇.我知道即使你不使用super()运算符,子类也会自动调用超类的构造函数,所以我想知道子类是否有必要在其中包含构造函数.

Ted*_*opp 14

如果超类没有默认构造函数(或者具有子类无法访问的构造函数),则子类需要构造函数.如果子类根本没有构造函数,编译器将自动创建一个public构造函数,它只是调用超类的默认构造函数.

关于调用super():每个构造函数必须做的第一件事是通过调用this()(可能带有一些参数)在同一个类中调用不同的构造函数,或者通过调用super()(再次,可能带参数)来调用其超类的构造函数.这些电话都不能去其他任何地方.如果构造函数不以任何一个开头,编译器将自动插入一个调用super()(没有任何参数).因此,如果您想要的行为是调用默认的超类构造函数(并且很多次,它是),那么您不需要显式调用super()自己.

还有一种情况是,即使超类没有默认构造函数,也不需要提供构造函数(事实上,你不能提供构造函数).这种情况(在Java语言Sepcification的第15.9.5.1节中描述)是使用非默认构造函数创建类的匿名子类时.编译器将自动创建具有正确参数的构造函数,并调用相应的(非默认)超类构造函数.例如:

class X {
    public X(int value) { ... } // no default constructor!
    public void foo() { ... }
}

X myX = new X(3) {
    @Override
    public void foo() { ... }
};
Run Code Online (Sandbox Code Playgroud)

然后myX将是X的匿名子类的实例,其中包含编译器生成的构造函数,该构造函数接受int参数和调用super(intArg).