与Java重写访问级别相混淆

与Java重写访问级别相混淆,java,polymorphism,Java,Polymorphism,可能重复: 为什么在子类中,我可以用public覆盖超类中的private方法,但我不能将超类中的public方法覆盖到子类中的private方法 为什么? 提前感谢。重写方法不会降低可见性。允许这样做将违反,即(简化)派生类B的所有对象必须具有与基类a相同的属性。在这种情况下,一个这样的“属性”将是一个公共方法foo,如果B具有相同的方法,但使其受到保护,则该属性将“丢失” 另外,由于private方法不是继承的(请尝试从派生类调用它!),因此它们永远不能被重写。您可以在基类中使用与priv

可能重复:

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

为什么?


提前感谢。

重写方法不会降低可见性。允许这样做将违反,即(简化)派生类
B
的所有对象必须具有与基类
a
相同的属性。在这种情况下,一个这样的“属性”将是一个公共方法
foo
,如果
B
具有相同的方法,但使其受到
保护,则该属性将“丢失”

另外,由于
private
方法不是继承的(请尝试从派生类调用它!),因此它们永远不能被重写。您可以在基类中使用与
private
方法同名的
public
方法,但这不是重写,它只是一个同名的新方法,而不是其他关系。对基类中的
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");
    }
}
执行
new Sub().calleals()
时,输出如下:

Base.foo Sub.bar Base.foo 子栏
因为它不会为了使方法更可用而破坏类契约。如果Kitten是Animal的子类,并且Animal有一个公共方法feed(),那么Kitten也必须有一个公共方法feed(),因为它必须能够像对待Animal一样对待Kitten的任何实例。将访问级别重新定义为private将打破这一局面。

如果public方法变为private,则不可能将实例向上强制转换为其父类(因为其中一个方法将不可用)


如果私有方法变为公共方法,则可以将实例升格到其父类中(因为这样您就无法获取私有/公共重写的方法)。

访问级别不能比重写的方法更严格


private-->[default]-->protected-->public

通过重写,您的意思是可以使用相同的api调用子类,但功能可能不同。将某些内容公开会提高访问级别—因此您不会删除保证的功能

通过将公共方法设为私有(如果您确实可以这样做的话),您将删除功能,从而打破“契约”。它也没有意义,因为方法仍然可以被公开调用,只是公共调用将访问超类中的公共方法,这是违反直觉的