与Java混淆覆盖访问级别
可能重复:
为什么不能降低java子类中方法的可见性?
为什么我可以在子类中使用public
覆盖超类中的private
方法,但是我不能将超类中的public
方法重写为子类中的private
方法?
为什么?
先谢谢你。
覆盖方法不能降低可见性。 允许这样做会违反Liskov替换原则 ,该原则声明(简化)派生类B
所有对象必须具有与基类A
相同的属性。 在这种情况下,一个这样的“属性”将是一个公共方法foo
,如果B
具有相同的方法,它将被“丢失”,但使其protected
。
此外,由于private
方法不是inheritance的(尝试从派生类调用它!)它们不能被覆盖。 您可以在基类中使用与private
方法同名的public
方法,但这不是覆盖,它只是一个具有相同名称的新方法,而不是其他关系。 调用基类中的private
方法不会调用超类中的public
方法,即使在超类的对象上执行也是如此!
换句话说: private
方法永远不会使用运行时多态。
看这个样本:
public static class Base { public void callBoth() { foo(); bar(); } private void foo() { System.out.println("Base.foo"); } protected void bar() { System.out.println("Base.bar"); } } public static class Sub extends Base { public void foo() { System.out.println("Sub.foo"); } public void bar() { System.out.println("Sub.bar"); } }
执行new Sub().callBoth()
,输出将是:
Base.foo Sub.bar
因为它不会破坏类合同以使方法更具可用性。 如果Kitten子类为Animal,而Animal有一个公共方法feed(),那么Kitten也必须有一个公共方法feed(),因为它必须可以像处理Animal的一个实例一样处理Kitten的任何实例。 将访问级别重新定义为私有会破坏它。
如果公共方法变为私有,那么就不可能将实例强制转换为其父类(因为其中一个方法不可用)。
如果私有方法变为公共方法,则可以将实例添加到其父类中(因为那时您将无法获取私有/公共覆盖方法)。
访问级别不能比重写方法更严格。
私人 – > [预设] – >保护 – >公
通过重写你说你的子类可以用相同的api调用,但可能有不同的function。 公开内容会增加访问级别 – 因此您无法删除有保证的function。
通过将公共方法设为私有(如果您实际上可以这样做),您将删除function,从而破坏“合同”。 它也没有意义,因为该方法仍然可以公开调用,只是公共调用将访问超类中的公共方法,这将违反直觉。