java - 与 Java 混淆 覆盖访问级别

标签 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/

相关文章:

java - LIBGDX - 碰撞问题和滑动效果问题

java - Maven过滤没有选择好的文件

java - 从基类请求主体 DTO 获取派生 DTO

scala - 类型上限允许子类型但不允许父类型

C++调用从基类派生的覆盖函数

java - 播放声音

Java 空输出文件

java - Ignite cursor.getAll() 需要很长时间来检索数据

c++ - 全局运算符和多态性

c++ - 使用具有多态行为的重载函数