今天來整理一下 Java 資料型別,在 Java 中資料型別可以分為兩種:
為 Java 內建(預先定義好的)的資料型別,並已保留關鍵字命名,一共有 8 種類型,包含:byte
, short
, int
, long
, float
, double
, boolean
與 char
。
這裡要來稍微討論的深入一點,primitive data type 具有 copy by value
的特性,一般來說當宣告一個變數時,電腦會將變數的值實際儲存到記憶體某個位置中。而當把 primitive data type 的變數指定給另一個變數時,新的變數會在記憶體中另找一個新的位置存放。
因此,如果我們針對變數 b 進行任意的變動,像是重新指派新的值等等,皆無法對變數 a 產生影響,看不懂這段敘述沒關係,下面來看一下圖解與範例程式碼:
// copy by value
// 宣告變數 a
int a = 10;
// 在此變數 a 會存放在記憶體的某個位置, 這裡假設為記憶體位置 x
// 指定 a 給變數 b
int b = a;
// 當把 a 指定給變數 b 時,這時因為 int 為 primitive data type 的資料型別,
// 所以,變數 b 會另外儲存在記憶體位置 y
// 修改變數 b, 不會影響到 a
b = 100;
System.out.println("value of a: " + a);
System.out.println("value of b: " + b);
// Out: value of a: 10
// Out: value of b: 100
接下來討論 Non-Primitive Data Types
參考資料型態。
Non-Primitive Data Types 又稱作 referenced data type ,除了 String 是 Java 原生定義的之外,其他都是第三方使用者創建出來的物件,所以自己於 Java 中建立的物件也都會屬於 Non-Primitive Data Types ,常見的物件型別有 String
, Array
, ArrayList
, Object
...等等。
而為何被稱作 referenced data type,是因為其具有 copy by reference
的特性,當把 non-primitive data type 的變數指定給另一個變數時,新的變數會產生一個標籤指向原變數記憶體儲存的位址;而不會實際產生一個新的值存放在記憶體之中,也就是說如果對新變數變動會直接影響到原來的變數,範例示範如下:
// copy by reference
// 宣告變數 a
String a = '10';
// 在此變數 a 會存放在記憶體的某個位置, 這裡假設記憶體位置 x
// 指定 a 給變數 b
String b = a;
// 當把 a 指定給變數 b 時,這時因為 String 為 non-primitive data type 的資料型別,
// 所以,變數 b 會產生標籤指向記憶體位置 x
// 修改變數 b, 會直接影響到 a 的值
b = '100';
System.out.println("value of a: " + a);
System.out.println("value of b: " + b);
// Out: value of a: 100
// Out: value of b: 100