包裝類
java語言是面向對象的語言,而基本資料類型的資料不是對象,但是有的時候我們
需要研究使用基本資料類型的資料,需要将之轉換成對象來使用,這個時候我們可
以将基本資料類型包裝成引用類型。
每一個基本資料類型都對應一個包裝類:
byte----->Byte
short---->Short
int------>Integer
long----->Long
float---->Float
double--->Double
char----->Character
boolean-->Boolean
特點:
(1)都是final修飾的
(2)一經建立的對象裡的資料不可變
(3)Character和Boolean的父類是Object,其他六種的父類是Number類型
(Number是抽象類)
Integer:
常用構造器:
Integer(int value)
通過指定的基本資料類型的資料建構一個Integer對象
Integer(String str)
通過指定的字元串的資料建構一個Integer對象
常用方法:
int intValue();
作用是将包裝類的對象拆箱成基本資料類型
static int parseInt(String s)
作用是将字元串轉換成10進制的基本資料類型
static Integer valueof(String s)
作用是将字元串轉成Integer對象
JDK1.5以後支援自動裝箱和拆箱(reg:TextBox1)
/**
* jdk1.5以後支援自動裝箱和拆箱
* */
public class TextBox1 {
public static void main(String[] args) {
/*
* 發生了自動裝箱操作,相當于調用了Integer.valueOf(5)
* 5被包裝成對象,存在堆中。将位址值給了變量i
* */
Integer i = 5;
/*
* 發生了自動拆箱操作,相當于i.intValue()
* 對象i被拆箱成基本資料類型5存儲在num空間裡
*/
int num = i;
/*
*任何引用資料類型的變量不可以進行運算。
*除了字元串拼接
*/
Integer n1 = new Integer(10);
Integer n2 = new Integer(20);
Integer n3 = n1+n2;
/*
* n1發生了自動拆箱,即n1.intValue(),變成基本資料類型
*n2發生了自動拆箱,即n2.intValue(),變成基本資料類型
*然後進行運算,結果為基本資料類型的30
*30自動裝箱,底層調用Integer.valueOf(30),
*變成對象n3
*/
System.out.println(n3);
}
}
包裝類的常量池
基本資料類型的包裝類除了浮點數類型都有自己的常量池。當将基本資料類型進行自動裝箱時,裝箱後的對象的字面值,如果是在 -128~127會存儲在常量池中,會先檢查常量池中是否有相同字面值的對象,如果有,則将常量池的位址給引用變量。
public class Text02 {
public static void main(String[] args) {
Integer i1 = new Integer(100);
Integer i2 = new Integer(100);
System.out.println(i1 == i2);// false,不是自動裝箱時資料不是存在常量池中
// 測試自動裝箱
Integer i3 = 100;// 100裝箱後變成對象,存入常量池中
Integer i4 = 100;
/*
* 100裝箱後,去常量池中查找是否有相同值的對象,發現存在 就将常量池中的i3值給了i4
*/
System.out.println(i3 == i4);
Byte i5 = 100;
Byte i6 = 100;
System.out.println(i5 == i6);
/*
* 整數的包裝類 Byte,Short,Integer,Long都有自己的常量池(字面量-128~127)
* Character也有自己的常量池: '\u0000'~'\u007f'
*
* Boolean也有常量池
*
* 浮點數類型的包裝類沒有常量池
*/
System.out.println(i5 == (Number) i3);// Byte和Integer的父類是Number,用Number進行強轉
Character c1 = (char) (-1);
Character c2 = (char) (-1);
System.out.println(c1 == c2);
Boolean f = true;
Boolean f1 = true;
System.out.println(f == f1);
}
}