Java使用默认构造函数继承公共类

时间:2017-02-02 12:41:16

标签: java

我只是在类ConstructorOne中继承类ConstructorTwo,而不是创建任何对象(显式至少)。那么为什么ConstructorTwo类中的构造函数必须是公共的?

我收到此错误:ConstructorTwo()在ConstructorTwo中不公开;无法从外包装

访问
package one;

import two.ConstructorTwo;

public class ConstructorOne extends ConstructorTwo {

    public static void main(String args[]) {

    }
}


package two;

public class ConstructorTwo {

    ConstructorTwo() { 
        super(); 
        System.out.println("Default constructor in package TWO!");
    }
}

4 个答案:

答案 0 :(得分:2)

它必须是公共的原因是因为当Java调用任何构造函数时,它必须在调用子类构造函数中的任何代码之前调用超类构造函数。如果Java由于隐私错误而无法访问超类构造函数,那么它就无法执行超类构造函数,这是调用任何构造函数所需的操作(根据Java)。这就是它必须公开的原因。

答案 1 :(得分:1)

ConstructorOne中的默认构造函数调用super();,它是类ConstructorTwo中的默认构造函数。在调用方法或构造函数或通过包边界访问字段时,它们需要公开。

答案 2 :(得分:0)

ConstructorOne类有一个自动生成的公共构造函数,它不带参数,并调用super()。实际上,这个:

public ConstructorOne() {
    super();
}

如果您不自己编写构造函数,则所有类都隐式具有这样的构造函数。因此,需要有一个可用的构造函数来调用超类(在这种情况下,它必须是publicprotected才能被另一个包中的子类访问。)

答案 3 :(得分:0)

当构造函数公开时,任何人都可以调用它。当构造函数是私有的时,通常意味着您需要以其他方式构造对象,通常使用作者为此目的创建的另一个公共静态方法。