【发布时间】:2013-04-18 10:00:21
【问题描述】:
我的书没有给出最好的解释,我想了解为什么我在超类中有相同的方法签名时不能在子类中有私有方法。除了超类中的方法是公共的。
我尝试用谷歌搜索这个答案,但我只能找到关于覆盖私有方法的内容。但是,我正在尝试用私有方法覆盖公共方法。
【问题讨论】:
-
谢谢! ^^^ Nate 和 BacMan。
标签: java inheritance
我的书没有给出最好的解释,我想了解为什么我在超类中有相同的方法签名时不能在子类中有私有方法。除了超类中的方法是公共的。
我尝试用谷歌搜索这个答案,但我只能找到关于覆盖私有方法的内容。但是,我正在尝试用私有方法覆盖公共方法。
【问题讨论】:
标签: java inheritance
如果可以,那又怎样?您已经用私有方法覆盖了公共方法,这将使超类方法不可见。依靠该方法可用的代码将会中断。 OO 的思想之一(称为Liskov Substitution Principle)是程序应该能够在高级别的操作对象,而不必知道正在使用的确切实现类;任何子类的对象都应该可以替代其超类的对象。能够使超类方法无效会破坏这一点。
【讨论】:
通过创建派生方法private,您将更改超类的约定,阻止任何其他子类访问最初的public 方法。
一个函数传递了一个类型为超类的参数,它不会事先知道是否允许调用该方法。这会很糟糕。
【讨论】:
根据Java Language Specification,第 8.4.8.3 节,在覆盖时不能削弱方法的访问权限,具体而言:
覆盖或隐藏方法的访问修饰符(第 6.6 节)必须 提供至少与被覆盖或隐藏的方法一样多的访问权限,如 如下:
如果覆盖或隐藏的方法是公共的,那么覆盖或隐藏的方法 隐藏方法必须是公开的;否则,会发生编译时错误。
如果覆盖或隐藏的方法受到保护,则覆盖 或隐藏方法必须受到保护或公开;否则,一个 发生编译时错误。
如果被覆盖或隐藏的方法具有默认(包)访问权限,则 覆盖或隐藏方法不能是私有的;否则,一个 发生编译时错误。
这样做是为了如果您有对子类对象的超类引用,那么您仍然可以调用该方法,无论它是什么类——超类或任何子类——例如
Superclass obj = new Subclass();
obj.method();
它必须仍然是public。
【讨论】: