Java 變數 (Variables)
變數是用來儲存資料的容器,每個變數都有名稱和資料型別。
宣告變數
Java 是靜態型別語言,宣告變數時必須指定資料型別:
// 語法:資料型別 變數名稱;
int age;
String name;
double price;
初始化變數
宣告變數時可以同時賦值:
int age = 25;
String name = "Alice";
double price = 99.5;
boolean isActive = true;
也可以先宣告,之後再賦值:
int score;
score = 100;
同時宣告多個變數
// 同一型別可以一起宣告
int x, y, z;
int a = 1, b = 2, c = 3;
// 不建議這樣寫(可讀性差)
int i = 1, j = 2, k = 3;
// 建議分開宣告
int i = 1;
int j = 2;
int k = 3;
變數命名規則
合法的變數名稱:
- 可以包含字母、數字、底線
_、錢字號$ - 必須以字母、底線或錢字號開頭(不能以數字開頭)
- 區分大小寫
- 不能使用 Java 保留字
// 合法的變數名稱
int age;
int _count;
int $price;
int myNumber;
int my_number;
int myNumber2;
// 不合法的變數名稱
// int 2number; // 不能以數字開頭
// int my-number; // 不能使用連字號
// int class; // 不能使用保留字
命名慣例
Java 變數通常使用 camelCase(駝峰式命名):
// 好的命名
int studentAge;
String firstName;
double totalAmount;
boolean isLoggedIn;
// 不好的命名
int x; // 太短,無意義
int studentage; // 沒有使用 camelCase
int STUDENTAGE; // 全大寫通常用於常數
常數
使用 final 關鍵字宣告常數,常數的值不能被修改:
final double PI = 3.14159;
final int MAX_SIZE = 100;
final String APP_NAME = "MyApp";
// PI = 3.14; // 編譯錯誤,不能修改常數
常數命名慣例使用 UPPER_SNAKE_CASE(全大寫底線分隔)。
變數型別
Java 變數主要分為三種:
1. 區域變數 (Local Variables)
在方法、建構子或區塊內宣告的變數:
public void myMethod() {
int x = 10; // 區域變數
// x 只能在這個方法內使用
}
2. 實例變數 (Instance Variables)
在類別內、方法外宣告的變數,屬於物件:
public class Student {
String name; // 實例變數
int age; // 實例變數
public void printInfo() {
System.out.println(name);
}
}
3. 類別變數 (Class Variables)
使用 static 宣告的變數,屬於類別:
public class Counter {
static int count = 0; // 類別變數
public Counter() {
count++;
}
}
變數的預設值
區域變數沒有預設值,必須初始化才能使用:
public void test() {
int x;
// System.out.println(x); // 編譯錯誤,x 尚未初始化
}
實例變數和類別變數有預設值:
| 型別 | 預設值 |
|---|---|
int, byte, short, long | 0 |
float, double | 0.0 |
char | '\u0000' |
boolean | false |
| 參考型別 | null |
var 關鍵字 (Java 10+)
Java 10 開始可以使用 var 讓編譯器自動推斷型別(Local Variable Type Inference):
var name = "Alice"; // 推斷為 String
var age = 25; // 推斷為 int
var price = 99.5; // 推斷為 double
var numbers = new int[]{1, 2, 3}; // 推斷為 int[]
使用限制
var只能用於區域變數(方法內)。- 必須在宣告時同時初始化。
- 不能用於類別欄位(Fields)或方法參數。
最佳實踐
使用 var 可以減少重複的類別名稱,特別是在泛型或複雜類別時:
// 傳統寫法
Map<String, List<String>> map = new HashMap<String, List<String>>();
// 使用 var(更簡潔)
var map = new HashMap<String, List<String>>();
雖然 var 很方便,但請避免在語意不明確時使用,以免降低程式碼可讀性:
var result = service.getData(); // 可讀性較差,不知道 result 是什麼型別