我有以下代码:
package pack1;
public class Father {
public String met1(){
return "c ";
}
protected String met2(){
return "b "+met1();
}
}
package pack2;
import pack1.Father;
class Child extends Father {
public String met1(){
return "a ";
}
}
class GrandChild extends Child {
public String met2(){
return super.met2() + "z" ;
}
public static void main(String[] args){
Father f = new GrandChild();
System.out.println(f.met2()); // Compile error here
}
}
当我致电met2()
时,它会执行GrandChild
中实现的版本,调用super.met2()
,因此它执行了在Child中实现的版本(即父亲的版本)版本,因为Child没有实现met2()
)。但是为什么编译器说" met2()
不可见"如果我从GrandChild(父亲的子类,间接地)调用它,当met2()
被"保护"?它应该识别met2()
因为我从子类调用它并且它受保护(对子类可见)!!
谢谢!
答案 0 :(得分:1)
您不能削弱父类的权限。由于来自met2()
的{{1}}具有Father
,您可以使用protected
或protected
覆盖它。
由于您未指定任何权限访问权限,因此默认为public
,这是一个弱于package protected
的级别。
这是语言本身的限制,并遵循Liskov substitution principle (LSP)
<强>更新强>
如果protected
与&#34;孩子&#34;位于不同的包中,则需要将Father
声明为公开,以便能够从您的子类访问1} p>
答案 1 :(得分:0)
这是因为在覆盖时无法降低子类方法的可见性。
因为m2()
类中的Father
受到保护。
m2()
类中的GrandChild
不能具有默认访问说明符。它应该是公共的或受保护的,但不是默认的,因为它会降低子类的可见性。