关于孙子课的能见度

时间:2017-12-30 11:12:54

标签: java

我有以下代码:

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()因为我从子类调用它并且它受保护(对子类可见)!!

谢谢!

2 个答案:

答案 0 :(得分:1)

您不能削弱父类的权限。由于来自met2()的{​​{1}}具有Father,您可以使用protectedprotected覆盖它。

由于您未指定任何权限访问权限,因此默认为public,这是一个弱于package protected的级别。

这是语言本身的限制,并遵循Liskov substitution principle (LSP)

<强>更新

如果protected与&#34;孩子&#34;位于不同的包中,则需要将Father声明为公开,以便能够从您的子类访问

答案 1 :(得分:0)

这是因为在覆盖时无法降低子类方法的可见性。

因为m2()类中的Father受到保护。 m2()类中的GrandChild不能具有默认访问说明符。它应该是公共的或受保护的,但不是默认的,因为它会降低子类的可见性。