2017-06-14 75 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

是的,那只是因爲他們假設在同一個包中才有效...... –