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.如果沒有 int 參數的方法,傳 int 會呼叫 Integer 參數的方法
但如果沒有 int 和 Integer 參數的方法,就會呼叫 Object 參數的方法
所以結果為 基本型態-->Wapper類別-->Object
※注意隱性轉換的問題
以short 為例:
順序如下:
short --> int --> Short --> Integer --> Object

又以 Short 為例
順序如下:
Short --> Object --> short --> int


※2.如果沒有 Integer 參數的方法,傳 Integer 會呼叫 Object 參數的方法
但如果沒有 Integer 和 Object 參數的方法,就會呼叫 int 參數的方法
所以結果為 Wapper類別-->Object-->基本型態
如果想強制呼叫 int 可以用  (int) new Integer(1)

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

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

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

以上總結:
基本類型最終會找到 Objcet 為止;Wrapper 經過 Object 後,會回到基本類型
基本類型:基本型態(注意隱形轉換)-->Wapper類別-->Objec
Wrapper 類型:Wapper類別-->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 的可以判斷成功

沒有留言:

張貼留言