【问题标题】:Java overriding private vs publicJava覆盖私有与公共
【发布时间】:2017-11-16 05:52:23
【问题描述】:

我现在正在学习覆盖,我读到不能覆盖私有方法here

我还读到访问级别不能比超类访问级别here更严格

所以我想知道的是,这是否意味着您只能覆盖公共方法?而且你的新方法也必须公开?

场景

class A {
    private void method1(){
        ....
    }
}

class B extends A {
    private void method1(){
        ....
    }
}

我是否正确地说这将是一个编译时错误,因为私有方法不能被覆盖?

场景2

class A {
    public void method1(){
        ....
    }
}

class B extends A {
    private void method1(){
        ....
    }
}

我是否正确地说这也会产生编译时错误,因为B 中的method1() 的访问级别比A 中的method1() 更严格

场景3

class A {
    public void method1(){
        ....
    }
}

class B extends A {
    public void method1(){
        ....
    }
} 

最后一个问题,这是唯一可以覆盖的场景方法吗? (两个访问级别都是公开的)

【问题讨论】:

  • 也受保护了......并且它们将具有相同的可见性
  • 为什么不在发帖前测试一下?

标签: java inheritance methods overriding


【解决方案1】:

假设类:

class A {
    public void method1() {         }

    protected void method2() {         }

    private void method3() {         }

    void method4() {         }
}

然后

class B extends A {
    @Override
    public void method1() {
        // this method DOES override the Method1
    }

    @Override
    protected void method2() {
        // this method DOES override the Method2
        super.method2();
    }

    private void method3() {
        // this method DOES NOT override the Method3
    }

    @Override
    void method4() {
        // this method DOES override the Method4
        super.method4();
    }
}

在所有情况下,您被覆盖的方法的可见度都不能低于超类中的方法。

【讨论】:

  • method4 仅在两个类在同一个包中时才会覆盖超级实现
  • 是的,这只是因为它们假设在同一个包中才有效......
【解决方案2】:

是的,您可以覆盖公共或受保护的方法。您不能覆盖私有方法。

也就是说,你的第一个 sn-p 不会产生编译错误。 AB 都会有 method1(),但 B 的方法不会覆盖 A 的方法。

第二个 sn-p 确实无法通过编译,因为您无法降低继承方法的可见性。

第三个 sn-p 是您发布的代码中方法覆盖的唯一情况。

【讨论】:

    猜你喜欢
    • 2011-08-10
    • 2017-06-08
    • 1970-01-01
    • 2018-11-16
    • 2011-11-02
    • 1970-01-01
    • 2022-10-14
    相关资源
    最近更新 更多