聲明
本文有牛旦教育原創,首發頭條,轉載請注明來源,所有權保留。
我們知道類中的成員(包括靜態和非靜態的字段和方法)作用域對外(不同的包和不同的類)是依賴類的訪問控制等級的,對內(同類內)則都可訪問。因為類成員變量對類來說是全局變量,即在成員變量定義的代碼塊(類)內都是有效的。除了全局變量,還有局部變量。本文的4條規則,主要是針對局部變量而言的。
提示:關于類成員訪問控制等級——也有稱為訪問權限的,在JAVA中有4類,每個成員的訪問等級只能選擇其中的一種。如下下表所示:
表1:類中的成員訪問級別
所謂局部變量,就是在方法、構造函數或塊中聲明的變量。在方法中聲明的局部變量僅在方法執行期間存在。由于局部變量僅存在臨時的持續時間,因此不能在方法、構造函數或聲明塊的外部使用。方法的形式參數被視為局部變量。當方法被調用時,以及在執行方法的主體之前,它們都使用實際的參數值進行初始化。編碼時,我們需要遵守以下有關使用局部變量的規則。
規則#1
局部變量默認情況下未初始化。請注意,此規則與實例/類變量初始化的規則相反。當聲明一個實例/類變量時,它會使用默認值進行初始化(自動初始化)。來看下面add()方法的以下部分定義:
int add(int n1, int n2) { int sum; /* sum的值是設么? 不知道,因為還沒初始化它. */ /* 其它代碼... */ }
規則#2
這條規則是第一條規則的分支。 在程序分配一個值之前,局部變量不能被訪問。 下面的代碼片段會產生編譯時錯誤,因為它會在分配值之前嘗試打印本地變量sum的值。 請注意,Java運行時必須讀取(或訪問)sum變量的值才能打印它。
int add(int n1, int n2) { int sum; // 編譯時錯誤. 不能讀取sum 值,因為還沒被賦值. System.out.println(sum); }
下面的代碼段編譯良好,因為局部變量sum在被讀取前已被初始化:
int add(int n1, int n2) { int sum = 0; System.out.println(sum); // 編譯運行正常,輸出 0 }
規則#3
局部變量可以在方法體內的任何地方聲明。 但是,它必須在使用之前進行聲明。 這條規則的含義是,你不需要在方法體的開頭聲明所有的局部變量。 在更靠近使用變量的地方來聲明變量是一個好習慣。
局部變量不允許同名。其實,同一代碼塊內(不含內嵌代碼塊)也不允許變量同名,而不論是否是不同類型。
規則#4
局部變量隱藏實例變量和具有相同名稱的類變量的名稱。何為隱藏?就是說在類內定義了成員變量name,又定義了局部變量name,再在方法體或代碼塊使用name變量,則程序會自動選擇“最近”定義的變量name。也就是說同名的變量名,會以局部變量為準來參與相關的邏輯處理。如果本想使用成員變量的,這么一來,結果可能不是想要的。
隱藏這一現象適用于所有代碼塊,即小區塊代碼內的局部變量,會隱藏大區塊同名的變量。
變量作用域示例:
public class VariableScope{ private static int varNumber = 4 ; static void SayNumber(int varNumber){ System.out.println("SayNumber(int varNumber):"+varNumber) ; int varNum = 2 ;//只能方法內使用 System.out.println("Another varNum:"+varNum) ; } public static void main(String[] args){ int varNumber = 9 ; SayNumber(varNumber) ; { int varNum = 3 ; System.out.println("Block Code:"+ varNum) ; } //System.out.println("block variable varNum(3):"+varNum) ;//編譯錯誤 System.out.println("main 內(9):"+varNumber) ; } }
其實,所有的變量作用域都是跟Java的JVM內部管理機制以及內存模型有關的,這里就不展開了,前面有文章說過這些,有興趣的可以去看看: