为什么在Java中可以创建一个可见性低于父类的子类。
package 1
public class Class1 {
public Class1 hello(){
Class1 c= new Class2();
return c;
}
}
class Class2 extends Class1 {
public Class1 hello() {
System.out.println("In overriden method");
return null;
}
}
假设Class1和Class2都在同一个包中,Class2的可见性是包私有(private)的。
package 2
public class Major {
public static void main(String[] args) {
Class1 ob = new Class1();
ob.hello().hello();
}
}
您会注意到,由于运行时多态性,将打印“In overriden method”。
在运行时,当 Class2
位于具有包私有(private)可见性的不同包中时,如何从 main()
访问 Class2
的 hello()
方法?
Class2
不应被访问,因此 Class2
中的 hello(
) 方法也不应被访问。
最佳答案
protected
关键字(某种程度上类似于 package private)是一种保护代码不被外部使用的方法,这正是您的示例中发生的情况。您没有直接使用 Class2
,而是使用 Class1
,这授予您间接使用 protected Class2
的权利。
这是一个责任原则。 public Class1
负责授予外部包使用protected Class2
的权限。但这种责任也意味着 Class1
的开发人员必须知道为什么以及如何他授予您该权利。
您扩展Class1
这一事实在您的示例中没有任何实际意义,您的困惑可能来自于此。您无法从包外部实例化 Class2
,但 Class1
可以。
关于java - 为什么Java不限制子类的可见性大于父类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34232738/