包裝類的使用

小濤今天沒敲程式碼發表於2020-11-13

包裝類的使用

b站學習視訊以及筆記-尚矽谷_Java零基礎教程

java入門必備-適合初學者的全套完整版教程(宋紅康主講)

1. 為什麼要有包裝類(或封裝類)

為了使基本資料型別的變數具有類的特徵,引入包裝類。就比如說你int num1 = 10;這個num1是不能像物件一樣去(物件.方法)的,但是一使用了包裝類以後,就能它呼叫一些方法。當然,有時候我們也需要對包裝類的物件進行運算,所以我們又需要將它轉換為基本資料型別。

2. 基本資料型別與對應的包裝類:

image-20201112130937752

3. 需要掌握的型別間的轉換:(基本資料型別、包裝類、String)

簡易版:

image-20201112131250004

基本資料型別<—>包裝類:JDK 5.0 新特性:自動裝箱 與自動拆箱
基本資料型別、包裝類—>String:呼叫String過載的valueOf(Xxx xxx)
String—>基本資料型別、包裝類:呼叫包裝類的parseXxx(String s)
注意:轉換時,可能會報NumberFormatException

	//基本資料型別 --->包裝類:呼叫包裝類的構造器
	//單元測試類
	@Test
	public void test1(){
		
		int num1 = 10;
		System.out.println(num1);//10
//		System.out.println(num1.toString());報錯,因為num1是基本資料型別,不是一個物件。
        //轉換為包裝類,就可以呼叫方法
		Integer in1 = new Integer(num1);
		System.out.println(in1.toString());//10
		
		Integer in2 = new Integer("123");
		System.out.println(in2.toString());//123
		
		//報異常
//		Integer in3 = new Integer("123abc");執行時異常,不能有String型別
//		System.out.println(in3.toString());
		
		Float f1 = new Float(12.3f);
		Float f2 = new Float("12.3");
		System.out.println(f1);//12.3
		System.out.println(f2);//12.3
		
		Boolean b1 = new Boolean(true);
		Boolean b2 = new Boolean("TrUe");
		System.out.println(b2);//true
		Boolean b3 = new Boolean("true123");
		System.out.println(b3);//false
		
		
		Order order = new Order();
		System.out.println(order.isMale);//false
		System.out.println(order.isFemale);//null
	}

	//包裝類--->基本資料型別:呼叫包裝類Xxx的xxxValue()
	@Test
	public void test2(){
		Integer in1 = new Integer(12);
		
		int i1 = in1.intValue();
		System.out.println(i1 + 1);//13
		
		
		Float f1 = new Float(12.3);
		float f2 = f1.floatValue();
		System.out.println(f2 + 1);//13.3
	}


	/*
	 * JDK 5.0 新特性:自動裝箱 與自動拆箱
	 */
	@Test
	public void test3(){
//		int num1 = 10;
//		//基本資料型別-->包裝類的物件
//		method(num1);//10
		
		//自動裝箱:基本資料型別 --->包裝類
		int num2 = 10;
		Integer in1 = num2;//自動裝箱
		
		boolean b1 = true;
		Boolean b2 = b1;//自動裝箱
		
		//自動拆箱:包裝類--->基本資料型別
		System.out.println(in1.toString());
		
		int num3 = in1;//自動拆箱
		
	}

	public void method(Object obj){
		System.out.println(obj);
	}
	
	//基本資料型別、包裝類--->String型別:呼叫String過載的valueOf(Xxx xxx)
	@Test
	public void test4(){
		
		int num1 = 10;
		//方式1:連線運算
		String str1 = num1 + "";
		//方式2:呼叫String的valueOf(Xxx xxx)
		float f1 = 12.3f;
		String str2 = String.valueOf(f1);
		
		Double d1 = new Double(12.4);
		String str3 = String.valueOf(d1);
		System.out.println(str2);//"12.3"
		System.out.println(str3);//"12.4"
		
	}

	//String型別 --->基本資料型別、包裝類:呼叫包裝類的parseXxx(String s)
	@Test
	public void test5(){
		String str1 = "123";
		//錯誤的情況:
//		int num1 = (int)str1;
//		Integer in1 = (Integer)str1;
		//可能會報NumberFormatException
		int num2 = Integer.parseInt(str1);
		System.out.println(num2 + 1);//124
		
		String str2 = "true1";
		boolean b1 = Boolean.parseBoolean(str2);
		System.out.println(b1);//false
	}

	class Order{
	
	boolean isMale;
	Boolean isFemale;
}

4. 面試題

/*
 * 關於包裝類使用的面試題
 * 
 * 
 */
public class InterviewTest {

	@Test
	public void test1() {
        //三目運算子,編譯時,前面的和後面的型別必須統一,所以前面的Integer型別會自動提升為Double型,所以結果不為1,而是1.0,
		Object o1 = true ? new Integer(1) : new Double(2.0);
		System.out.println(o1);// 1.0

	}

	@Test
	public void test2() {
		Object o2;
		if (true)
			o2 = new Integer(1);
		else
			o2 = new Double(2.0);
		System.out.println(o2);// 這裡的結果為1,不需要統一型別。

	}

	@Test
	public void test3() {
		Integer i = new Integer(1);
		Integer j = new Integer(1);
		System.out.println(i == j);//false
		
		//Integer內部定義了IntegerCache結構,IntegerCache中定義了Integer[],
		//儲存了從-128~127範圍的整數。如果我們使用自動裝箱的方式,給Integer賦值的範圍在
		//-128~127範圍內時,可以直接使用陣列中的元素,不用再去new了。目的:提高效率
		
		Integer m = 1;
		Integer n = 1;
		System.out.println(m == n);//true

		Integer x = 128;//相當於new了一個Integer物件
		Integer y = 128;//相當於new了一個Integer物件
		System.out.println(x == y);//false
	}

}

結果:

image-20201112150922938

相關文章