※呼叫 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-->基本型態(注意隱形轉換)
※第一個有可能會回傳負數,所以不建議使用
※可用第三個取代第二個,速度會更快,因為二進制比較快
※第一個回傳a,但第二個和第三個居然回傳97,也就是 char 強轉成 int 了,可在 int 加上 final 關鍵字,這樣就不會有強轉的問題了
※使用三元運算子,回傳時最好型態都相同
※快速判斷奇偶數
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 關鍵字,這樣就不會有強轉的問題了
※使用三元運算子,回傳時最好型態都相同
沒有留言:
張貼留言