可能重复困惑:
Why can't you reduce the visibility of a method in a java subclass?与Java重写访问级别
为什么我可以在超重写private
方法在子类时public
,但我不能覆盖一个public
方法在超类中变成private
方法在子类中?
为什么?
预先感谢您。
可能重复困惑:
Why can't you reduce the visibility of a method in a java subclass?与Java重写访问级别
为什么我可以在超重写private
方法在子类时public
,但我不能覆盖一个public
方法在超类中变成private
方法在子类中?
为什么?
预先感谢您。
覆盖方法不能减少可见性。允许这将违反Liskov Substitution Principle,其中声明(简化)派生类B
的所有对象都必须具有与基类A
相同的属性。在这种情况下,一个这样的“财产”将是一种公开的方法foo
,如果B
具有相同的方法,但将其作为protected
,则该方法将会“丢失”。
另外,由于private
方法没有被继承(尝试从派生类中调用它),所以它们不能被覆盖。您可以在基类中使用与private
同名的public
方法,但这不是重写,它只是具有相同名称的新方法,而不是其他关系。调用基类中的private
方法将会在调用超类中的public
方法时,即使在超类的对象上执行时,而不是也会调用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实例。将访问级别重新定义为私有会破坏这一点。
如果公共方法变为私有方法,那么就不可能将实例上传到其父类中(因为其中一种方法将不可用)。
如果私有方法变为公共,那么可以将实例放入它的父类中(因为那样你就无法获取私有的/公开的overriden方法)。
访问级别不能是更多限制性比重写的方法。
私人 - > [预设] - >保护 - >公共
通过重写你说,你的子类可以使用相同的API调用,但可能具有不同的功能。公开某些东西会增加访问级别 - 所以你不能删除保证的功能。
通过公开私有方法(如果您实际上可以这样做),您将删除功能,从而打破“合同”。它也没有意义,因为该方法仍然可以公开呼叫,只是公共呼叫将访问超类中的公共方法,这是违反直觉的。
好的谢谢。 :) – newbie 2011-03-21 14:33:51