我来自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访问它。

07-26 07:44