極端條件下方法重載探究

import java.io.Serializable;

/**
 * @author: yingch
 * @date: 2020/6/1 19:16
 * @description:
 */
public class StudyOverload {

    public static void studyOverload(char c) {// 1
        System.out.println("studyOverload char:" + c);
    }

    public static void studyOverload(int i) {//2
        System.out.println("studyOverload int:" + i);
    }

    public static void studyOverload(long l) {//3
        System.out.println("studyOverload long:" + l);
    }

    public static void studyOverload(float f) {//4 90.0
        System.out.println("studyOverload float:" + f);
    }

    public static void studyOverload(double d) {//5 90.0
        System.out.println("studyOverload double:" + d);
    }

    public static void studyOverload(Character c) {//6 Z
        System.out.println("studyOverload Character:" + c);
    }

    public static void studyOverload(Serializable s) {//7 Z
        System.out.println("studyOverload Serializable:" + s);
    }

    public static void studyOverload(Object o) {//8 Z
        System.out.println("studyOverload Object:" + o);
    }


    public static void studyOverload(char... c) {//9 studyOverload char...:[C@4ca8195f
        System.out.println("studyOverload char...:" + c);
    }


    @org.junit.Test
    public void main() {
        studyOverload('Z');
    }

}

1.運行代碼後第1次執行後輸出信息:studyOverload char:Z

2.將第1步執行的方法註釋,運行代碼後第2次執行後輸出信息:studyOverload int:90

3.將第2步執行的方法註釋,運行代碼後第3次執行後輸出信息:studyOverload long:90

4.將第3步執行的方法註釋,運行代碼後第4次執行後輸出信息:studyOverload float:90.0

5.將第4步執行的方法註釋,運行代碼後第5次執行後輸出信息:studyOverload double:90.0

6.將第5步執行的方法註釋,運行代碼後第6次執行後輸出信息:studyOverload Character:Z

7.將第6步執行的方法註釋,運行代碼後第7次執行後輸出信息:studyOverload Serializable:Z

8.將第7步執行的方法註釋,運行代碼後第8次執行後輸出信息:studyOverload Object:Z

9.將第8步執行的方法註釋,運行代碼後第9次執行後輸出信息:studyOverload char...:[C@4ca8195f

說明:

“Z”除了表示字符串之外還可以代表數字90,這樣操作2345就可以解釋的通了,自動轉換的類型按照

char->int->long->float->double的順序進行匹配,不會進行byte或者short的轉型,因爲這種轉型是不安全的

第6步將“Z”包裝爲他的封裝類java.lang.Character,Character類包裝一個對象中的基本類型 char的值。所以匹配到了Character的重載,第7步就有點讓人看不懂了,字符串和序列化有啥關係?java.lang.Serializable 這個類是java.lang.Character類實現的一個接口,所以會找到他實現的接口或者父類,Character還實現了另一個接口java.lang.Comparable<Character>,兩者的優先級是一樣的,Comparable<T>該接口對實現它的每個類的對象強加一個整體排序。這些都註釋後,找不到了只能往父類上去轉,按照繼承關係從下往上搜索,從下到上優先級原來越低,因此,第8步找到了父類Object,在將之註釋就剩一個變長參數了,由此可知變長參數的重載優先級是最低的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章