2017年6月17日 星期六

呼叫 Overloading、快速判斷奇偶數、三元運算子問題、判斷 null

※呼叫 Overloading

public static void main(String[] args) {
    xxx(1);
    xxx(new Integer(1));
    xxx("String");
}
    
public static void xxx(Integer x){
    System.out.println("Integer");
}
    
public static void xxx(int x){
    System.out.println("int");
}
    
public static void xxx(Object x){
    System.out.println("Object");
}

※1.
※基本型態要注意隱性轉換的問題
以short 為例:
順序如下:
short --> int --> long --> float --> double --> Short --> Number --> Object

又以 Short 為例
順序如下:
Short --> Number --> Object --> short --> int --> long --> float --> double

所以結果為 基本型態 --> Wrapper類別 --> Number --> Object 或
Wrapper類別 --> Number --> Object --> 基本型態

數字和浮點數都有繼承 Number,所以 Wrapper 類別沒有對應到會調用 Number,但 char 和 boolean 沒有繼承 Number,所以 Wrapper類別沒有對應到會調用 Object

※2.以上加上 char 和 Character 也有隱性轉換的問題 (int 並不會轉成char;但 char 會轉成 int)
順序如下:
char --> int --> --> long --> float --> double --> Character --> Object --> 都沒有就編譯錯誤 (和 Integer 沒關係)
Character --> Object --> char --> int --> --> long --> float --> double 都沒有就編譯錯誤 (和 Integer 沒關係)

※3.boolean 是 boolean --> Boolean --> Object,不會轉換成數字


※4.可以強制調用,如 int 可以用  (int) new Integer(1)

※5.如果給 null,必需剛好只有一個可接收 null 參數的方法,否則會編譯錯誤(ambiguous)
但 Object 參數的方法是個例外,都找不到合適的參數時,會呼叫
所以最多可以有兩個 overloading,Object 和 Wrapper
如果想直接呼叫 Object 參數的方法,可用「(Object) null」,別懷疑,可以強轉的,這時不管有幾個 overloading 都可以了
當然想要 (Integer) null 也是可以的



※使用建構子也有相同的情況

以上總結:
基本類型最終會找到 Object 為止;Wrapper 經過 Object 後,會回到基本類型
基本類型:基本型態(注意隱式轉換) --> Wrapper 類別 --> Object
Wrapper 類型:Wrapper類別-->Object-->基本型態(注意隱式轉換)


※快速判斷奇偶數

public static boolean isEven(int num){
    //    return num % 2 != 1;
    //    return num % 2 == 0;
    return (num & 1) == 0;
}

※第一個有可能會回傳負數,所以不建議使用

※可用第三個取代第二個,速度會更快,因為二進制比較快



※三元運算子問題

char x = 'a';
int i = 0; // 97;final--> a
System.out.println(true ? x : 0); // a
System.out.println(true ? x : i); // 97
System.out.println(false ? i : x); // 97
System.out.println(false ? 0 : x); //a

※第一個回傳a,但第二個和第三個居然回傳97,也就是 char 強轉成 int 了,可在 int 加上 final 關鍵字,這樣就不會有強轉的問題了

※使用三元運算子,回傳時最好型態都相同



※判斷 null

如果是 null == 1,像寫死的數字是基本資料類型,因為沒有 null,所以會報錯,但其他就沒有關係了,如 Map、List、Integer 這些有 null 的可以判斷成功

沒有留言:

張貼留言