java里類變量和實(shí)例變量的區(qū)別
java里類變量和實(shí)例變量的區(qū)別
每次創(chuàng)建一個(gè)類的對(duì)象的時(shí)候,系統(tǒng)為它創(chuàng)建了類的每一個(gè)實(shí)例變量的副本。我們就可以從對(duì)象中訪問(wèn)該實(shí)例變量。
類變量或說(shuō)靜態(tài)變量跟實(shí)例變量是不一樣的,不管為一個(gè)類創(chuàng)建了多少個(gè)對(duì)象,系統(tǒng)只為每個(gè)類變量分配一次存儲(chǔ)空間。
系統(tǒng)為類變量分配的內(nèi)存是在執(zhí)行main方法時(shí)馬克-to-win, 就是在程序最最開始的時(shí)候(見下面StaticDemo的例子)。所有的對(duì)象共享了類變量。可以通過(guò)對(duì)象或者通過(guò)類本身來(lái)訪問(wèn)類變量。
Static?fieldsA?field?define?as?static,?means?there?is?only?one?such?field?shared?by?all?objectsInstance?fieldsA?field?define?without?static,?means?each?object?has?its?own?copy?of?fields
順便提一句:通常用下面的形式,定義類的常量。
(類或?qū)嵗伎梢栽L問(wèn))
static?final?double?PI=3.14159;
靜態(tài)方法(方法前冠以static)和實(shí)例方法(前面未冠以static)的區(qū)別調(diào)用靜態(tài)方法或說(shuō)類方法時(shí),可以使用類名做前綴,也可以使用某一個(gè)具體的對(duì)象名;通常使用類名。非static的方法是屬于某個(gè)對(duì)象的方法,而static的方法是屬于整個(gè)類的,不被任何一個(gè)對(duì)象單獨(dú)擁有;由于static方法是屬于整個(gè)類的,所以它不能操縱和處理屬于某個(gè)對(duì)象的成員變量,而只能處理屬于整個(gè)類的成員變量,也即,static方法只能處理static域或靜態(tài)方法。實(shí)例方法可以訪問(wèn)實(shí)例域, 靜態(tài)域或靜態(tài)方法, 記住都行。
聲明為static的方法有以下幾條限制: 1.它們僅能調(diào)用其他的static方法。2.它們只能訪問(wèn)static數(shù)據(jù)。3.它們不能以任何方式引用this或super(關(guān)鍵 字super與繼承有關(guān),在下一章中描述)。
static?method?Have?No?this?ReferenceAll?instance?methods?have?a?hidden?parameter—thisSo,Static?method?can’t?access?instance?methods?and?fields;?it?can?only?invoke?other?static?class?members.It?can?access?class?members?only.?instance?can?use?static?method.Instance?methods:If?a?method?is?declared?without?the?static?modifier?keyword,?that?method?is?known?as?an?instance?method.?Instance?methods?are?associated?with?objects?–?not?classes.It?can?access?either?instance?or?class?members.?class?StaticExa?{static?int?a?=?4;static?int?b?=?9;static?void?call()?{System.out.println(\”a?=?\”?+?a);//靜態(tài)方法可以訪問(wèn)靜態(tài)屬性}}public?class?Test?{static?int?c?=?43;public?static?void?main(String?args[])?{/*剛運(yùn)行到這一步時(shí),debug觀察,StaticExa.a的值就等于42,Test.c的值就等于43,說(shuō)明系統(tǒng)在我們的程序一開始時(shí),就會(huì)給所有的類變量賦值。
java靜態(tài)變量的與實(shí)例變量的區(qū)別
java類的成員變量有倆種:一種是被static關(guān)鍵字修飾的變量,叫類變量或者靜態(tài)變量;另一種沒(méi)有static修飾,為實(shí)例變量。
1、在語(yǔ)法定義上的區(qū)別:
靜態(tài)變量前要加static關(guān)鍵字,而實(shí)例變量前則不加。
2、在程序運(yùn)行時(shí)的區(qū)別:
實(shí)例變量屬于某個(gè)對(duì)象的屬性,必須創(chuàng)建了實(shí)例對(duì)象,其中的實(shí)例變量才會(huì)被分配空間,才能使用這個(gè)實(shí)例變量。
靜態(tài)變量不屬于某個(gè)實(shí)例對(duì)象,而是屬于類,所以也稱為類變量,只要程序加載了類的字節(jié)碼,不用創(chuàng)建任何實(shí)例對(duì)象,靜態(tài)變量就會(huì)被分配空間,靜態(tài)變量就可以被使用了??傊?,實(shí)例變量必須創(chuàng)建對(duì)象后才可以通過(guò)這個(gè)對(duì)象來(lái)使用,靜態(tài)變量則可以直接使用類名來(lái)引用。
舉例說(shuō)明:
對(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次。
類的靜態(tài)變量在內(nèi)存中只有一個(gè),java虛擬機(jī)在加載類的過(guò)程中為靜態(tài)變量分配內(nèi)存,靜態(tài)變量位于方法區(qū),被類的所有實(shí)例共享。
靜態(tài)變量可以直接通過(guò)類名進(jìn)行訪問(wèn),其生命周期取決于類的生命周期。
而實(shí)例變量取決于類的實(shí)例。每創(chuàng)建一個(gè)實(shí)例,java虛擬機(jī)就會(huì)為實(shí)例變量分配一次內(nèi)存,實(shí)例變量位于堆區(qū)中,其生命周期取決于實(shí)例的生命周期。
java中類變量、實(shí)例變量和局部變量有何區(qū)別?
類變量:比較特殊的實(shí)例變量,用static修飾的,一個(gè)類共用這個(gè)變量,所有由這類生成的對(duì)象都共用這個(gè)變量,類裝載時(shí)就分配存儲(chǔ)空間。一個(gè)對(duì)象修改了變量,則所以對(duì)象中這個(gè)變量的值都會(huì)發(fā)生改變。
實(shí)例變量:從屬于類,由類生成對(duì)象時(shí),才分配存儲(chǔ)空間,各對(duì)象間的實(shí)例變量互不干擾,能通過(guò)對(duì)象的引用來(lái)訪問(wèn)實(shí)例變量。
Java中局部變量,靜態(tài)變量和實(shí)例變量的區(qū)別
實(shí)例變量又稱成員變量:
成員變量定義在類中,百科在整個(gè)類中都可以被訪問(wèn)
成員變量隨著對(duì)象的建立而建立,隨對(duì)象的消失而消失,存在于對(duì)象所在的對(duì)內(nèi)存中
成員變量有默認(rèn)初始值
局部變量:
定義在方法中或方法的參數(shù)列表(或者語(yǔ)句中)
存在于棧內(nèi)存中,作用的范圍結(jié)束,變量空間自動(dòng)釋放
默認(rèn)沒(méi)有初始化值,使用時(shí)需要進(jìn)行初始化
靜態(tài)變量又稱類變量:用static修飾
存儲(chǔ)在方法區(qū)中
隨著類的加載而存在,隨著類的消失而消失
可以由類名或?qū)ο笳{(diào)用
偽代碼說(shuō)明
public?class?Variable{?static?int?a?=?0;?//類變量?String?b?=?\”hello?world\”;//實(shí)例變量?public?void?method(){?int?c?=?0;?//局部變量?}}