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然后代码编译好没有错误.
那么,为什么是必要甚至构造是public或protected,而不是仅仅有默认的访问?
Dav*_*ebb 13
如果你想扩展它的包外的类必须有一个构造函数是public或protected因为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()无法解析默认构造函数中的调用.