---
# System prepended metadata

title: 變數之二 - 作用區域
tags: [java, article index, tutorial article, teaching]

---

```java
public class ExampleVariable2 {

    static int num = 0; // 宣告靜態變數（可視為類別內的全域變數）
    int mynum = 0;      // 物件變數
    
    static String mystr1;
    String mystr2;
    
    public static void main(String[] args) {

        // 因為程式執行的順序是由上而下，所以只能取用成功宣告後的變數
        // System.out.println(number); //順序錯誤，無法讀取這個變數

        int number = 1; // 區域變數
        if (number < 10) { // 括號A
            
            // 局部變數 newScope 的作用區域，只存在於這括號A與B之間
            int newScope = 2;
            
            System.out.println(newScope); // 印出同一個作用域內的局部變數，ok
            System.out.println(number); // 印出執行順序之前宣告的變數，ok
            System.out.println(num); // 印出全域變數，ok
            
            // int number = 1; //錯誤，同名變數已經被宣告過了
            // System.out.println(mynum); //無法直接印出物件變數，需先實例化類別
        } // 括號B

        // 這個位置讀取不到括號內的 newScope，因為變數被作用域隔開了
        // System.out.println(newScope);

        int newScope = 2; // 因為宣告在不同作用域，所以可以宣告同名的變數

        System.out.println(number); // 印出執行順序之前宣告的區域變數，ok
        System.out.println(num); // 印出全域變數，ok
        // System.out.println(mynum); //無法直接印出物件變數，需先實例化類別

        int num = 3;	//區域變數優先順序大於靜態變數及物件變數，所以可以宣告同名變數
        System.out.println(num);	//印出 3

        ExampleScope scope = new ExampleScope();
        System.out.println(scope.mynum); // 可印出物件變數，因為已經實例化類別
        
        //對於未賦值的物件變數及靜態變數，程式會給予預設值
        System.out.println(mystr1); 
        System.out.println(scope.mystr2); 
        
        test(); // 呼叫靜態方法 test
        scope.test2(); // 呼叫方法 test2
    }

    public static void test() {
        // 區域變數 insideMethod 這個變數的作用區域，只在於這方法內
        int insideMethod = 3;
        System.out.println(insideMethod); // 印出同一個作用域內的區域變數，ok
        System.out.println(num); // 呼叫後，印出全域變數，ok
        // System.out.println(mynum); //無法直接印出物件變數，需先實例化類別
    }

    public void test2() {
        // 可直接印出物件變數，不需先實例化類別，因兩者都非 static
        System.out.println(mynum);
        
        int mynum = 3;	//區域變數優先順序大於靜態變數及物件變數，所以可以宣告同名變數
        System.out.println(mynum); //印出 3
    }

}
```