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