繁体   English   中英

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

[英]Java inheriting public class with default constructor

我只是继承了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!");
    }
}

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

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

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

public ConstructorOne() {
    super();
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM