2011-09-04 68 views
0
Public class John { 

public void setValue(){ 
    this.value = 0; 
} 
public void setValue(int v){ 
    this.value = v; 
} 

現在我怎麼會調用這兩個方法?重載多態概念或?

John j = new John(); 
j.setValueO(); 
j.setValue(10); 

糾正我,如果我錯了。

  1. 函數重載多態概念嗎?如果不是這樣,那麼OOP分支是否會來這裏。
  2. 封裝手段隱藏信息和抽象手段隱藏植入細節。所以,當我超載的方法,我是否攜帶上述這兩個任何... {抽象和Encapsulation}
  3. 是重載編譯時間或運行時?他們爲什麼稱這是爲了超載和重寫?
+2

看看這裏的答案:HTTP://計算器.com/questions/154577/polymorphism-vs-overriding-vs-overloading –

+0

[Types of Polymorphism](http://stackoverflow.com/a/11732581/697630) –

回答

2

是的,你是對的,希望你所做的錯字?

函數是否重載多態的概念?如果不是這樣,根據OOP分支 這個來。

從歷史的角度來看,它確實來了,但它仍然有很多人認爲它不是一種多態的形式。

重載

的方法,功能各不相同基於所述arguements。

重寫在其上使用的類instainate後援方法樹皮可能聽起來爲不同類別CAT和Class DOG不同基於

的方法的功能。

封裝方法隱藏信息和抽象手段 隱藏植入細節。所以,當我做超載的方法,我是否在上面這兩個攜帶任何東西... {抽象和Encpsulation}

沒有。可能有人可以更清楚地回答這個問題。

重載編譯時間或運行時間?他們爲什麼稱這個爲 超載和覆蓋?

編譯時間。在重寫決定運行時決定哪個類的方法時,因此它是運行時

在重載方法定義時,基於方法調用中傳遞的參數的可用性在編譯時被檢查。

1

至於你的問題的第一部分,是你顯示的代碼是一個重載的例子,好吧,假設第一部分是正確的,第二部分中的0是一個錯字。

  1. 我不熟悉這些話題是如何正式教導的,但我腦海中的重載並沒有真正與多態有關。這只是一個方便的方法,或多或少做同樣的事情(並經常互相呼叫)共享一個名字。我不知道如何回答你的第二個問題。什麼是「OOP分支」?

  2. 再一次,我不太確定這些是如何搭配的。難道這不取決於的方法是嗎?

  3. 嗯,這樣想一想。在Java中,當你調用一般的方法,拋開重載時,系統會在哪個階段找出你調用的方法(而不是那個類的實現那個方法)?至於這些術語的起源,說實話,這應該很容易查找。

1
  1. 由於函數重載可以很好地工作沒有對象,我看不出有任何理由爲它是一個面向對象的概念都沒有。對於是多態的問題,它確實符合一般要求,並且根據Wikipedia是多態的一種形式。
  2. 一般來說,當您創建一個方法時,您總是會同時執行這兩個操作(您抽象出一些常規功能,並隱藏該函數的內部運行信息)。 IMO不會重載超載。 (即使通過超載和獲得的多態性,你可能認爲在抽象中獲得了多態性,因爲函數變得更加通用,所以IMO仍然處於相同的抽象層次上。)
  3. 重載解析是 - 首先讓我感到驚訝的是 - 編譯時間。這與所提到的壓倒一切形成鮮明對比。 (因此,它在這個意義上不是同一種多態性的,因爲一個是運行時,另一種是編譯時間。)
2

Java不會單獨通過名稱來標識方法,而是通過其簽名來標識方法。簽名由方法名稱和參數類型的有序列表組成。因此,從編譯器和jvm的角度來看,這是兩種完全不同的方法。他們分享這個名字的事實(以及由此產生的類似簽名)對於人類來說沒有任何意義。

由於簽名用於.class文件,因此編譯器負責在編譯時使用方法名稱和參數計算方法調用的簽名。在運行時發生的後期綁定與多態性有關,因爲調用某個方法的當前實例可能是覆蓋特定方法的子類的實例,在java中,該方法也被重載或不被重載完全由運行時考慮。

在同一個類中不能有兩個具有相同簽名的方法。值得注意的是,方法的返回類型不是它的簽名的一部分,所以你不能有兩個方法具有相同和相同的參數,但返回兩種不同的類型。

在其他語言的JavaScript爲例,自參數總是動態的,簽名僅由方法的名稱,這使得超載不可能