---
# System prepended metadata

title: 變數之三 - 修飾子
tags: [java, article index, tutorial article, teaching]

---

根據使用慣例和術語，STR1 和 str2、STR4 可被稱為「全域變數」或「全域靜態變數」，
因為它們都是在類別範圍內聲明的靜態變數。
這意味著它們可以在類別中的任何位置訪問，
並且可以在程式的其他部分（例如不同的方法）中使用。

然而，STR3 則不是全域變數，而是「實例變數」或「物件變數」。
它僅與類的每個實例或物件相關聯，在使用它之前需要創建類的物件。

不過其實「全域變數」（global variables）這個術語在 Java 中並不常用，
因為 Java 中的變數通常是在類的範圍內定義的，而不是在整個程式的全域範圍內。
然而，根據上下文和使用情境，有時候可以將 STR1 和 str2、STR4 稱為「全域變數」，
以表示它們是在整個類中可訪問的變數。

總結來說，STR1 和 str2、STR4 都可以被稱為「全域變數」或「全域靜態變數」，
而 str3 是一個實例變數或物件變數。

```java
public class ExampleVariable3 {

    /*
     * STR1 是一個 public static final 變數，稱為「常數」或「靜態常數」。
     * 它個 public, 公開的（可以從任何地方訪問）、
     * 也是 static, 靜態的（屬於類而不是物件）
     * 以及 final, 不可變的（不能修改其值）變數。
     * 常數通常用『全大寫字母』命名，並且在程式中提供一個固定的值。
     * 
     * 靜態常數通常拿來存放不會再更改的值，像是 PI，或者一些固定的檔案路徑等等。
     */
    public static final String STR1 = "it's str1";

    /*
     * str2 是一個 public static 變數，稱為「靜態變數」或「類變數」。
     * 它是一個 public, 公開的（可以從任何地方訪問）
     * 和 static, 靜態的（屬於類而不是物件）變數。
     * 靜態變數與類相關聯，而不是與類的每個實例相關聯。
     * 因為這不是常數，所以照一般的命名規則即可。
     */
    public static String str2 = "it's str2";

    /*
     * str3 是一個沒有使用關鍵字進行聲明的變數。根據它的聲明位置，
     * 它可能是一個實例變數或物件變數。
     * 這個變數只能通過創建類的物件來訪問。
     * 可以稱呼它為「實例變數」或「物件變數」，表示屬於類的每個實例或物件的一部分。
     * 因為這不是常數，所以照一般的命名規則即可。
     */
    public String str3 = "it's str3";

    /*
     * 這邊的 STR4 所有設定都如 STR1 一樣，只差在沒有直接賦值。
     * 但如果用靜態初始化區塊，就可以在區塊內對 final 變數進行唯一一次的變動。
     */ 
    public static final String STR4;
    static {
        STR4 = "it's str4";
        //STR1 = "edit me"; //錯誤，已經無法修改 STR1
    }

    public static void test1() {
        System.out.println(STR1);
        System.out.println(str2);
        //str3 因為不是靜態變數，所以無法在靜態方法內呼叫
        //System.out.println(str3); 
    }

    private String test2() {
        System.out.println(STR1);
        System.out.println(str2);
        System.out.println(str3);
        return "";
    }

    public static void main(String[] args) {

        test1();

        ExampleVariable testClass = new ExampleVariable();
        testClass.test2();

        System.out.println(STR1);
        System.out.println(str2);
        //main 本身也是一個靜態方法，所以無法直接取用 str3
        //System.out.println(str3);
        //必須先實例化類別之後才能取用物件變數
        System.out.println(testClass.str3);
        
        //STR1 是個常數（加上 final），所以無法再修改他
        //STR1 = "test string";
        str2 = "test string";
        testClass.str3 = "test string";
    }
}
```