Pitfall: “overriding” private methods

     有時候,你可能無意中寫出這樣的代碼:

public class PrivateOverride
{  
   
private void f()
   {  
      System.out.println(
"private f()");
   }
   
public static void main(String[] args) 
   {
      PrivateOverride po 
= new Derived();
      po.f(); 
   }
}

class Derived extends PrivateOverride 
{
   
public void f()
   {
      System.out.println(
"public f()");
   }

    你可能想當然得認爲輸出會是"public f()".事實上,private的方法會自動被認爲是"final"的.它對繼承類也是不可見的.所以,Derived類裏的方法f()在這個例子裏其實是一個全新的方法.它甚至不能算是重載(overload),因爲基類裏的方法f()Derived類也是不可見的.

    從這個例子我們可以看到只有非private(non-private)的方法纔可以被重載(overload).但是,你必須提防"重載"private方法的現象,這種情況編譯器不會報錯,但結果卻可能與你預想的不一樣.爲了清晰起見,在爲繼承類裏的方法起名時應當要儘量與基類裏private方法的名稱不同.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章