2016-03-03 30 views
0
public void giveInput(String x, int y) { 
     System.out.print("X parameters"+x+"Y parameters"+y); 
    } 

    public void giveInput(int y, String x) { 
     System.out.print("x parameters"+x+"Y parameters"+y); 
    } 

爲什麼參數對齊在重載中無關緊要。它編譯得很好不同參數對齊的Java超載

+0

它的一部分可能是你的參數都使用不同的變量類型。 – star2wars3

+2

爲什麼你不期望這個編譯? – David

+0

我不希望這樣編譯,因爲參數是相同的,但順序不同。 – enthusiast

回答

5

這些是兩種不同的簽名方法。方法中參數類型的順序是Java中方法簽名的一部分。另一方面,參數的名稱並不重要。

由於參數名稱並不重要,你的代碼就相當於:

public void giveInput(String x, int y) { 
    System.out.print("X parameters"+x+"Y parameters"+y); 
} 

public void giveInput(int a, String b) { 
    System.out.print("x parameters"+b+"Y parameters"+a); 
} 

在另一方面,這兩種方法具有相同的簽名,所以會導致編譯錯誤:

public void giveInput(String x, int y) { 
    System.out.print("X parameters"+x+"Y parameters"+y); 
} 

public void giveInput(String a, int b) { 
    System.out.print("x parameters"+b+"Y parameters"+a); 
} 
6

對齊參數的順序確實事情,這就是爲什麼你編譯。它編譯是因爲沒有歧義,giveInput("", 0)明顯不同於giveInput(0, "")。他們可以做完全不同的事情。

所有的Java關心的是該方法的簽名唯一標識它。簽名(用於重載的目的)是方法名稱及其形式參數的類型。從JLS§8.4.9

當調用一個方法(§15.12)中,使用的實際參數(以及任何顯式的類型的參數)和編譯時間類型的參數的數量,在編譯時,確定簽名該方法將被調用(§15.12.2)。

值得一提的是,名稱形式參數的顯著,giveInput(String x, int y)將與giveInput(String foo, int bar)衝突,因爲名字是無關緊要的,它的順序和關係類型。