解析Java中靜態(tài)變量與實(shí)例變量的區(qū)別
java類(lèi)的成員變量有倆種:一種是被static關(guān)鍵字修飾的變量,叫類(lèi)變量或者靜態(tài)變量;另一種沒(méi)有static修飾,為實(shí)例變量。
在語(yǔ)法定義上的區(qū)別:靜態(tài)變量前要加static關(guān)鍵字,而實(shí)例變量前則不加。
在程序運(yùn)行時(shí)的區(qū)別:實(shí)例變量屬于某個(gè)對(duì)象的屬性,必須創(chuàng)建了實(shí)例對(duì)象,其中的實(shí)例變量才會(huì)被分配空間,才能使用這個(gè)實(shí)例變量。靜態(tài)變量不屬于某個(gè)實(shí)例對(duì)象,而是屬于類(lèi),所以也稱(chēng)為類(lèi)變量,只要程序加載了類(lèi)的字節(jié)碼,不用創(chuàng)建任何實(shí)例對(duì)象,靜態(tài)變量就會(huì)被分配空間,靜態(tài)變量就可以被使用了。總之,實(shí)例變量必須創(chuàng)建對(duì)象后才可以通過(guò)這個(gè)對(duì)象來(lái)使用,靜態(tài)變量則可以直接使用類(lèi)名來(lái)引用。
例如,對(duì)于下面的程序,無(wú)論創(chuàng)建多少個(gè)實(shí)例對(duì)象,永遠(yuǎn)都只分配了一個(gè)staticVar變量,并且每創(chuàng)建一個(gè)實(shí)例對(duì)象,這個(gè)staticVar 就會(huì)加1;但是,每創(chuàng)建一個(gè)實(shí)例對(duì)象,就會(huì)分配一個(gè)instanceVar,即可能分配多個(gè)instanceVar,并且每個(gè)instanceVar的值都只自加了1次。
- public class VariantTest
- {
- public static int staticVar = 0;
- public int instanceVar = 0;
- public VariantTest()
- {
- staticVar++;
- instanceVar++;
- System.out.println(“staticVar = ”++staticVar “, instanceVar = ” ++instanceVar);
- }
- }
類(lèi)的靜態(tài)變量在內(nèi)存中只有一個(gè),java虛擬機(jī)在加載類(lèi)的過(guò)程中為靜態(tài)變量分配內(nèi)存,靜態(tài)變量位于方法區(qū),被類(lèi)的所有實(shí)例共享。靜態(tài)變量可以直接通過(guò)類(lèi)名進(jìn)行訪問(wèn),其生命周期取決于類(lèi)的生命周期。
而實(shí)例變量取決于類(lèi)的實(shí)例。每創(chuàng)建一個(gè)實(shí)例,java虛擬機(jī)就會(huì)為實(shí)例變量分配一次內(nèi)存,實(shí)例變量位于堆區(qū)中,其生命周期取決于實(shí)例的生命周期。
- public class Temp {
- int t; //實(shí)例變量
- public static void main(String args[]){
- int t=1; //局部變量
- System.out.println(t); //打印局部變量
- Temp a= new Temp(); //創(chuàng)建實(shí)例
- System.out.println(a.t); //通過(guò)實(shí)例訪問(wèn)實(shí)例變量
- }
- }
結(jié)果為:
1
0 (成員變量具有缺省值 而局部變量則沒(méi)有)
把代碼改為:
- public class Temp {
- static int t; //類(lèi)變量
- public static void main(String args[]){
- System.out.println(t); //打印類(lèi)變量
- int t=1; //局部變量
- System.out.println(t); //打印局部變量
- Temp a= new Temp(); //創(chuàng)建實(shí)例
- System.out.println(a.t); //通過(guò)實(shí)例訪問(wèn)實(shí)例變量
- }
- }
結(jié)果則為
0
1
0
希望通過(guò)本文的介紹,能夠給你帶來(lái)幫助。