JAVA編程思想學習筆記(二)---方法重載

        在日常生活中,相同的詞可以表達多種不同的含義,特別是含義之間的差別很小時,這種方式十分有用,你可以說“清洗襯衫”,“清洗車”,“清洗狗”等等,這就相當於我們在程序中定義了一個方法名“清洗”,我們可以傳入不同的對象“襯衫”,“車”,“狗”等,而不是定義三個方法名“清洗襯衫”,“清洗車”,“清洗狗”,這樣會顯得很冗餘。

        大多數程序語言(例如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

如果傳入的實際參數較大,必須進行強制類型轉換,不然會出錯。

發佈了74 篇原創文章 · 獲贊 3 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章