---
# System prepended metadata

title: Variable
tags: [Java]

---

[toc]

# 宣告變數
告訴compiler你要用name去refer一個資料, 它的type是*type*
寫法:
```
type name;
```
```
type var1, var2, var3;
```
---
## 變數命名規則
- 不可使用關鍵字
- 開頭只能用`A-Z`, `a-z`, `_`, `$`
- 其他只能用`A-Z`, `a-z`, `_`, `$`, `0-9`
- 沒有長度上限

(Java編譯期間自己建立的變數會以`$`開頭, 因此儘量不要使用`$`)

## Three Types of Variables

- 在class內, Method外, 叫做 "member variable" ("成員變數"), "field"
- 在Method裡面的, 叫做local variable
- 宣告Method中寫的, 叫做參數(parameter)
  
```java=
class Main {
    int i; // field
    
    public static int add(int a, int b) { // parameter
        int result = a + b; // local variable
        return result;
    }
}
```

## 初始值 
- **member variable (field)**
如果沒有寫初始值, 會直接使用該原始型別的初始值。
但這不是一個好的程式風格。
  - 初始值
    - Primitive Type: default value
    - Reference Type: null

- **local variable**
不會有初始值。
存取未初始化的局部變數會有CE。
  - 初始值
    - Primitive Type: not initialized
    - Reference Type: not initialized

```java=
public class Main {
    
    int i; // 0
    Object o; // null  
    
    // you should always write the initial value.
    int j = 0;
    Object obj = null; 
    
    public static void main(String[] args) {
        int i; // not initialized
        Object o; // not initialized
    }
}
```