为什么Java类构造函数必须是公共的或受保护的,以便将类扩展到其包之​​外?

whi*_*hat 6 java inheritance constructor default access-modifiers

以下是我的ProtectedConstructor.java源代码:

package protectCon;

public class ProtectedConstructor{
    public int nothing;
    ProtectedConstructor(){
        nothing = 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是UsingProtectedCon.java来源:

package other;

import protectcon.ProtectedConstructor;

public class UsingProtectedCon extends ProtectedConstructor{   //**Line 4**
    public static void main(String... a) {  
    }
}
Run Code Online (Sandbox Code Playgroud)

当我编译时UsingProtectedCon.java,我在上面的第4行得到错误.它说ProtectedConstructor()不公开; 所以不能在包外访问.

但是,由于我的班级是公开的,我不应该将其扩展到包外.无论如何我不创建它的任何实例.

现在,如果我将ProtectedConstructor类的构造函数作为public或者protected然后代码编译好没有错误.

那么,为什么是必要甚至构造是publicprotected,而不是仅仅有默认的访问?

Dav*_*ebb 13

如果你想扩展它的包外的类必须有一个构造函数是publicprotected因为Java中的每个构造函数必须调用其超类的构造函数.

因此,super()每个构造函数中都有一个隐含的调用,它没有this()或显式调用它super()作为它的第一个语句.如果你没有指定一个构造函数,Java将添加一个默认的无参数构造函数,所以实际上你的代码如下所示:

public class UsingProtectedCon extends ProtectedConstructor {
    public UsingProtectedCon() {
        super();
    }

    public static void main(String... a) {   
    }
}
Run Code Online (Sandbox Code Playgroud)

换句话说,您的代码无法编译,因为super()无法解析默认构造函数中的调用.