2012-11-20 76 views
0
class Overload{ 

    public static void main(String args[]) { 
    int[] number={1,2,3,4,5,6,7,8,9,10}; 
    int [] num={1,2,3,4,5}; 
    int i; 
    int sum=0; 
    sum = f(number); 
    int sum1= f(num); 
    System.out.println("The sum is" +sum + "."); 
    System.out.println("The sum is" +sum1 + "."); 
    } 

    public static int f(int[] value) { 
    int i, total = 0; 
    for(i=0; i<10; i++) { 
     total = total + value[ i ]; 
    } 
    return (total); 
    } 

    public static int f(int... x) { 
    int i, total = 0; 
    for(i=0; i<10; i++) { 
     total = total + x[ i ]; 
    } 
    return (total); 
    } 

} 

在編譯時,我發現了錯誤的重載方法

 
C:\Program Files\Java\jdk1.7.0_09\bin>javac Overload.java 
Overload.java:30: error: cannot declare both f(int...) and f(int[]) in Overload 
public static int f(int... x) 
+1

請參閱http:/ /stackoverflow.com/editing-help如何降價如何工作SO –

回答

1

編譯認爲,方法,採用可變參數作爲參數可能是同一上述程序作爲一個方法,它將一個數組作爲參數。即它認爲有重複的方法具有相同數量的參數,這違背了超載規則。

public void m1(int[] arr){ 

} 

public void m1(int...i){ 

} 

基本上same.the唯一的區別是VAR-ARGS可以接受任何數量的INT變量

+1

這是因爲在它下面,*有*重複的方法。 「......」只是句法糖;編譯時Java將它變成一個數組。 – cHao

+0

@cHao這是我的意圖。 :)我只是缺乏術語我猜:P – PermGenError

+0

而'var-args'必須是方法中的最後一個參數,這會產生很大的差異。 –

4
public static int f(int... x) 

的無非是: -

public static int f(int[] x) 

,只有不同的是它不一定需要通過一個參數。當你傳遞單個元素時,它們會在內部轉換爲數組。所以,你實際上只通過了array

儘管後來一個需要一個自變量。至少是一個空數組。

而且這兩種方法都有資格被調用,如果你傳遞一個數組作爲參數。

所以通話:

f(new int[] {1, 2}); 

可以以兩種方法進行。所以,模糊性在那裏。


但是,f(5)調用只能用於第一種方法。因爲,5不能分配給數組類型。 因此,只有在傳遞數組時纔會出現歧義。

+4

這不是一個很好的可變參數描述。它不像可選參數 - 它是一個數組參數,可以單獨指定值。 –

+1

要詳細說明,Java將可變參數轉換爲封面下方的數組,並且不能有兩個具有相同名稱和簽名的方法。 – smcg

+0

@JonSkeet ..是的,這是正確的。我編輯了我的帖子,引用該部分。 –

0

方法簽名是相同的。因此過載是不可能的。更改方法簽名。

有從wikipedia在Java方法簽名的定義。

在Java編程語言中,方法簽名是方法名稱及其參數的數量和類型。返回類型和拋出的異常不被認爲是方法簽名的一部分。

在您的代碼中,您有兩種方法具有相同的簽名f(int[] value)。另一個功能使用int...作爲參數,但它相當於int[]

+0

你錯了。方法簽名是相同的,但返回類型不同,那麼它也稱爲方法重載。 – JegsVala

+1

不,如果方法簽名相同,則代碼不會編譯。 –

+0

我真的很抱歉,你沒有錯,但現在我錯了,我清除了這個東西.. – JegsVala

0

方法重載是Java的功能,使您具有相同名稱但不同的參數列表

方法重載一個以上的方法也被稱爲靜態多態

Argument list must be differ 
1) Numbers of Parameters "not the same parameters" 
2) Data type of parameters "does not have the same datatype of parameters" 
3) Sequence of Datatype of parameters "its may be possible to change the sequence the of datatype." 

的方法超載具有相同的參數,那麼它必須返回類型是不同的假設

public class Test 
{ 

    public int printVal(int i,int j) 
    { 
    System.out.println("Integer Return type") 
     return i*j; 
    } 

    public double printVal(int i,int j) 
    { 
    System.out.println("Double Return type") 
     return i*j; 
    } 

} 

在上面的類中,我們有兩個方法一個有int返回類型,另一個有雙重返回類型,因此可以在方法重載中使用。數據類型的

序列就意味着

public class Test 
{ 
    public void display(String surname ,String name) 
    { 
    System.out.println("Surname = "+surname); 
    System.out.println("Name = "+name); 

    } 

    public void display(String name,String surname) 
    { 

    System.out.println("Name = "+name); 
    System.out.println("Surname = "+surname); 

    } 
} 
在上面的例子中

我們有兩個方法作爲相同的數據類型,但其序列是不同這種情況下也被稱爲方法重載..