与Java混淆覆盖访问级别

new*_*bie 3 java polymorphism

可能重复:
为什么不能降低java子类中方法的可见性?

为什么我可以private在子类中使用publicwhen 覆盖超类中的 方法,但是我不能将超public类中的private方法覆盖到子类中的方法中?

为什么?

先感谢您.

Joa*_*uer 11

覆盖方法不能降低可见性.允许这样做会违反Liskov替换原则,该原则声明(简化)派生类的所有对象B必须具有与基类相同的属性A.在这种情况下,一个这样的"财产"将是一种公共方法foo,如果B采用相同的方法,它将会"丢失" ,但却成功了protected.

此外,由于private方法不是继承的(尝试从派生类调用它!)它们不能被覆盖.您可以使用publicprivate基类中的方法同名的方法,但这不是覆盖,它只是一个具有相同名称的新方法,而不是其他关系.调用private基类中的方法不会调用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");
    }
}
Run Code Online (Sandbox Code Playgroud)

执行new Sub().callBoth()输出时将是:

Base.foo
Sub.bar