跟其他的程式語言一樣,Java 也具變數與資料型別的概念。
變數
變數宣告
相對於 Python, JavaScript...,Java 是較為嚴謹的程式語言風格(強型別語言),編譯器要知道存取需要多少空間,宣告變數時需要指定資料型別。
int numInt = 10;
float numFloat = 10.0f, double numDouble = 10.0;
char ch = 'a';
boolean bl = true;
當宣告完變數(numA),將不同型別的變數互相指派給變數(numB → numA),有時候會報錯,是因為每個型別被分配的記憶體都不一樣,遇到這問題,就得進行「型別轉換」。
int a = 10;
float b = 10.0f;
a = b; // Error
Java 儲存變數的記憶體分配方式舉例
Memory Location | value | Name |
---|---|---|
5004 | ||
5008 | 10 | a |
5012 | 10.0f | b |
(因為 b 需要記憶體大小 > a 需要記憶體大小,下面會提到)
變數的命名上有幾個原則:
- 接受英文字母、數字、
_
或$
符號 - 開頭不能是數字
- 不能包含空格
- 不能使用關鍵字或保留字(如:public, int...)
- 區分大小寫
建議命名時使用駝峰命名法(CamelCase),與類別或其他作區別。
資料型別
用來定義變數或常數的型態,Java 的資料型別分成兩種類型:基本資料型別(Primitive Type)與參考資料型別(Reference Type)。強型別的特性,分配給底下不同資料型別的記憶體大小也不同,決定變數或常數可以儲存的資料範圍。
探討資料型別以前,先來說說常值(literal,或被稱為字面常數),代表在程式碼裡固定資料的寫法格式,也是我們常在說的「值」,前面看到的 10, 10.0, 10.0f, 'a', "Hi", true 這些,都屬於常值(要注意的是字串是參考型別,非原始型別,後面會提到)。
// 資料型別 變數名稱 = 常值
int data = 1;
基本資料型別(Primitive Type)
Integer
byte, short, int, long
Floating Point
float, double
Boolean
boolean
Character
char
基本型別底下的各種常值有固定的記憶體長度跟有效範圍,以下以類別分類,逐個說明常值:
整數 Integer
byte numByte = 12;
short numShort = 128;
int numInt = 12345;
long numLong = 323593550;
long numLong2 = 15000000000L;
整數類別預設指 int,當超過 int 的範圍才會用到 long(宣告 long 型常數後面需要加上 l 或 L)
整數可用二進位、十進位、八進位、十六進位表示:
二進位制: 0b101, 0B101(十進位表示為 5)
八進位制: 014(十進位表示為 12)
十六進位制: 0x1A, 0X1A(十進位表示為26)
型別 | 位元數 | 範圍 |
---|---|---|
byte | 8 | -128 ~ +127 |
short | 16 | -2^15 ~ 2^15-1 |
int | 32 | -2^31 ~ 2^31-1 |
long | 64 | -2^63 ~ -2^63-1 |
浮點數 Float Point
當用到小數點時就必須使用浮點數,浮點數可以用兩種方式表達:
- 常見的小數點,例如 3.14
- 科學符號(使用 IEEE-754 的規範),例如 1.23e+4
預設型別為 double (倍精度浮點數),如果要指定 float 的話在數字後面加上 f 或 F 就可以。
型別 | 位元數 | 範圍 |
---|---|---|
float | 32 | -2^128 ~ +2^127 |
double | 64 | -2^1024 ~ +2^1023 |
布林 Boolean
布林常值只有 true 和 false 兩種情況,只表示一位元 0 或 1 的資料,比較其他常值,型別大小沒特別被 Java 精確定義。另外需注意在 Java 不允許使用數值 1 和 0 代替 true 和 false。
型別 | 位元數 | 範圍 |
---|---|---|
boolean | true or false |
字元 Character
Java 使用 Unicode 來表示所有的字元,例如 'a', '5', '嗨' 都是合法的字元常值,以及跳脫字元也包含在內。
一般字元表示方式: 'a', '字', '%'
轉役序列表示方式: '\n', '\', '\r'
Unicode 表示方式: '\u5b57'
型別 | 位元數 | 範圍 |
---|---|---|
char | 16 | ISO 萬用碼 (Unicode) '\u0000' (0) 到 '\uffff' (65,535) |
數值資料大小比較
double > float > long > int > short > byte
常數 Constant
一般來說,會使用變數去儲存值(常值),隨著程式執行或計算需要,會改變原本儲存的值,但假設某些值不想在程式中被改變,就可以宣告為常數
通常會使用 final 關鍵字 + 大寫字母配底線宣告常數,像是
// 常數宣告要大寫,分隔單字使用底線
final int MAX_SIZE = 100;
Java 原生類別中也有定義好的常數,以 Byte 為例子:
Byte.SIZE
Byte.BYTES
Byte.MAX_VALUE
Byte.MIN_VALUE
名詞比較
常值:就是一般說的值,像整數、浮點數,到字元、字串都是常值。
變數:宣告指定名稱跟型別,方便程式運作需要重複取用值(常值)時,可以直接到記憶體取值,也因需要記憶體空間存放,宣告時需要同時指定名稱跟資料型態。
常數:有些常值在程式執行過程不會變動(例如:圓周率、稅率…),通常會用常數的型態儲存它們,