成員變量:寫在類聲明的大括號裏面的變量。
如果在變量有static關鍵字修飾,就叫作靜態變量或類變量;
如果該變量沒有static關鍵字修飾,就叫作非靜態變量或實例變量;
class A {
int a ;
}
局部變量:方法內定義的變量、形參、代碼塊中定義的變量.
局部變量除形參之外,都必須顯示初始化,就是必須先給方法局部變量和代碼塊局部變量指定初始值,否則不可以訪問它們。
public void test(int a){
a = 1;
}
兩者的區別
一、初始值不同:
成員變量聲明瞭就可以使用,有默認值;局部變量必須經過聲明和賦值操作才能使用,並且沒有默認值。
成員變量的默認值:
int類型的默認值是0
String類型的默認值是null
double類型的默認值是0.0d
Integer類型的默認值是null
Long類型的默認值是null
long類型的默認值是0L
float類型的默認值是0.0f
char類型的默認值是\u0000
byte類型的默認值是(byte)0
short類型的默認值是(short)0
二、存儲位置不同:
成員變量分配到堆中,成員變量的作用於在整個內部都是可見的,所有成員方法都可以使用它。如果訪問權限允許,還可以在類的外部使用成員變量。
局部變量分配到棧中,局部變量的作用於僅限於定義它的方法,在該方法的外部無法訪問。
三、生命週期不同:
成員變量隨着對象的存在而存在,隨着對象的銷燬而銷燬;局部變量隨着方法的存在而存在調用,銷燬而銷燬;局部變量只能在聲明它的方法中使用,而成員變量在整個類中都可以使用。
四、優先級:
成員變量和局部變量同名時,局部變量的賦值具有更高的優先級,優先取局部變量的值。
五、可否同名:
在同一個方法中,可以有同名的局部變量;
在不同的方法中,可以有同名的局部變量。
六、修飾符:
成員變量可以被public,protect,private,static等修飾符修飾;
局部變量不能被控制修飾符及static修飾;
兩者都可以定義成final型。
小結:
同一個類裏,成員變量的作用範圍是整個類內,一個類裏不能定義兩個同名的成員變量,即使一個是類變量,一個是實例變量也不行;一個方法裏不能定義兩個同名的方法局部變量,方法局部變量與形參也不能同名;同一個方法中不同代碼塊內的代碼塊局部變量可以同名;如果先定義代碼塊局部變量,後定義方法局部變量,前面定義的代碼塊局部變量與後面定義的方法局部變量也可以同名。
java允許局部變量和成員變量同名,如果方法裏的成員變量和局部變量同名,局部變量會覆蓋成員變量,如果需要在這個方法裏引用被覆蓋的成員變量,則可以使用this(對於實例變量)或類名(對於類變量)作爲調用者來限定訪問成員變量。