Java大一統--包裝類與自動裝箱、拆箱

1. 基本數據類型

1.1 基本類型並不是對象

大一統是很重要的,就像秦國統一六國,要搞車同軌、書同文、行同倫,統一的制度便於統一的管理。

但是Java卻沒有做到,雖然號稱一切都是對象,但是實際上還有一些不屬於對象的基本數據類型,他們就是非常出名的:

  • byte
  • short
  • int
  • long
  • char
  • float
  • double
  • boolean

雖說一切都是對象,但是尷尬如下,基本類型並不是對象。

	public static void main(String[] args) {
		Object obj = new Object();
		String str = new String();
		WrapperDemo wrapperDemo = new WrapperDemo();
		int num = 1;

		System.out.println(obj instanceof Object);// 輸出true
		System.out.println(str instanceof Object);// 輸出true
		System.out.println(wrapperDemo instanceof Object);// 輸出true
		System.out.println(num instanceof Object);// 報錯 Incompatible conditional operand types int and Object
	}

1.2 無法完成大一統操作

這樣不好,如果不能提供一個最基礎的抽象,那麼勢必有一些方法,沒法同時兼容基本數據類型和引用數據類型。

下面的方法,就很尷尬了,因爲無法支持基本數據類型,所以功能就像被閹割了。

	/**
	 * 獲取一切對象的類型名稱
	 */
	public static String getObjectType(Object obj) {
		return obj.getClass().getName();
	}

2. 包裝類

Java開發者也發現這個問題,所以提供了包裝類,爲8中基本類型定義了對應的引用類型。

基本類型 對應包裝類
byte Byte
short Short
int Integer
long Long
char Character
float Float
double Double
boolean Boolean

有了包裝類,我們就可以統一全部的數據類型了,當我定義屬性、參數的時候,就可以有一個抽象的根基了。如下所示,一切都可以用對象來表示。

public static void main(String[] args) {
		Object obj = new Object();
		String str = new String();
		WrapperDemo wrapperDemo = new WrapperDemo();
		Integer num = 1;

		System.out.println(obj instanceof Object);// 輸出true
		System.out.println(str instanceof Object);// 輸出true
		System.out.println(wrapperDemo instanceof Object);// 輸出true
		System.out.println(num instanceof Object);// 輸出true
	}

3. 自動裝箱、拆箱

但是大家還是習慣於用int這樣的基本類型啊,誰閒着沒事寫Integer呢,想必人很少吧。

沒事,JDK1.5開始,提供了自動裝箱、自動拆箱的功能。例如:

	public static void main(String[] args) {
		int a = 1;
		Integer b = a;// 自動裝箱:基本類型的變量-->包裝類變量
		int c = b;// 自動拆箱:包裝類變量-->基本類型變量
		System.out.println("a:" + a + " b:" + b + " c:" + c);// 輸出 a:1 b:1 c:1
	}

看着是不是沒啥意思,其實這就實現了向前的自動兼容。看下面的例子:

public class WrapperDemo {
	public static void main(String[] args) {
		String str = "abc";
		Integer num1 = 200;
		int num2 = 100;
		System.out.println(getObjectType(str));//輸出java.lang.String
		System.out.println(getObjectType(num1));//輸出java.lang.Integer
		System.out.println(getObjectType(num2));//輸出java.lang.Integer
	}

	/**
	 * 獲取一切對象的類型名稱
	 */
	public static String getObjectType(Object obj) {
		return obj.getClass().getName();
	}
}

str和num1的類型輸出很好理解,num2爲啥會輸出Integer呢。

num2會自動裝箱成Integer類型,然後Object類型又是所有類型的基類,所以可以接受Integer類型的參數,所以可以打印出java.lang.Integer

4. 小結

通過包裝類,提供了全局統一視角,讓一切皆爲對象成爲現實。

通過自動裝箱、拆箱,實現了對原有基本類型的向前兼容,無縫銜接。

這是思想的進步啊,通過更加徹底的抽象,可以提供更加普適的操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章