继承 - 为什么我不能在super中使用相同方法签名的子类中声明私有方法?

时间:2013-04-24 17:56:08

标签: java inheritance

我的书没有给出最好的解释,我想理解为什么当我在超类中使用相同的方法签名时,我不能在子类中拥有私有方法。除了超类中的方法是公开的。

我尝试使用谷歌搜索这个答案,我所能找到的只是覆盖私有方法的东西。但是,我正在尝试使用私有方法覆盖公共方法。

3 个答案:

答案 0 :(得分:1)

如果可以,那又怎样?你已经用私有方法覆盖了一个公共方法,这将使超类方法不可见。依赖于该方法可用的代码会中断。 OO的一个想法(称为Liskov Substitution Principle)是程序应该能够在高级别操作对象,而不必知道正在使用的确切实现类;任何子类的对象都应该可替代其超类的对象。能够使超类方法无效会破坏这一点。

答案 1 :(得分:1)

通过创建派生方法private,您将更改超类所签订的合同,从而阻止任何其他子类访问最初的public方法。

一个函数传递了一个类型为超类的参数,它不会事先知道是否允许调用该方法。这很糟糕。

答案 2 :(得分:1)

根据Java Language Specification第8.4.8.3节,在覆盖时不能削弱方法的访问权限,具体来说:

  

覆盖或隐藏方法的访问修饰符(第6.6节)必须   提供至少与被覆盖或隐藏方法一样多的访问权限   如下:

     

如果被覆盖或隐藏的方法是公开的,那么覆盖或   隐藏方法必须公开;否则,发生编译时错误。

     

如果被覆盖或隐藏的方法受到保护,则覆盖   或隐藏方法必须受到保护或公开;否则,a   发生编译时错误。

     

如果被覆盖或隐藏的方法具有默认(包)访问权限,那么   重写或隐藏方法不得私有;否则,a   发生编译时错误。

这样做是因为如果你有一个超类引用子类对象,那么你仍然可以调用该方法,无论它是什么类 - 超类或任何子类 - 例如。

Superclass obj = new Subclass();
obj.method();

它必须仍为public