在java語言中,根據定義變量的位置不同,而可以将其分為成員變量和局部變量兩大類(具體分類參照圖一.變量分類詳圖),下面将為大家詳細介紹一下兩種變量的運作機制的差異。
圖一.變量分類詳圖
一、概念
成員變量:指的是在類裡面定義的變量,又因修飾符的不同,将其細分為執行個體變量和類變量。
class Animal{
// 定義一個執行個體變量
public String name;
// 定義一個類變量
public static int footNum;
}
public class AnimalTest{
public static void main(String[] args){
// 直接通過 類.類變量 來調用
System.out.println("Animal的footNum類變量為:"+ Animal.footNum);
// 如下以類.執行個體變量調用執行個體變量會報錯
// System.out.println("Animal的name類變量為:"+ Animal.name);
// 建立Animal對象
Animal a = new Animal();
// 直接通過 執行個體.類變量 來調用
System.out.println("Animal的name執行個體變量為:"+ a.name
+";Animal的footNum類變量為:"+ a.footNum);
// 直接為那麼執行個體變量指派
a.name = "二哈";
// 通過a來通路footNum類變量,并指派
a.footNum = 4;
// 再次通過Animal來通路name執行個體變量和footNum類變量
System.out.println("Animal的name執行個體變量為:"+ a.name
+";Animal的footNum類變量為:"+ a.footNum);
Animal a2 = new Animal();
System.out.println("Animal的name執行個體變量為:"+ a2.name
+";Animal的footNum類變量為:"+ a2.footNum);
}
}
程式結果:
Animal的footNum類變量為:0
Animal的name執行個體變量為:null;Animal的footNum類變量為:0
Animal的name執行個體變量為:二哈;Animal的footNum類變量為:4
Animal的name執行個體變量為:null;Animal的footNum類變量為:4
局部變量:指的是在方法裡定義的變量,又因定義形式的不同,将其細分為形參、方法局部變量和代碼塊局部變量。
public class LocalTest{
public static void main(String[] args){
//形參
System.out.println("形參args的值為:"+args);
{
// 定義代碼塊
int a;
// 下面代碼将出現錯誤,因為a變量還未初始化
// System.out.println("代碼塊局部變量a的值為:"+a);
// 為a變量賦初始值,即初始化
a = 1;
System.out.println("代碼塊局部變量a的值為:"+a);
}
// 下面代碼将出現錯誤,因試圖通路的代碼塊局部變量a不存在
// System.out.println("代碼塊局部變量a的值為:"+a);
//定義方法局部變量
int b;
// 下面代碼将出現錯誤,因為b變量還未初始化
// System.out.println("方法局部變量b的值為:"+b);
// 為b變量賦初始值,即初始化
b = 2;
System.out.println("代碼塊局部變量b的值為:"+b);
}
}
程式結果:
形參args的值為:[Ljava.lang.String;@30c028cc
代碼塊局部變量a的值為:1
代碼塊局部變量b的值為:2
二、初始化
成員變量:無須顯式初始化,隻要在一個類中定義了成員變量,系統就會在這個類的準備階段或者建立該類的執行個體時進行預設的初始化,其指派規則與數組動态初始化數組元素的指派規相同。
局部變量:
形參:無須顯式初始化,在調用該方法時由系統完成初始化的動作,其值由該方法的調用者負責指定。
方法局部變量、代碼塊局部變量:需要在調用之前顯式指定初始值,否則不可以通路。
三、作用域
成員變量:
執行個體變量:從該類的準備階段開始存在,直到系統完全銷毀整個類,與這個生存範圍相同
類變量:從該類的執行個體被建立起開始存在,直到系統完全銷毀這個執行個體,與對應執行個體的生存範圍相同
局部變量:
形參:在整個方法中有效
方法局部變量:從定義該變量的地方開始生效,到該方法結束時失效
代碼塊局部變量:從定義該變量的地方開始生效,到該代碼塊結束時失效
小結:
大緻可以這樣描述:類變量->執行個體變量->形參->方法局部變量->代碼塊局部變量
四、通路文法
成員變量:
類變量:
① 隻要類存在,程式就可以通路該類的類變量,文法為:類.類變量
② 該類的執行個體存在的情況下,也可以通過執行個體來通路,文法為:執行個體.類變量(不推薦這樣)
執行個體變量:在該類的執行個體存在下,可以通過執行個體來通路該執行個體變量,文法為:執行個體.執行個體變量
局部變量:在作用域内,可以直接通過其變量名來通路
注意:
① 一個類内不能定義兩個同名的成員變量,
② 一個方法内不能定義兩個同名的方法局部變量,與形參同名也不可以
③ 同一個方法中的同一代碼塊内不能定義兩個同名的代碼塊局部變量,但不同的代碼塊内可以同名;若方法局部變量定義在代碼塊後面,則其變量可以與前面代碼塊的變量同名,但盡量避免同名的情況
④ 同一個類中允許成員變量與局部變量同名,但局部變量會覆寫成員變量,若需要引用成員變量,則可以通過this(對于執行個體變量)或類名(對于類變量)來調用通路成員變量。值得注意的是,在現實的編碼中還是要盡量避免成員變量與局部變量同名的情況
五、命名規則
都應遵守相同的命名規則:合法的辨別符即可作為命名,但基于程式的可讀性,應該是由有意義的單詞組成,遵守 駝峰命名法(第一個單詞首字母小寫,後面每個單詞首字母大寫),為避免命名過長,可以進行相應有意義的縮寫,提高程式的可讀性。