聲明
本文有牛旦教育原創(chuàng),首發(fā)頭條,轉(zhuǎn)載請(qǐng)注明來(lái)源,所有權(quán)保留。
我們知道類中的成員(包括靜態(tài)和非靜態(tài)的字段和方法)作用域?qū)ν猓ú煌陌筒煌念悾┦且蕾囶惖脑L問(wèn)控制等級(jí)的,對(duì)內(nèi)(同類內(nèi))則都可訪問(wèn)。因?yàn)轭惓蓡T變量對(duì)類來(lái)說(shuō)是全局變量,即在成員變量定義的代碼塊(類)內(nèi)都是有效的。除了全局變量,還有局部變量。本文的4條規(guī)則,主要是針對(duì)局部變量而言的。
提示:關(guān)于類成員訪問(wèn)控制等級(jí)——也有稱為訪問(wèn)權(quán)限的,在JAVA中有4類,每個(gè)成員的訪問(wèn)等級(jí)只能選擇其中的一種。如下下表所示:

表1:類中的成員訪問(wèn)級(jí)別
所謂局部變量,就是在方法、構(gòu)造函數(shù)或塊中聲明的變量。在方法中聲明的局部變量?jī)H在方法執(zhí)行期間存在。由于局部變量?jī)H存在臨時(shí)的持續(xù)時(shí)間,因此不能在方法、構(gòu)造函數(shù)或聲明塊的外部使用。方法的形式參數(shù)被視為局部變量。當(dāng)方法被調(diào)用時(shí),以及在執(zhí)行方法的主體之前,它們都使用實(shí)際的參數(shù)值進(jìn)行初始化。編碼時(shí),我們需要遵守以下有關(guān)使用局部變量的規(guī)則。

規(guī)則#1
局部變量默認(rèn)情況下未初始化。請(qǐng)注意,此規(guī)則與實(shí)例/類變量初始化的規(guī)則相反。當(dāng)聲明一個(gè)實(shí)例/類變量時(shí),它會(huì)使用默認(rèn)值進(jìn)行初始化(自動(dòng)初始化)。來(lái)看下面add()方法的以下部分定義:
int add(int n1, int n2) { int sum; /* sum的值是設(shè)么? 不知道,因?yàn)檫€沒(méi)初始化它. */ /* 其它代碼... */ }
規(guī)則#2
這條規(guī)則是第一條規(guī)則的分支。 在程序分配一個(gè)值之前,局部變量不能被訪問(wèn)。 下面的代碼片段會(huì)產(chǎn)生編譯時(shí)錯(cuò)誤,因?yàn)樗鼤?huì)在分配值之前嘗試打印本地變量sum的值。 請(qǐng)注意,Java運(yùn)行時(shí)必須讀取(或訪問(wèn))sum變量的值才能打印它。
int add(int n1, int n2) { int sum; // 編譯時(shí)錯(cuò)誤. 不能讀取sum 值,因?yàn)檫€沒(méi)被賦值. System.out.println(sum); }
下面的代碼段編譯良好,因?yàn)榫植孔兞縮um在被讀取前已被初始化:
int add(int n1, int n2) { int sum = 0; System.out.println(sum); // 編譯運(yùn)行正常,輸出 0 }
規(guī)則#3
局部變量可以在方法體內(nèi)的任何地方聲明。 但是,它必須在使用之前進(jìn)行聲明。 這條規(guī)則的含義是,你不需要在方法體的開(kāi)頭聲明所有的局部變量。 在更靠近使用變量的地方來(lái)聲明變量是一個(gè)好習(xí)慣。
局部變量不允許同名。其實(shí),同一代碼塊內(nèi)(不含內(nèi)嵌代碼塊)也不允許變量同名,而不論是否是不同類型。
規(guī)則#4
局部變量隱藏實(shí)例變量和具有相同名稱的類變量的名稱。何為隱藏?就是說(shuō)在類內(nèi)定義了成員變量name,又定義了局部變量name,再在方法體或代碼塊使用name變量,則程序會(huì)自動(dòng)選擇“最近”定義的變量name。也就是說(shuō)同名的變量名,會(huì)以局部變量為準(zhǔn)來(lái)參與相關(guān)的邏輯處理。如果本想使用成員變量的,這么一來(lái),結(jié)果可能不是想要的。
隱藏這一現(xiàn)象適用于所有代碼塊,即小區(qū)塊代碼內(nèi)的局部變量,會(huì)隱藏大區(qū)塊同名的變量。
變量作用域示例:
public class VariableScope{ private static int varNumber = 4 ; static void SayNumber(int varNumber){ System.out.println("SayNumber(int varNumber):"+varNumber) ; int varNum = 2 ;//只能方法內(nèi)使用 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) ;//編譯錯(cuò)誤 System.out.println("main 內(nèi)(9):"+varNumber) ; } }
其實(shí),所有的變量作用域都是跟Java的JVM內(nèi)部管理機(jī)制以及內(nèi)存模型有關(guān)的,這里就不展開(kāi)了,前面有文章說(shuō)過(guò)這些,有興趣的可以去看看: