變數的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的變數,大家都有個共識會將它的變數名稱全部設成大寫