Java使用包私有构造函数继承公共类 我来自C++背景,我只是通过java中的访问修饰符,我决定玩一些代码,现在我得到一个错误:

Java使用包私有构造函数继承公共类 我来自C++背景,我只是通过java中的访问修饰符,我决定玩一些代码,现在我得到一个错误:,java,inheritance,visibility,Java,Inheritance,Visibility,YouArePublic()在YouArePublic中不是公共的;无法从中访问 外包装 我不知道为什么。我知道YouArePublic类中的构造函数是默认的,因此我不能在它自己的包之外的任何其他类中创建它的对象,但我并不是在这里真正创建对象 编译器是否隐式尝试创建Tester类的对象,从而调用其默认的无参数构造函数,然后使用super()调用其超类YouArePublic的构造函数?但是main()是静态的,因此不需要创建类的实例来调用它 我不确定这里发生了什么,真的需要一些帮助 packag

YouArePublic()在YouArePublic中不是公共的;无法从中访问 外包装

我不知道为什么。我知道YouArePublic类中的构造函数是默认的,因此我不能在它自己的包之外的任何其他类中创建它的对象,但我并不是在这里真正创建对象

编译器是否隐式尝试创建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
无法实例化。

您的主方法可能是静态的,但这只意味着可以在不先实例化对象的情况下调用它。在主方法中,您正在创建一个对象:

Tester ot = new Tester();
如果您自己没有显式定义构造函数,那么编译器会使用
super()
调用生成一个隐式默认构造函数,这是正确的。看起来是这样的:

public Tester() {
    super();
}

这意味着它尝试调用构造函数
YouArePublic(){super();}
,该构造函数具有默认可见性,也称为包私有。由于
YouArePublic
位于另一个包中,因此无法从
Tester

访问它。您只能对静态方法进行静态调用。因此,不需要初始化。但在这里,您并没有进行静态调用,父类方法也不是静态的。为此,您应该修改父类,如下所示(但仅此一点不足以编译该类)

异常原因: 创建子类的对象时,首先调用父类的构造函数,然后调用子类的构造函数。对于编译器,您的代码与下面显示的代码相同

class Tester extends YouArePublic { 
    public Tester(){
        super();
    }

    public static void main(String args[]) {
        Tester ot = new Tester();
        ot.displayMessage();    
    }
}
在您的情况下,无法完成对超级构造函数的调用,因为父构造函数的可见性为“默认”,并且仅对同一包中的类可见


如果不向父类添加任何构造函数,编译器将假定它具有公共默认构造函数。您正在通过创建自己的构造函数来限制这一点。

您能解释一下为什么我需要将Tester公开吗?我在Tester中访问YouArePublic,它是公共的,所以我可以在包1中访问它。非常感谢!不知何故,我忽略了Tester ot=new Tester()。
package one;

import two.YouArePublic;

class Tester extends YouArePublic { // Inheritance in different package
    public static void main(String args[]) {    
        Tester.displayMessage();   //No object created 
    }
}   

package two;

public class YouArePublic {
    String message = "You are public in package TWO!";

    YouArePublic() { super(); }    

    public void static displayMessage() { //static modifier added
        System.out.println(message);
    }    
}
class Tester extends YouArePublic { 
    public Tester(){
        super();
    }

    public static void main(String args[]) {
        Tester ot = new Tester();
        ot.displayMessage();    
    }
}