方法重載
1. 為什么需要方法重載
public class TestMethod{public static void main (String[] args){int a = 10;int b = 20;int ret = add(a,b);System.out.println("ret = "+ret);double a2 = 10.5;double b2 = 20.5;double ret2 = add(a2,b2);System.out.println("ret2 = "+ret2);}public static int add(int x,int y){return x + y;}}//編譯出錯Test.java:13: 錯誤: 不兼容的類型: 從double轉換到int可能會有損失double ret 2 = add ( a2 , b2 ) ;^
由于參數類型不匹配,所以不能直接使用現有的 add 方法。
一種比較簡單粗暴的解決方法如下:
public class TestMethod{public ststic void main(String[] args){int a = 10;int b = 20;int ret = addInt(a,b);sout("ret = " + ret);double a2 = 10.5;double b2 = 20.5;double ret2 = addDouble(a2, b2);System.out.println("ret2 = " + ret2);}public static int addInt(int x, int y) {return x + y;}public static double addDouble(double x, double y) {return x + y;}}
上述代碼確實可以解決問題,但不友好的地方是:需要提供許多不同的方法名,而取名字本來就是讓人頭疼的事 情。那能否將所有的名字都給成 add
呢?
2. 方法重載概念
在自然語言中,經常會出現“一詞多義”的現象,比如:“好人”
在自然語言中,一個詞語如果有多重含義,那么就說該詞語被重載了,具體代表什么含義需要結合具體的場景。在Java中方法也是可以重載的。
在Java中,如果多個方法的名字相同,參數列表不同,則稱該幾種方法被重載了。
public class TestMethod {public static void main(String[] args) {add(1, 2); // 調用add(int, int)add(1.5, 2.5); // 調用add(double, double)add(1.5, 2.5, 3.5); // 調用add(double, double, double)}public static int add(int x, int y) {return x + y;}public static double add(double x, double y) {return x + y;}public static double add(double x, double y, double z) {return x + y + z;}}
注意:
-
方法命必須相同
-
參數列表必須不同(參數的個數不同、參數的類型不同、類型的次序必須不同)
-
與返回值類型是否相同無關
//注意:兩個方法如果僅僅只是因為返回值類型不同,是不能構成重載的public class TestMethod{public static void main(String[] args){int a = 10;int b = 20;int ret = add(a,b);System.out.println}("ret = "+ ret);}public static int add(int x,int y){return x + y;}public static double add(int x,int y){return x + y;}}//編譯出錯Test.java:13: 錯誤: 已在類 Test中定義了方法 add(int,int)public static double add(int x, int y) {^1 個錯誤
4.編譯器在編譯代碼時,會對實參類型進行推演,根據推演結果來確定調用哪個方法
3. 方法簽名
在同一個作用域中不能定義兩個相同名稱的標識符。比如:方法中不能定義兩個名字一樣的變量,那為什么類中就可以定義方法名相同的方法呢?
方法簽名即:經過編譯器編譯修改過后方法最終的名字。具體方式:方法全路徑名+參數列表+返回值類型,構成方法完整的名字
public class TestMethod {public static int add(int x, int y){return x + y;}public static double add(double x, double y){return x + y;}public static void main(String[] args) { add(1,2);add(1.5, 2.5);}
}
上述代碼經過編譯之后,然后使用JDK自帶的javap反匯編工具查看,具體操作:
-
先對工程進行編譯生成.class字節碼文件
-
在控制臺中進入到要查看的.class所在的目錄
-
輸入:javap -v字節文件名字即可
方法簽名中的一些特殊符號說明:
特殊字符 | 數據類型 |
---|---|
V | void |
Z | boolean |
B | byte |
C | char |
S | short |
I | int |
J | long |
F | float |
D | double |
[ | 數組(以[開頭,配合其他的特殊字符,表述對應數據類型的數組,幾個[表述幾維數組) |
L | 引用類型,以L開頭,以;結尾,中間是引用類型的全類名 |