java 继承的内存分配_图解Java继承内存分配
繼承的基本概念:
(1)Java不支持多繼承,也就是說(shuō)子類(lèi)至多只能有一個(gè)父類(lèi)。
(2)子類(lèi)繼承了其父類(lèi)中不是私有的成員變量和成員方法,作為自己的成員變量和方法。
(3)子類(lèi)中定義的成員變量和父類(lèi)中定義的成員變量相同時(shí),則父類(lèi)中的成員變量不能被繼承。
(4)子類(lèi)中定義的成員方法,并且這個(gè)方法的名字返回類(lèi)型,以及參數(shù)個(gè)數(shù)和類(lèi)型與父類(lèi)的某個(gè)成員方法完全相同,則父類(lèi)的成員方法不能被繼承。
分析以上程序示例,主要疑惑點(diǎn)是“子類(lèi)繼承父類(lèi)的成員變量,父類(lèi)對(duì)象是否會(huì)實(shí)例化?私有成員變量是否會(huì)被繼承?被繼承的成員變量在哪里分配空間?”
1:虛擬機(jī)加載ExtendsDemo類(lèi),提取類(lèi)型信息到方法區(qū)。
2:通過(guò)保存在方法區(qū)的字節(jié)碼,虛擬機(jī)開(kāi)始執(zhí)行main方法,main方法入棧。
3:執(zhí)行main方法的第一條指令,new Student(); 這句話(huà)就是給Student實(shí)例對(duì)象分配堆空間。因?yàn)镾tudent繼承Person父類(lèi),所以,虛擬機(jī)首先加載Person類(lèi)到方法區(qū),并在堆中為父類(lèi)成員變量在子類(lèi)空間中初始化。然后加載Student類(lèi)到方法區(qū),為Student類(lèi)的成員變量分配空間并初始化默認(rèn)值。將Student類(lèi)的實(shí)例對(duì)象地址賦值給引用變量s。
4:接下來(lái)兩條語(yǔ)句為成員變量賦值,由于name跟age是從父類(lèi)繼承而來(lái),會(huì)被保存在子類(lèi)父對(duì)象中(見(jiàn)圖中堆中在子類(lèi)實(shí)例對(duì)象中為父類(lèi)成員變量分配了空間并保存了父類(lèi)的引用,并沒(méi)有實(shí)例化父類(lèi)。),所以就根據(jù)引用變量s持有的引用找到堆中的對(duì)象(子類(lèi)對(duì)象),然后給name跟age賦值。
4:調(diào)用say()方法,通過(guò)引用變量s持有的引用找到堆中的實(shí)例對(duì)象,通過(guò)實(shí)例對(duì)象持有的本類(lèi)在方法區(qū)的引用,找到本類(lèi)的類(lèi)型信息,定位到say()方法。say()方法入棧。開(kāi)始執(zhí)行say()方法中的字節(jié)碼。
5:say()方法執(zhí)行完畢,say方法出棧,程序回到main方法,main方法執(zhí)行完畢出棧,主線(xiàn)程消亡,虛擬機(jī)實(shí)例消亡,程序結(jié)束。
總結(jié):相同的方法會(huì)被重寫(xiě),變量沒(méi)有重寫(xiě)之說(shuō),如果子類(lèi)聲明了跟父類(lèi)一樣的變量,那意味著子類(lèi)將有兩個(gè)相同名稱(chēng)的變量。一個(gè)存放在子類(lèi)實(shí)例對(duì)象中,一個(gè)存放在父類(lèi)子對(duì)象中。父類(lèi)的private變量,也會(huì)被繼承并且初始化在子類(lèi)父對(duì)象中,只不過(guò)對(duì)外不可見(jiàn)。
super關(guān)鍵字在java中的作用是使被屏蔽的成員變量或者成員方法變?yōu)榭梢?jiàn),或者說(shuō)用來(lái)引用被屏蔽的成員變量或成員方法,super只是記錄在對(duì)象內(nèi)部的父類(lèi)特征(屬性和方法)的一個(gè)引用。啥叫被屏蔽的成員變量或成員方法?就是被子類(lèi)重寫(xiě)了的方法和定義了跟父類(lèi)相同的成員變量,由于不能被繼承,所以就稱(chēng)作被屏蔽。
說(shuō)到這里,上面提出的疑惑也就解開(kāi)了。
總結(jié)
以上是生活随笔為你收集整理的java 继承的内存分配_图解Java继承内存分配的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 在农在东北这一带农村居住建一个彩钢房50
- 下一篇: 拍拍贷还完还能借吗