与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,从而破坏“合同”。 它也没有意义,因为该方法仍然可以公开调用,只是公共调用将访问超类中的公共方法,这将违反直觉。