我的书没有给出最好的解释,我想了解为什么当我在超类中有相同的方法签名时,我不能在子类中有私有方法。除了超类中的方法是公共的。
我试着用谷歌搜索这个答案,我能找到的只是覆盖私有方法的东西。但是,我试图用私有方法覆盖公共方法。
我的书没有给出最好的解释,我想了解为什么当我在超类中有相同的方法签名时,我不能在子类中有私有方法。除了超类中的方法是公共的。
我试着用谷歌搜索这个答案,我能找到的只是覆盖私有方法的东西。但是,我试图用私有方法覆盖公共方法。
通过创建派生方法private
,您将更改超类制定的合同,防止任何进一步的子类访问原始public
方法。
传递类型为超类的参数的函数不会事先知道是否允许调用该方法。这会很糟糕。
如果可以,那又怎样?您已经用私有方法覆盖了公共方法,这将使超类方法不可见。依靠该方法可用的代码将会中断。OO 的思想之一(称为Liskov 替换原则)是程序应该能够在高级别的操作对象,而不必知道正在使用的确切实现类;任何子类的对象都应该可以替代其超类的对象。能够使超类方法无效会破坏这一点。
根据Java Language Specification的第 8.4.8.3 节,在覆盖时不能削弱方法的访问权限,具体而言:
覆盖或隐藏方法的访问修饰符(第 6.6 节)必须提供至少与覆盖或隐藏方法一样多的访问权限,如下所示:
如果被覆盖或隐藏的方法是公开的,那么覆盖或隐藏的方法必须是公开的;否则,会发生编译时错误。
如果被覆盖或隐藏的方法是受保护的,那么覆盖或隐藏的方法必须是受保护的或公开的;否则,会发生编译时错误。
如果被覆盖或隐藏的方法具有默认(包)访问权限,则覆盖或隐藏方法不能是私有的;否则,会发生编译时错误。
这样做是为了如果您有对子类对象的超类引用,那么您仍然可以调用该方法,无论它是什么类——超类或任何子类——例如
Superclass obj = new Subclass();
obj.method();
应该还是public
。