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. 小結
通過包裝類,提供了全局統一視角,讓一切皆爲對象成爲現實。
通過自動裝箱、拆箱,實現了對原有基本類型的向前兼容,無縫銜接。
這是思想的進步啊,通過更加徹底的抽象,可以提供更加普適的操作。