2010-03-18 87 views
18

我們總是說方法重載是靜態多態,重寫是運行時多態。我們這裏的靜態意味着什麼?在編譯代碼時解析了一個方法的調用嗎?那麼正常的方法調用和調用最終方法之間的區別是什麼?哪一個在編譯時被鏈接?Java重載和覆蓋

回答

10

你是對的 - 調用重載方法是在編譯時實現的。這就是爲什麼它是靜態

調用重寫的方法是在運行時根據調用該方法的類型實現的。

On virtual methods wikipedia says:

在Java中,所有的非靜態方法都默認的 「虛擬功能」。只有標有final關鍵字的方法纔是非虛擬的。

final方法不能被覆蓋,所以它們是靜態實現的。

想象方法:

public String analyze(Interface i) { 
    i.analyze(); 
    return i.getAnalysisDetails(); 
} 

編譯器不能重載對於可能被傳遞給它的Interface所有實現此方法。

+0

最終的方法在運行時真的處理方式不同嗎?或者最終版本只在編譯時執行? – Thilo 2010-03-18 12:48:07

+1

另一個有趣的方面是,重載方法的方法分派只有一部分在運行時發生:在編譯時,無論參數值的運行時類型如何,都會建立確切的方法簽名。運行時發生的唯一調度是調用其方法的對象的類型。 – Thilo 2010-03-18 12:50:25

+0

@Thilo我不完全確定如何在運行時處理最終方法。它應該寫在規範中(我現在有點懶得搜索) – Bozho 2010-03-18 12:59:23

5

我不認爲你可以調用重載任何種類的多態性。重載的方法在編譯時被鏈接,這種排除方式稱之爲多態。

多態性是指當您爲派生類對象使用基類引用時,方法與其調用的動態綁定。覆蓋方法是你如何實現這種多態行爲。

+1

否 - 「多態性」是*任何機制,根據類型實現不同的行爲。分派是在運行時發生還是在編譯時發生,與多態性的定義完全無關。僅供參考,在需要進一步分類的環境中,超載通常稱爲「特別多態性」。 – 2010-03-18 15:43:39

19

方法重載意味着根據輸入做出多個版本的函數。例如:

public Double doSomething(Double x) { ... } 
public Object doSomething(Object y) { ... } 

選擇調用哪種方法是在編譯時進行的。例如:

Double obj1 = new Double(); 
doSomething(obj1); // calls the Double version 

Object obj2 = new Object(); 
doSomething(obj2); // calls the Object version 

Object obj3 = new Double(); 
doSomething(obj3); // calls the Object version because the compilers see the 
        // type as Object 
        // This makes more sense when you consider something like 

public void myMethod(Object o) { 
    doSomething(o); 
} 
myMethod(new Double(5)); 
// inside the call to myMethod, it sees only that it has an Object 
// it can't tell that it's a Double at compile time 

方法覆蓋是指原

class Parent { 
    public void myMethod() { ... } 
} 
class Child extends Parent { 
    @Override 
    public void myMethod() { ... } 
} 

Parent p = new Parent(); 
p.myMethod(); // calls Parent's myMethod 

Child c = new Child(); 
c.myMethod(); // calls Child's myMethod 

Parent pc = new Child(); 
pc.myMethod(); // call's Child's myMethod because the type is checked at runtime 
       // rather than compile time 

我希望幫助

1

我與雷切爾同意,因爲以K &的子類中定義方法的新版本B書直接提到過載不屬於第2章(面向對象)中的多態性。但在很多地方我發現重載意味着靜態多態,因爲它是編譯時間,覆蓋意味着動態多態,因爲它是運行時間。

但是有一件有趣的事情是在C++書中(面向對象的程序設計中的C++ - Robert Lafore),它也直接提到重載意味着靜態多態。 但還有一件事是java和C++都是兩種不同的編程語言,他們有不同的對象操作技術,所以可能是多態性在c + +和java不同?

0

簡單定義 - 方法重載處理在同一個類中具有兩個或多個方法(函數)的概念,其名稱相同但參數不同。

雖然方法覆蓋意味着有兩個方法具有相同的參數,但實現方式不同。其中一個將存在於父類(基類)中,而另一個將存在於派生類(子類)中。@ Override註釋是必需的。

檢查: Click here for a detailed example

0

房產超載重寫

方法名稱-------------->必須是同一------ ----------必須相同

精氨酸類型------------------>必須是不同的(至少ARG)

方法簽名

返回類型

私人,靜態,最終

訪問修飾符

的try/catch

方法解析

5

1) 方法重載用於增加程序的可讀性。 方法重寫用於提供已由其超類提供的方法的特定實現。

2) 方法重載在類中執行。 方法覆蓋發生在兩個具有IS-A(繼承)關係的類中。

3) 在方法重載的情況下,參數必須不同。 如果方法覆蓋,參數必須相同。

4) 方法重載是編譯時多態的例子。 重寫方法是運行時多態的例子。

5) 在java中,方法重載不能僅通過改變方法的返回類型來執行。方法重載的返回類型可以相同也可以不同。但是你必須改變參數。 返回類型在方法重寫中必須相同或協變。

0

方法重載處理在同一個類中具有兩個或多個方法的概念具有相同名稱但參數不同。

方法重寫意味着有兩個方法具有相同的參數,但具有不同的實現。其中一個將存在於父類中,而另一個將存在於派生類或子類中。 @Override註釋雖然不是必需的,但可以在編譯時強制執行正確的重寫方法。

1

方法重載僅僅意味着在一個具有相同名稱但不同參數的類中提供了兩個單獨的方法,而方法返回類型可能相同或不同,這使得我們可以重用相同的方法名稱。

但是這兩種方法是不同的,因此可以通過編譯器在編譯的時候這就是爲什麼它也被稱爲編譯時多態性靜態多態解決

方法覆蓋意味着定義的方法子類已經在父類中定義了相同的方法簽名,即相同的名稱,參數和返回類型。

Mammal mammal = new Cat(); 
System.out.println(mammal.speak()); 

在生產線mammal.speak()編譯器說引用類型Mammalspeak()方法獲取調用,所以編譯器這個調用Mammal.speak()

但是在執行時JVM清楚地知道mammal引用持有Cat對象的引用,所以對於JVM這個調用是Cat.speak()

因爲方法調用在運行時由JVM得到解決,這就是爲什麼它也被稱爲運行時多態性動態方法分派

差分方法重載和方法覆蓋之間

Difference Between Method Overloading and Method Overriding

欲瞭解更多詳情,您可以閱讀Everything About Method Overloading Vs Method Overriding