這個系列的文章標題都是Java基礎,但是並不打算談一些所有語言共通的東西,比如變量賦值、循環、判斷等等。我覺得學習一門語言應該把注意力更多的放在它的特性上,而不是太過關注語言的通性。廢話不多說了,從這篇文章開始,正式進入java的學習吧。
基本數據類型和引用數據類型
java中的8種基本數據類型
- 數值型
- 整型:byte、int、short、long
- 浮點型:float、double
- 字符型:char
- 布爾型:boolean
除了上述8種基本數據類型以外,其餘的全部都是引用數據類型,數組也是引用類型。這兩種類型的數據之間有着本質的區別:基本類型數據指的是值,而引用類型數據指的是地址值。雖然都是值,但二者絕不是同一種東西。
在理解上面的概念之前,我們先要知道java中的兩種操作:
- =:賦值操作
- ==:比值操作
對於基本類型數據而言,賦值、比值指的是數值;對於引用類型數據而言,賦值、比值指的是地址值。(請一定要牢記此概念!)
8種基本數據類型在java中都有對應的引用類型,分別是Byte、Integer、Short、Long、Float、Double、Character、Boolean。
下面我們來看一個例子:
public class Test {
public static void main(String[] args) {
int a = 666;
int b = 666;
System.out.println(a == b); // true
Integer c = 666;
Integer d = 666;
System.out.println(c == d); // false
}
}
例子中變量a、b是基本數據類型,經過賦值操作之後變量a、b存放的都是值(666)。而對於比值操作a == b,所表達的含義應該是這樣的:666 == 666。所以打印結果爲true是合理的。
相對的,變量c、d是引用數據類型。將666賦值給變量c,變量c所存放的是666在內存中地址值(假設該地址值是15db9742),而變量d中所存放的則是另一個666在內存中的地址值(假設這個地址值是15db9747)。所以對於比值操作c == d,它所表達的含義是這樣的:15db9742 == 15db9747。顯然它們是不相等的,所以輸出的打印結果爲false。
具體可以參考下圖:
數組
8種基本數據類型中並不包含數組,換而言之,數組是一種引用數據類型。所以,一個數組類型變量存放的是地址值。
數組聲明
- 一維數組
int[] arr; // 標準的聲明格式
int arr[]; // 當然你也可以這樣聲明
- 二維數組
int arr[][]; // 標準的聲明格式
int[] arr[]; // 聲明數組對[]的位置沒有強制要求,只要[]出現在類型之後即可
數組初始化
數組初始化有兩種方式:靜態初始化和動態初始化。
- 靜態初始化
int[] arr = new int[] {1,2,3};
int[] arr = {1,2,3}; // 簡化的靜態初始化
- 動態初始化
int[] arr = new int[3];
數組的靜態初始化需要提供元素的初始值(0~任意個),動態初始化則需要指定元素的個數(>=0)。需要注意的是,不要將靜態初始化和動態初始化混在一起使用。
int[] arr = new int[3]{1,2,3}; // 錯誤的初始化
使用動態初始化創建數組實例,數組中的每個元素也被賦予了初始值,該初始值是元素數據類型的默認值初始值。不同類型數據的默認初始值見下表:
數據類型 | 默認值 |
---|---|
byte,short,int,long | 0 |
float,double | 0.0 |
char | 一個空字符,即 ‘\u0000’ |
boolean | false |
引用類型 | null |
數組一旦初始化完成,該數組的長度就被固定,無法再進行修改。
二維數組初始化
二維數組的初始化和一維數組略有不同,這個不同主要體現在動態初始化上。我們先來看二維數組是怎麼進行靜態初始化的:
int[][] arr = {{1,2,3}, {4,5,6}, {7,8,9}};
上面我們聲明瞭一個由3個等長的一維數組所組成的二維數組,這不難理解。接下來我們稍作修改:
int[][] arr = {{1,2,3}, {4,5}, {6}};
上面的二維數組所包含的每個一維數組的長度都不一樣。既然如此,那麼我們可以試着這樣來動態初始化二維數組:
int[][] arr = new int[3][];
上面聲明的二維數組是由3個不定長的一維數組所組成的,換而言之,這個二維數組中所包含的是三個尚未創建的一維數組,這樣一來,二維數組便有了極大的靈活性。