所謂變量的作用域就是變量的有效范圍。通過(guò)后面內(nèi)容的學(xué)習(xí)大家會(huì)更加明白,實(shí)際上局部變量、實(shí)例變量、靜態(tài)變量它們存儲(chǔ)在Java虛擬機(jī)的不同內(nèi)存區(qū)域上,所以變量是有作用域的。
關(guān)于變量的有效范圍,在這里我給大家總結(jié)了一個(gè)口訣:出了大括號(hào)就不認(rèn)識(shí)了。雖然這句話屬于大白話,但很實(shí)用。我們來(lái)測(cè)試一下:
public class VarTest05 {
//后面會(huì)學(xué)習(xí)為什么這里的變量定義為靜態(tài)變量
static int i = 1000;
public static void main(String[] args) {
System.out.println("k = " + k);
int k = 100;
System.out.println("k = " + k);
int i = 2000;
System.out.println("i = " + i);
}
//后面會(huì)學(xué)習(xí)方法怎么定義
public static void m1(){
System.out.println("k = " + k);
}
public static void m2(){
System.out.println("i = " + i);
}
}
編譯報(bào)錯(cuò)了:
圖3-6:變量的作用域
通過(guò)以上的測(cè)試我們發(fā)現(xiàn):
● 方法體當(dāng)中的代碼是有執(zhí)行順序的,遵循自上而下的順序依次逐行執(zhí)行,變量在沒(méi)有聲明的時(shí)候是不能訪問(wèn)的,需要先聲明,接下來(lái)才能訪問(wèn)。
● 另外在main方法中聲明的變量k有效范圍是main方法,只能在main方法中使用,出了大括號(hào)就不認(rèn)識(shí)了,在m1方法中是無(wú)法訪問(wèn)的。
● 在類體當(dāng)中聲明的變量i作用域是整個(gè)類體,所以在m2方法中是可以使用的。
修改以上代碼并運(yùn)行:
public class VarTest05 {
//后面會(huì)學(xué)習(xí)為什么這里的變量這個(gè)時(shí)候定義為靜態(tài)變量
static int i = 1000;
public static void main(String[] args) {
//System.out.println("k = " + k);
int k = 100;
System.out.println("k = " + k);
int i = 2000;
System.out.println("i = " + i);
}
//后面會(huì)學(xué)習(xí)方法怎么定義
public static void m1(){
//System.out.println("k = " + k);
}
public static void m2(){
System.out.println("i = " + i);
}
}
運(yùn)行結(jié)果如下圖所示:
圖3-7:變量作用域
通過(guò)以上程序的運(yùn)行結(jié)果得知,java是遵循就近原則的,在類體當(dāng)中有i變量,在main方法中聲明了i變量,那么在main方法中一定訪問(wèn)離自己最近的變量,也就是就近取材,這就是就近原則,幾乎所有的編程語(yǔ)言都是這樣的。