[英]Java Inheriting a public class with Package Private Constructor
[英]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();
}
如果您自己不编写构造函数,则所有类都隐式具有此类构造函数。 因此,确实需要在父类中调用一个可用的构造函数(在这种情况下,它必须是public
或protected
才能被另一个包中的子类访问)。
当构造函数公开时,任何人都可以调用它。 当构造函数是私有的时,通常意味着您需要以其他某种方式构造对象,通常使用作者为此目的创建的另一个公共静态方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.