我来自C ++背景,我刚经历过Java中的Access-Modifiers,所以我决定尝试一些代码,现在遇到错误:
YouArePublic()在YouArePublic中不公开;无法从访问
外包装
我不知道为什么。我知道类YouArePublic中的Constructor是默认的,因此我无法在其自身包之外的任何其他类中创建它的对象,但是我并不是在这里真正创建对象。
编译器是否隐式尝试创建Tester类的对象,从而调用其默认的无参数构造函数,然后使用super()调用其超类YouArePublic的构造函数?但是main()是静态的,因此不需要创建该类的实例来调用它。
我不确定这里发生了什么,真的需要一些帮助。
package one;
import two.YouArePublic;
class Tester extends YouArePublic { // Inheritance in different package
public static void main(String args[]) {
Tester ot = new Tester();
ot.displayMessage();
}
}
package two;
public class YouArePublic {
String message = "You are public in package TWO!";
YouArePublic() { super(); }
public void displayMessage() {
System.out.println(message);
}
}
最佳答案
您的主方法可能是静态的,但这仅意味着可以在不首先实例化对象的情况下调用它。在您的主要方法中,您正在创建一个对象:
Tester ot = new Tester();
如果您自己没有显式定义构造函数,那么编译器通过
super()
调用生成隐式默认构造函数是正确的。看起来像这样:public Tester() {
super();
}
这意味着它将尝试调用具有默认可见性(也称为包私有)的构造函数
YouArePublic() { super(); }
。由于YouArePublic
在另一个程序包中,因此无法从Tester
访问它。