[Java_note]多載(Overload), 覆寫(Override), 多型(Polymorphism)


Posted by tzutzu858 on 2020-07-24

多載(Overload), 覆寫(Override), 多型(Polymorphism)的差別
先寫多載(Overload),之後再慢慢補(但我之後真的會補嗎@@)


function overloading 是 Ada、C++、C#、D 和 Java 等程式語言中具有的一項特性,這項特性允許建立數項名稱相同但輸入輸出類型或個數不同的子程式,它可以簡單地稱為一個單獨功能可以執行多項任務的能力。維基百科

今天我想引入的參數數量不同,或是型態不同,但明明就是用一樣的 function , 那這樣就要寫一拖拉庫的 function ,命名時也會很困擾,可讀性不佳,所以就可以用到 java 的多載(Overload)特性啦~
例如 System.out.println()就是用多載(Overload)特性,不然怎麼能把數字、字串全都印出來。或是很多內建函式,會發現名稱一樣,但需要引入的參數不一樣。

public static void add (int a) {
    System.out.println("result = " + a );
}

public static void add (int a, int b) {
    System.out.println("result = " + (a+b));
}

public static void add (int a, int b, int c) {
    System.out.println("result = " + (a+b+c));
}
add(10);
add(10, 20);
add(10, 20, 30);

所以當我今天想做一個加法的 function ,我都命名為 add,依照引數不同,運行時,JVM 便會指定對象的類型並且運行該對象的方法。但這樣有個問題,如果我要做一百個數字相加,我不就要寫一百個 function,這樣也太累了。因此可以用...的寫法

public class Add {

    public static void main(String[] args) {
        add(10);
        add(10, 20);
        add(10, 20, 30);
    }
    public static void add (int a,int... b) { // 這邊表示一定要至少一個引數進來,如果沒有這個限定,那()裡寫 int... b 就行了,它其實就是一個陣列
        int sum = 0 ;
        sum += a;
        for (int i : b) {
            sum += i;
        }
        System.out.println("result = "+ sum );
    }

回傳型態也可以不同

public static void main(String[] args) {
        System.out.println("result = " + add(10));
        System.out.println("result = " + add(10, 20));
        System.out.println("result = " + add(10, 20, 30));
    }

    public static int add(int a) {
        return a;
    }

    public static String add(int a, int b) {
        return "我不知道答案";
    }

    public static double add(int a, int b, int c) {
        return (a + b + c);
    }

Overload 和 Override 的差別

區別點 多載(Overload) 覆寫(Override)
參數列表 必須修改 一定不能修改
返回類型 可以修改 一定不能修改
異常 可以修改 可以減少或刪除,一定不能拋出新的或者更廣的異常
訪問 可以修改 一定不能做更嚴格的限制(可以降低限制)









Related Posts

與 DDoS 奮戰:nginx, iptables 與 fail2ban

與 DDoS 奮戰:nginx, iptables 與 fail2ban

Day02  深入了解 Lazy-load 的背後實作 - Intersection Observer API

Day02 深入了解 Lazy-load 的背後實作 - Intersection Observer API

30-Day LeetCoding Challenge 2020 April Week 1 || Leetcode 解題

30-Day LeetCoding Challenge 2020 April Week 1 || Leetcode 解題


Comments