2015-11-02 37 views
1

這個問題類似於Why can a "private" method be accessed from a different instance?爲什麼我不能在實例中看到子類實例上的私有方法?

我相信在那裏的答案。代碼應該運行。然而,當我改變代碼是這樣

class Horse extends Animals{ 
} 

public class Animals { 

    private void eat(){ 
     System.out.println("Generic Eating"); 
    } 

    public static void main(String[] args){ 
     Animals h = new Horse(); 
     h.eat(); 
    } 

} 

,當我嘗試使用多態來調用私有方法吃()的子類馬它的工作原理,並調用父類的方法。

  • 不是java動態調用實例類的具體方法嗎?
  • 不應該拋出一個運行時異常嗎?
  • 這是否意味着該方法實際上是繼承的,但通常不可訪問?
+0

這些類是在同一個文件中定義的嗎? –

+0

@KevinKrumwiede那很重要嗎? – Tom

+0

@KevinKrumwiede,文件與任何與成員的可見性相關的內容都是不相關的。 –

回答

5

在你的榜樣,一個HorseAnimal。所以是的,一個Horse有一個方法叫做eat,因爲每個Animal有一個這樣的方法,並且每個Horse是一個Animal

方法eat由類Animal定義,並且是該類中的私有方法。這意味着它只能從Animal類中定義的其他方法中訪問,除此之外沒有別的。沒有超級/子類,沒有包裝,沒有容器,沒有任何東西。甚至沒有一個Horse,它雖然Animal,它不是Animal本身。

因此,您的示例以預期的方式工作。


最後要注意,在「標題」明確回答了問題,

爲什麼我可以調用子類的實例的私有方法時,它不應該是對實例可見?

唯一重要的是從你調用私有方法。你從它所定義的類中調用它。因此它是可訪問的。

相關問題