2017-06-14 81 views
2

我了解目前压倒一切的,我读了一个私有方法不能被重写here的Java重写私人与公开

我也读到的访问级别不能比超的访问级别更严格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的访问级别为A

场景3

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

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

最后一个问题,这是唯一的情景方法可以重写恩? (两种访问级别都是公开的)

+1

受保护太...而那些将具有相同的知名度 –

+2

为什么不在发布前测试它们? – shmosel

回答

1

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

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

第二个代码段确实无法通过编译,因为您无法减少继承方法的可见性。

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

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

'method4'只覆盖超级实现,如果两个类都在同一个包中 –

+0

是的,那只是因为他们假设在同一个包中才有效...... –