Java包裝類概述
Java為每個基本數據類型都提供了一個對應的包裝類
基本類型 |
包裝類 |
byte |
Byte |
short |
Short |
int |
Integer |
long |
Long |
float |
Float |
double |
Double |
char |
Character |
boolean |
Boolean |
為什么要提供包裝類?
package com.wkcto.chapter04.wrapperclass;
/**
* 為什么提供包裝類??
* 為了編程更加方便
*
* @author 蛙課網
*
*/
public class Test01 {
public static void main(String[] args) {
m1("hello"); //把"hello"字符串對象的引用傳遞給形參xx
m1(456);
/*
* 在調用方法時 ,不能直接把456 等基本類型數據傳遞給形參xx
* 這兒沒有出現錯誤, 因為系統會自動的把整數 456 轉換為對應的包裝類對象, 再把這個包裝類對象的引用傳遞給xx形參
* 在本例中,如果沒有包裝類的話, 需要定義很多的方法重載來接收不同類型的數據, 如果有了包裝類,只需要定義一個方法即可
*/
}
//定義一個方法,該方法可以接收任意類型的數據,包括整數,小數,字符,布爾, 引用類型數據都可以
public static void m1( Object xx ) { //形參xx只能接收引用類型的數據
}
}
包裝類的繼承結構圖
Java包裝類對象的創建
Character包裝類的構造方法只有一個,根據基本類型創建包裝類對象
其他的包裝類構造方法都有兩個, 根據基本類型創建包裝類對象, 根據字符串創建包裝類對象
package com.wkcto.chapter04.wrapperclass;
/**
* 創建包裝類對象
* @author 蛙課網
*
*/
public class Test02 {
public static void main(String[] args) {
//1) 根據基本類型創建包裝類對象
Boolean bb = new Boolean(true);
Character cc = new Character('A');
Integer ii = new Integer(456);
Double dd = new Double(3.14);
//2) 根據字符串創建包裝類對象, Character沒有這個構造方法
Integer i2 = new Integer("369");
Double dd2 = new Double("2.58");
//注意, 根據字符串創建包裝類對象時, 字符串要符合數字的格式
// i2 = new Integer("abc"); // java.lang.NumberFormatException 數字格式異常
dd2 = new Double("2e3"); //科學計數法
System.out.println( dd2 ); //2000.0
dd2 = new Double("147");
System.out.println( dd2 );
// dd2 = new Double("147wkcto"); //java.lang.NumberFormatException
Boolean bb2 = new Boolean("true");
System.out.println( bb2 );
//注意, Boolean包裝類會把"true"字符串轉換為true, 其他的字符串都轉換為false
bb2 = new Boolean("hehe");
System.out.println( bb2 );
}
}
Java包裝類的字段
package com.wkcto.chapter04.wrapperclass;
/**
* 包裝類的常量
* @author 蛙課網
*
*/
public class Test03 {
public static void main(String[] args) {
System.out.println( Integer.BYTES); //4
System.out.println( Integer.SIZE); //32
System.out.println( Integer.TYPE); //int
System.out.println( Integer.MIN_VALUE); //-2147483648
System.out.println( Integer.MAX_VALUE); //2147483647
System.out.println( Double.POSITIVE_INFINITY);
System.out.println( Double.NEGATIVE_INFINITY);
System.out.println( Double.NaN);
// System.out.println( 10 / 0 ); //java.lang.ArithmeticException
System.out.println( 10 / 0.0 ); //Infinity
System.out.println( -10 / 0.0 ); //-Infinity
System.out.println( 0 / 0.0 ); //NaN, Not a Number
System.out.println("----------------");
System.out.println( Character.MIN_VALUE);
System.out.println( Character.MAX_VALUE);
System.out.println( (int)Character.MIN_VALUE);
System.out.println( (int) Character.MAX_VALUE);
}
}
Java包裝類的常用方法
package com.wkcto.chapter04.wrapperclass;
/**
* 包裝類的常用 方法
* @author 蛙課網
*
*/
public class Test04 {
public static void main(String[] args) {
Integer i1 = new Integer(147);
//每個包裝類都有一個value字段,保存的是這個包裝類對應的基本類型數據
//1) 從Number繼承的方法,可以把包裝類對象轉換為基本類型的數據, 實際上是把value字段進行強制類型轉換
double dd = i1.doubleValue();
byte bb = i1.byteValue(); //-128~127
System.out.println( dd );
System.out.println( bb );
//2)包裝類都實現了Comparable接口,重寫了compareTo()方法, 可以比較兩個包裝類的大小, 根據value字段
Integer i2 = new Integer("258");
System.out.println( i1.compareTo(i2)); //-1 表示i1小于i2
Boolean bb1 = new Boolean(true);
Boolean bb2 = new Boolean(false);
System.out.println( bb1.compareTo(bb2)); //1
//3) 都重寫了equals()
System.out.println( i1.equals(i2));
System.out.println( bb1.equals(bb2));
//小數采用近似值保存,有時不準確, 如0.1在計算機中是無法準確的表示
System.out.println( Double.doubleToLongBits(1.1));
System.out.println( Double.doubleToLongBits(0.9));
System.out.println( 2 - 1.1 );
System.out.println( Double.doubleToLongBits(2-1.1));
System.out.println( Double.doubleToLongBits(2-1.1) == Double.doubleToRawLongBits(0.9));
//4) Integer.parseInt(String)可以把字符串轉換為int數據
String text = "456";
int num = Integer.parseInt(text);
System.out.println( num );
//Double.parseDouble(String)可以把字符串轉換為double數據
double pi = Double.parseDouble("3.14");
//Boolean.parseBoolean(String) 可以把字符串轉換為boolean數據
boolean flag = Boolean.parseBoolean("true");
//在把字符串轉換為基本類型數據時, 字符串要符合目標類型的格式
// num = Integer.parseInt("3.14"); //java.lang.NumberFormatException
//5) 把十進制數轉換為二進制/八進制/十六進制
System.out.println( Integer.toBinaryString(100));
System.out.println( Integer.toOctalString(100));
System.out.println( Integer.toHexString(100));
//6) toString(int) 把基本類型轉換為字符串
text = Integer.toString(100);
text = Double.toString(3.14);
text = Boolean.toString(false);
//7) valueOf() 把基本類型/字符串轉換為包裝類對象
i1 = Integer.valueOf(258);
i1 = Integer.valueOf("147"); //字符串要符合數字格式
Double double1 = Double.valueOf(3.14);
double1 = Double.valueOf("3.56");
Boolean boolean1 = Boolean.valueOf(false);
boolean1 = Boolean.valueOf("adjklfj");
}
}
Java裝箱與拆箱
裝箱就是把基本類型數據轉換為包裝類對象。
拆箱就是把包裝類對象轉換為基本類型數據。
在Java中, 裝箱與拆箱可以自動進行,
package com.wkcto.chapter04.wrapperclass;
/**
* 裝箱與拆箱
* @author 蛙課網
*
*/
public class Test05 {
public static void main(String[] args) {
Integer i1 = 789; //自動裝箱, 系統根據基本類型數據789自動創建一個包裝類對象 , 把該對象的引用保存到i1中
Integer i2 = 789; //根據789創建一個新的Integer對象, 把該對象的引用保存到i2中
int num = i1; //自動拆箱, 系統把i1對象的value字段賦值給num
//包裝類對象判等
System.out.println( i1.equals(i2)); //true
System.out.println( i1 == i2 ); //false
Integer i3 = 88;
Integer i4 = 88;
System.out.println( i3 == i4 ); //true
/*
* Java認為-128~127之間的整數是使用最頻繁的, 這個范圍內的整數裝箱后采用享元模式
* -128~127之間的整數生成的包裝類對象存儲在方法區的常量池中
* 在執行i3 = 88時, 會在常量池中創建一個包裝類對象,
* 在執行 i4 = 88時, 直接把常量池中的包裝類對象的引用賦值給i4, 即現在i3和i4引用了常量池中同一個包裝類對象
*/
Long gg1 = 123L;
Long gg2 = 123L;
System.out.println( gg1 == gg2 ); //true
}
}
練習 int/String/Integer之間的相互轉換
String text = “456”;
int num = Integer.parseInt( text );
text = “” + num;
text = String.valueOf( num );
text = Integer.toString( num )