程序员基本功02对象与内存控制
以下的答案為我自己的讀書(shū)心得(捏造的答案),如有童鞋不忍直視,還請(qǐng)不吝賜教
1、實(shí)例變量屬于JAVA對(duì)象
2、類變量屬于類本身
類體內(nèi)定義的變量稱為成員變量,沒(méi)有static修飾的為非靜態(tài)變量或?qū)嵗兞?#xff0c;有static修飾的為靜態(tài)變量或類變量。static只能修飾類里的成員,不能修飾外部類、局部變量、局部?jī)?nèi)部類。
3、實(shí)例變量的初始化細(xì)節(jié)
實(shí)例變量屬于JAVA對(duì)象本身,每次程序創(chuàng)建對(duì)象時(shí)需要為實(shí)例變量分配內(nèi)存空間,并進(jìn)行初始化。
程序在3個(gè)地方對(duì)實(shí)例變量進(jìn)行初始化:定義時(shí)指定初始值,非靜態(tài)初始化塊中指定初始值,構(gòu)造器中指定初始值。前倆種方法比第三種更早執(zhí)行。
4、類變量的初始化細(xì)節(jié)
JAVA程序運(yùn)行時(shí),系統(tǒng)只為類變量分配一次內(nèi)存空間,執(zhí)行一次初始化。
程序可以在2個(gè)地方對(duì)類變量進(jìn)行初始化:定義類變量時(shí)指定初始值,靜態(tài)初始化塊中對(duì)類變量指定初始值。
類變量可以通過(guò)(類.變量)直接賦值。一個(gè)類變量只需一塊內(nèi)存空間(無(wú)論怎么復(fù)制,它的值只有一個(gè));但對(duì)于實(shí)例變量,該類每創(chuàng)建一次實(shí)例,就需要為實(shí)例變量分配一塊內(nèi)存空間。
類變量的初始化時(shí)機(jī)處于實(shí)例變量的初始化之前。定義成員變量時(shí)必須采用前向引用。
5、子類構(gòu)造器調(diào)用父類構(gòu)造器
程序依次調(diào)用每個(gè)父類非靜態(tài)初始化塊、父類構(gòu)造器執(zhí)行初始化,最后調(diào)用本類的靜態(tài)初始化塊、構(gòu)造器初始化塊。至于調(diào)用父類哪個(gè)構(gòu)造器進(jìn)行初始化,則分為3種情況:
a)子類構(gòu)造器使用super顯示調(diào)用父類構(gòu)造器,系統(tǒng)根據(jù)super調(diào)用里傳入的實(shí)參列表確定調(diào)用父親的哪個(gè)構(gòu)造器
b)子類構(gòu)造器使用this顯示調(diào)用本類中重載構(gòu)造器,系統(tǒng)會(huì)根據(jù)this調(diào)用里傳入的實(shí)參列表確定本類的另一個(gè)構(gòu)造器
c)子類構(gòu)造器中既沒(méi)有super也沒(méi)有this,系統(tǒng)隱式調(diào)用父類無(wú)參構(gòu)造器。
注:super用于顯示調(diào)用父類構(gòu)造器,this用于顯示調(diào)用本類中另一個(gè)重載構(gòu)造器,super和this只能在構(gòu)造器中使用,且作為第一行代碼。
6、避免在構(gòu)造器中訪問(wèn)子類的實(shí)例變量
構(gòu)造器只負(fù)責(zé)JAVA對(duì)象實(shí)例變量執(zhí)行初始化,在初始化之前,該對(duì)象所占內(nèi)存已經(jīng)被分配,默認(rèn)是空值。
當(dāng)this在構(gòu)造器中時(shí),this代表正在初始化的JAVA對(duì)象。
7、避免在構(gòu)造器中調(diào)用被子類重寫(xiě)的方法
程序執(zhí)行時(shí),會(huì)首先調(diào)用父類的構(gòu)造器,若父類中的構(gòu)造器方法被子類重寫(xiě),則程序重寫(xiě)方法會(huì)在子類構(gòu)造器所有代碼執(zhí)行前執(zhí)行,此時(shí)子類的成員變量還是默認(rèn)值,從而導(dǎo)致子類重寫(xiě)方法訪問(wèn)不到子類實(shí)例變量值的情形。
8、JAVA繼承對(duì)成員變量和方法的區(qū)別
不管多少個(gè)變量,只要他們實(shí)際指向一個(gè)對(duì)象,無(wú)論他們聲明時(shí)是什么類型,當(dāng)調(diào)用方法時(shí),方法的行為總表現(xiàn)出他們實(shí)際類型行為;但如果通過(guò)這些變量訪問(wèn)他們所指對(duì)象的實(shí)例變量,這些變量總表現(xiàn)為聲明這些變量的行為。
9、父、子實(shí)例的實(shí)例變量的內(nèi)存分配機(jī)制
當(dāng)程序創(chuàng)建一個(gè)子類對(duì)象時(shí),系統(tǒng)不僅會(huì)為該類中定義的實(shí)例變量分配內(nèi)存,也會(huì)為其父類中定義的實(shí)例變量分配內(nèi)存,即使子類中定義了與父類中同名實(shí)例變量,子類中定義的變量會(huì)隱藏父類中定義的變量。為了在子類方法中訪問(wèn)父類中定義的被隱藏的實(shí)例變量,或者被覆蓋的方法,可以通過(guò)super作為限定來(lái)修飾這些實(shí)例變量和實(shí)例方法。
10、父、子類的類變量的內(nèi)存分配
類變量屬于類本身,實(shí)例變量屬于JAVA變量,類變量在類初始化階段完成初始化,實(shí)例變量在對(duì)象初始化階段完成初始化。使用類名作為主調(diào)來(lái)訪問(wèn)類變量,能保持最好的代碼可讀性。當(dāng)然也可以使用super來(lái)訪問(wèn)。
11、final修飾符的作用
final修飾變量,必須由程序員顯示指定初始值,本質(zhì)上fianl實(shí)例變量只能在構(gòu)造器中被賦值。final類變量也必須顯示的被賦值,本質(zhì)上只能在靜態(tài)初始化塊中被賦值。如果定義final變量時(shí)指定初始值,而且該初始值可以在編譯時(shí)就被確定下來(lái)。
12、系統(tǒng)對(duì)哪些final變量執(zhí)行“宏替換”
對(duì)于一個(gè)final變量,不管它時(shí)類變量、實(shí)例變量還是局部變量,只要定義該變量時(shí)使用final修飾符,并指定了初始值,而且該初始值可以在編譯時(shí)就被確定下來(lái),那么這個(gè)final變量本質(zhì)上已經(jīng)不再是變量,而是一個(gè)直接量。
13、final方法注意點(diǎn)
final方法不能被重寫(xiě)
14、使用final修飾被匿名、局部?jī)?nèi)部類訪問(wèn)的局部變量
如果程序需要在匿名內(nèi)部類中使用局部變量,那么局部變量必須使用final修飾。
總結(jié)
以上是生活随笔為你收集整理的程序员基本功02对象与内存控制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 程序员基本功01数组与内存控制
- 下一篇: 程序员基本功03常见JAVA集合的实现细