<分区>
Possible Duplicate:
Why can't you reduce the visibility of a method in a java subclass?
为什么我可以在子类中用 public
覆盖父类(super class)中的 private
方法,但我不能在子类中覆盖 public
方法父类(super class)到子类中的 private
方法?
为什么?
提前谢谢你。
标签 java polymorphism
<分区>
Possible Duplicate:
Why can't you reduce the visibility of a method in a java subclass?
为什么我可以在子类中用 public
覆盖父类(super class)中的 private
方法,但我不能在子类中覆盖 public
方法父类(super class)到子类中的 private
方法?
为什么?
提前谢谢你。
最佳答案
覆盖方法永远不会降低可见性。允许这样做会违反 Liskov Substitution Principle ,它声明(简化)派生类 B
的所有对象必须具有与基类 A
相同的属性。在这种情况下,一个这样的“属性”将是一个公共(public)方法 foo
如果 B
具有相同的方法,它将“丢失”,但使其 protected
.
此外,由于 private
方法不是继承的(尝试从派生类中调用它!)它们永远不会被覆盖。您可以在基类中有一个与 private
方法同名的 public
方法,但这不是覆盖,它只是一个具有相同名称的新方法,但不是其他关系。调用基类中的 private
方法将不会调用父类(super class)中的 public
方法,即使是在父类(super class)的对象上执行也是如此!
换句话说: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
关于java - 与 Java 混淆 覆盖访问级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5378995/