通過前面的學習,咱們發現變量有時候定義在main函數裏,有時候寫在循環裏,有的時候又寫在自定義函數裏,那麼什麼的變量的做用域呢函數
首先做用域是由花括號的位置決定的。學習
函數內定義的變量被稱爲局部變量。code
局部變量的做用範圍從聲明開始,直到包含它的塊結束(塊就是{}內的代碼)。對象
函數的參數範圍涵蓋整個方法。參數其實是一個局部變量。作用域
public class SixthScopeLesson { /** * a在整個函數內都是可見的 * b在定義以後,直到 } 號以前都是可見的 * @param a */ public static void foo(int a) { System.out.println(a); int b = 10; System.out.println(b); } public static void main(String[] args) { foo(10); /** * 在main函數裏,就訪問不到foo(int a)裏的a * 以及foo函數裏定義的b */ } }
for循環的初始化部分聲明的變量,其做用範圍在整個循環。for循環
但循環體內聲明的變量其適用範圍是從它聲明到循環體結束。它包含以下所示的變量聲明:class
for(int i = 0; i < 10; i++ /*這裏也能訪問i,可是不能訪問j*/) { int j = i + 1; /* 從這裏到 } 都能訪問到j */ System.out.println(i); System.out.println(j); } /** * 出了 } 以後,i和j都不能再訪問 */
int i = 3; if (i >= 3) { /* 進入代碼塊 */ int j = 10; /* j從這裏到 } 都能訪問 */ System.out.println(i); /* 能夠訪問到i,由於i在上一級代碼塊 */ System.out.println(j); } System.out.println(i); /* 能夠訪問到i,處於同一個代碼塊 */ /* 訪問不到j */
這說明什麼,說明子代碼塊能夠訪問上層代碼塊的變量。變量
上層代碼塊卻不能訪問子代碼塊的變量。循環
這是爲何,由於程序運行到}符號時,表示離開做用域,
{}內分配的變量將被JVM回收sso
講到下一節「程序運行基石,棧」時,你們會有更好的理解。
類的全局變量在類內都能訪問到
public class SixthScopeLesson2 { /** * 定義全局靜態變量 * 變量名叫val * 把10賦值給val */ public static int val = 10; public static void foo() { /** * 因爲val是全局變量 * 因此foo函數能訪問到 */ System.out.println(val); } public static void main(String[] args) { /** * 因爲val是全局變量 * 因此main函數能訪問到 */ System.out.println(val); } }