2012-07-24 78 views
7

我是Java新手,我有一個非常基本的問題。重寫受保護的方法

我有2個父類下相同的包。 Animal抽象類和Machine類。

現在,Animal抽象類具有受保護的方法。我知道,如果這些類在同一個包中,那麼受保護的方法是可訪問的。

我可以訪問我的Machine類中受保護的方法,問題是..是否可以重寫該受保護的方法?不擴展Animal類。

+2

你嘗試過嗎?結果是什麼? – 2012-07-24 07:25:41

+0

繼承之後出現重寫...你說的是不可能的...... :) – 2012-07-24 07:31:12

回答

21
  • 保護 - 可被子類覆蓋,無論他們是在同一個包或不
  • 默認(沒有訪問修飾符) - 可被訪問或者如果兩個類都在同一個包覆蓋
+1

謝謝你回答這個基本問題。 :) – 2012-07-24 07:30:29

+0

這一個是正確的答案。丹尼斯薩利比奧,你應該玩一下階級層次結構。 – TecHunter 2012-07-24 07:30:48

5

您只能通過擴展來覆蓋方法。

如果您願意,您可以使用匿名子類覆蓋受保護的方法。例如。

public class Animal { 

    protected String getSound() { 
     return "(Silence)"; 
    } 

    public void speak() { 
     System.out.println(getSound()); 
    } 
} 

在另一大類:

public static void main(String ... args) { 

    Animal dog = new Animal() { 

     @Override 
     protected String getSound() { 
      return "Woof!"; 
     } 
    } 

    dog.speak(); 
} 

將輸出:

Woof! 
+0

Animal animal = new Dog(); 我用這個代碼來訪問該方法,我只是想知道如果我可以覆蓋受保護的方法。 – 2012-07-24 07:28:02

+0

謝謝你回答這個基本問題。 :) – 2012-07-24 07:32:17

+0

我已經更新了我的答案,以顯示如何創建動物的匿名子類來表示一隻狗,而不實際創建一個名爲Dog的類。 – 2012-07-24 10:35:30

0

爲了覆蓋你必須擴展該類中的方法。這就是重寫意味着什麼:使用與超類相同的簽名方法。

+0

謝謝你回答這個基本問題。 :) – 2012-07-24 07:33:42

1

,覆蓋意味着繼承父類的行爲,如果不擴展類,這是不可能的。

public class PClass 
    { 



protected boolean methodA() 
      { 
    return true; 
     } 

    } 

public class CClass extends PClass 
     { 

protected boolean methodA() 
      { 
    return false; 
     } 
     } 

運行下面的代碼來測試它

public static void main(String[] args) 
    { 

    PClass pc=new CClass(); 
    System.out.println(pc.methodA()); 

    } 

O/p=false

這裏我們覆蓋methodA

+0

謝謝你回答這個基本問題。 :) – 2012-07-24 07:34:39

0

重寫定義說的行爲..

的實例方法d在具有相同簽名(名稱,加上其參數的數量和類型)的子類中,並且返回類型作爲超類中的實例方法覆蓋超類的方法。

所以AFAIK如果你沒有擴展超類沒有辦法覆蓋該方法。

0

受保護的只能被其他包中的子類訪問。同一包中的類也可以訪問受保護的字段,方法和構造函數,即使它們不是受保護成員類的子類。

替代: 具有相同簽名的子類中的實例方法。

回答你的問題的:
但是,如果你不想extendsAnimal classMachine class那麼它不重寫它只是一個正常的自己的類的功能。