面向对象(上)知识点
該文章是看書時的一些相對自己來說較為重要的知識點,所以此博文不建議除本人外的任何人看。
棧內存的引用變量指向實例在堆內存中的首地址。
this關鍵字,總是指向調用該方法的對象,即誰在調用這個方法,this就代表誰。
值傳遞:方法里傳的參數是實際值的副本。
引用傳遞: 方法里的參數的實際值是對象在堆內存中的引用,即內存首地址。但該參數也是將引用變量的值復制一份副本,只不過該副本也是對象的內存首地址,所以看起來傳的是引用,但歸根結底,也只值傳遞,只不過這個值是個引用。
棧內存:一個方法會開辟對應的一個棧區。同一個棧區內,數據共享。如先執行int a = 10;時,若該棧區內還沒有10這個值,則將10放進該棧中;若再執行int b=10;時,由于第一句代碼時將10放進了該棧中,些時b和a這兩個變量就會在該棧區內都指向同一個10,即數據共享。
棧用來存局部變量,棧的存取速度僅次于寄存器。
堆內存:堆內存用于存對象、數組、成員變量(類變量:有static修飾、實例變量:沒有static修飾)。它可動態分配內存。
代碼: Person p = new Person();的執行過程:
類成員(static修飾)屬于類,實例成員(無static修飾)屬于對象。類成員只在第1次創建對象時初始化,后面創建的對象與第1個對象共用初始化好的類成員。
重寫規則:兩同、兩小、一大。即同名、同參數量、訪問權限大于等父類。還有就是拋出異常和返回類型必須小于等于父類。
重載規則:方法名相同,參數列表不同。
引用類型強轉條件: 編譯時類型是運行時類型的父類的對象,才可被子類(運行時類型)強轉。如:Parent p = new Son();
權限允許時,子類可直接調用父類的成員變量和方法。
父類被子類重寫的方法,不能再被子類對象調用用了,即使父類構造中調用了該方法。在創建子類對象時,即使調用父類構造時,執行的方法也是重寫的。所以盡量不要在構造中調用方法,否則容易出問題。
組合與繼承的內存開銷一樣,只不過組合多了個引用變量。組合既實現了復用,又保證了代碼的封裝性,因數繼承容易破壞封裝性,如重寫。
構造器、初始化的執行順序:
第一次創建對象時:
再次創建對象時:
為什么初始化塊執行在構造器之前?
因為初始化塊其實是個假象,在Java編譯后,初始化塊代碼會被還原到構造器,所以要執行在之前。
為什么靜態初始化塊都只執行一次?
因為靜態初始化塊跟類變量都是static修飾的,一樣屬于類,所以都只在第一次實例化對象執行時執行。
注:所有類都默認有構造器,如果自己定義了構造器,則默認的失效。
總結
以上是生活随笔為你收集整理的面向对象(上)知识点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AngularJS自定义指令详解(有分页
- 下一篇: 面向对象(下)知识点