在日常生活中,相同的詞可以表達多種不同的含義,特別是含義之間的差別很小時,這種方式十分有用,你可以說“清洗襯衫”,“清洗車”,“清洗狗”等等,這就相當於我們在程序中定義了一個方法名“清洗”,我們可以傳入不同的對象“襯衫”,“車”,“狗”等,而不是定義三個方法名“清洗襯衫”,“清洗車”,“清洗狗”,這樣會顯得很冗餘。
大多數程序語言(例如C)要求每個方法都會提供一個獨一無二的標識符,例如我們定義一個print()方法函數顯示整數之後,絕對不可以再用一個名字爲print()的函數來顯示一個浮點數。
而在java或者C++裏面,構造器是強制重載方法名的另一個原因,因爲構造器的名字已經由類名決定,就只能有一個構造器名字,那麼如果想用多種方式創建一個對象怎麼辦?
假設你要創建一個類,既可以用標準方式進行初始化,也可以從文件中讀取信息來初始化。這就需要兩個構造器:一個是默認構造器,另一個取字符串作爲形式參數。由於都是構造器,都需要跟類名一致,所以必須有相同的名字,爲了讓方法名相同而參數不同的構造器同時存在,必須用到方法重載。
class Tree {
int height = 5;
public Tree() { //默認的構造方法
System.out.println("Tree default height:" + height);
}
public Tree(int height) { //指定樹高度的構造方法
this.height = height;
System.out.println("Tree height:" + height);
}
}
創建Tree對象的時候,既可以沒有參數,也可以用樹的高度當參數,要支持這種創建方式,得有一個默認構造器和一個採用現有高度作爲參數的構造器。
區分重載方法
要是有幾個方法有相同的名字,java如何才能知道你指的是哪一個呢?其實很簡單,每個重載的方法都必須有一個獨一無二的參數類型列表。
參數順序不同也能夠區分兩個不同方法。不過,這種方式不推薦,這樣會使代碼難以維護。
class Test {
public void show(int i, String s) {
System.out.println("ok1");
}
public void show(String s, int i) {
System.out.println("ok2");
}
public static void main(String[] args) {
new Test().show(2, "s");
}
}
涉及基本數據類型的重載
class Test {
public void show(char c) {
System.out.println("(char):" + c);
}
public void show(byte b) {
System.out.println("(byte):" + b);
}
public void show(short s) {
System.out.println("(short):" + s);
}
public void show(int i) {
System.out.println("(int):" + i);
}
public void show(long l) {
System.out.println("(long):" + l);
}
public void show(float f) {
System.out.println("(float):" + f);
}
public void show(double d) {
System.out.println("(double):" + d);
}
}
假設現在我寫下面的測試方法:
public class Client {
public static void main(String[] args) {
Test t = new Test();
t.show(5);
}
}
輸出的結果會是:
(int):5
這是因爲java會將5當做int值來處理,所以當某個重載的方法接受int型參數,就會被調用,如果傳入的數據類型(實際參數類型)小於方法中聲明的形式參數類型,實際數據類型就會被提升(byte->short->int->long->float->double)
,char類型略有不同,如果無法找到恰好接受char參數的方法,就會把char直接提升到int型(char->int->long->float->double)
,例如:
class Test {
public void show(long l) {
System.out.println("(long):" + l);
}
public void show(float f) {
System.out.println("(float):" + f);
}
public void show(double d) {
System.out.println("(double):" + d);
}
}
public class Client {
public static void main(String[] args) {
Test t = new Test();
t.show(5);
}
}
輸出:
(long):5
char舉例:
class Test {
public void show(byte b) {
System.out.println("(byte):" + b);
}
public void show(short s) {
System.out.println("(short):" + s);
}
public void show(int i) {
System.out.println("(int):" + i);
}
public void show(long l) {
System.out.println("(long):" + l);
}
public void show(float f) {
System.out.println("(float):" + f);
}
public void show(double d) {
System.out.println("(double):" + d);
}
}
public class Client {
public static void main(String[] args) {
Test t = new Test();
char c = 'x';
t.show(c);
}
}
輸出:
(int):120
如果傳入的實際參數較大,必須進行強制類型轉換,不然會出錯。