標籤:long 程式 面向 設計 head 間接 類型 自動 rac
1、前言:Java是典型的物件導向程式設計語言,但其中有8種基礎資料型別 (Elementary Data Type)不支援物件導向編程,基礎資料型別 (Elementary Data Type)不具備對象的特性,沒有屬性和方法;Java為此8種基礎資料型別 (Elementary Data Type)設計了對應的類(封裝類),使之相互轉換,間接實現基礎資料型別 (Elementary Data Type)具備對象特性,豐富基礎資料型別 (Elementary Data Type)操作;
| 基礎資料型別 (Elementary Data Type) |
封裝類 |
| byte |
Byte |
| short |
Short |
| int |
Integer |
| long |
Long |
| char |
Character |
| float |
Float |
| double |
Double |
| boolean |
Boolean |
註:int是基本數量類型,Integer是類;int和Ingeger初始值不同(int預設值0 Ingeger預設值null);Integer包含屬性和方法,int則沒有;基礎資料型別 (Elementary Data Type)和封裝類相互轉換的過程叫裝箱和拆箱;
2、裝箱:基礎資料型別 (Elementary Data Type)轉換成對應的封裝類(int——>Integer);
1 Integer i = new Integer(10); // 手動裝箱2 Integer i = 10; // 自動裝箱
3、拆箱:封裝類轉換成基礎資料型別 (Elementary Data Type)(Integer——>int);
1 Integer i =10; // 自動裝箱2 int m = i; // 自動拆箱3 int n = i.intValue(); // 手動拆箱
4、自動裝箱和自動拆箱:Java 1.5以後才有自動裝箱、拆箱的特性;自動裝箱是通過封裝類的valueOf方法實現;自動拆箱是通過封裝類的xxxValue方法實現;
1 Integer i = Integer.valueOf(10); // 調用valueOf方法自動裝箱2 int n = i.intValue(); // 調用intValue方法自動拆箱
註:自動裝箱會隱式地建立對象,在一個迴圈中注意自動裝箱問題,影響程式效能;
5、equals 和 == 比較:當 "=="運算子的兩個運算元都是封裝類,則是比較指向的是否是同一個對象,而如果其中有一個運算元是運算式(即包含算術運算)則比較的是數值(觸發自動拆箱);對於封裝類,equals方法不會進行類型轉換;
1 public class Main { 2 public static void main(String[] args) { 3 4 Integer a = 1; 5 Integer b = 2; 6 Integer c = 3; 7 Integer d = 3; 8 Integer e = 321; 9 Integer f = 321;10 Long g = 3L;11 Long h = 2L;12 13 System.out.println(c==d); // true14 System.out.println(e==f); // false15 System.out.println(c==(a+b)); // true16 System.out.println(c.equals(a+b)); // true17 System.out.println(g==(a+b)); // true18 System.out.println(g.equals(a+b)); // false19 System.out.println(g.equals(a+h)); // true20 }21 }
解析:JVM會緩衝-128到127的Integer對象(Short、Byte、Character、Long與Integer類似),所以第一個是同一個對象true,第二個是new的新對象false;第三個有+法運算比較的是兩邊的值true;第四個有+法運算且兩邊的資料類型相同true;第五個同四先求+法求和 ,==會進行類型轉換(Long)true;第六個先+法求和,equals不會類型轉換false;第七個先+法求和(觸發拆箱,變成了int類型和long類型相加,這個會觸發類型晉陞,結果是long類型的)equals比較時觸發裝箱比較兩邊都是Long類型結果true;
Java知識點梳理——裝箱和拆箱