Java覆盖私有与公共

时间:2017-06-14 07:49:56

标签: java inheritance methods override

我现在正在学习重写,并且我读到私有方法无法被覆盖here

我还读到访问级别不能比超类访问级别here更具限制性

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

方案

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

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

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

Scenario2

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

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

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

场景3

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

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

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

2 个答案:

答案 0 :(得分:3)

假设班级:

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();
    }
}

并且在所有情况下,重写的方法都不会比超类中的方法更不可见。

答案 1 :(得分:1)

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

那就是说,你的第一个代码片段不会产生编译错误。 AB都有method1(),但B的方法不会覆盖A的方法。

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

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