我的书没有给出最好的解释,我想理解为什么当我在超类中使用相同的方法签名时,我不能在子类中拥有私有方法。除了超类中的方法是公开的。
我尝试使用谷歌搜索这个答案,我所能找到的只是覆盖私有方法的东西。但是,我正在尝试使用私有方法覆盖公共方法。
答案 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
。