變數的scope


1 全域變數 vs 區域變數

還記得我曾經說過,一個變數它的可視範圍,也就是可以被編譯器所認得的範圍,是在包圍著它且離他最近的{ }

先忽略下方程式碼的static,來看一個範例

public class MainClass {
    static int i  =1;
    public static  void  main(String[] args) {
        int i=2;
        System.out.println(i);
        f();
        f1(3);
    }

    public static void f(){
        System.out.println(i);
    }

    public static void f1(int i){
        System.out.println(i);
    }

}
-------------------
2
1
3

以下稱呼值為1的i為i1,值為2的i為i2。

  • i1的範圍: 整個MainClass的範圍都認得i1
  • i2的範圍: 整個main()的範圍都認得i2

其中可以看到有重複的範圍,main()他認得i1也認得i2,這個時候我們在main()呼叫i,它會自動判斷是離得近的那一個,也就是i2

然而f()並不認得i2,所以他看到的i就只會是i1

於是兩個function列印出來的答案就各不相同了

我們稱整個程式碼都能看見的i1為全域變數

僅有小範圍可以看到的i2為區域變數

2 static

程式碼是由編譯器由上至下一行行編譯及執行的,假設我們有如下程式碼在一段程式碼中

public class MainClass {
    public static  void  main(String[] args) {
        int i=2;
        int j=3;
    }
}


以想像,當執行到 int i=2; 這一行的時候,電腦才會分配一個記憶體空間給i,並且將2的值丟進去,而分配完i後才會往下分配j的空間,而這些記憶體什麼時候被釋放呢?

當碰觸到 } 下括弧之後,i跟j的記憶體空間都會被釋放掉,這也是為什麼我們在離開main()之後,就不能再使用這些變數的原因。

一般的變數,在執行到它宣告的那一行時會分配給它記憶體空間,在它範圍內的程式碼都結束後,記憶體空間將會被一起釋放掉。

但是有時後我們需要一個變數或是function,是在程式剛開始執行到最後結束的時候,都要可以任意使用的,這種時候我們就會使用static

static int i=1;

被static標籤的變數,直到程式結束的最後,記憶體空間才會被釋放掉

切記,static function內使用的變數,你都要注意它的生命週期,static function只能使用在記憶體裡面待得跟他一樣久的變數

public class MainClass {
    int i=1;//error :i應該要設成static
    public static void f(){
        System.out.println(i);
    }
}

3 final

設定為final的變數,須立刻賦予它一個出值,且只要初值設定好後,裡面的值將再也不能被改變

final double PI=3.14;
public static  void  main(String[] args) {
    PI=2.59;//error
}

通常設為final的變數,大家都有個共識會將它的變數名稱全部設成大寫

results matching ""

    No results matching ""