java中子類實例化過程中的內存分配


知識點:

       子類繼承父類之后,實例化子類時,內存中子類是如何分配內存的呢?

       下面,自己會結合一個例子,解釋一下,一個子類實例化過程中,內存是如何分配的

參考博客:http://www.cnblogs.com/xdp-gacl/p/3635948.html

(1)代碼例子

//動物
public class Animal{
public String name;//名稱
public int age;//年齡

public Animal(){
this.age=100;
System.out.println("動物無參構造函數!");
}
//展示動物屬性方法
public void showInfo(){
this.name="動物名";
System.out.println("Animal.name:"+this.name);
}


}

//人
public class Person extends Animal {
public String name;//名稱
public Person(){
System.out.println("人無參構造函數!");
}
//展示(動物)人類屬性方法
@Override
public void showInfo(){
super.showInfo();//調用父類的方法,給Animal的name賦值並輸出
this.name="人名";
System.out.println("Animal.age:"+super.age);//輸出父類的age值
System.out.println("Person.name:"+this.name);//輸出Person實例的name值

}

}
//測試類
public class Test {
public static void main(String[] args) {
Person p=new Person();
p.showInfo();
}
}
運行結果:


(2)子類實例化過程中的內存分配

針對於上面的例子,分析一下內存分配
執行main方法中的第一句:
Person p=new Person();
先在棧(stack)空間中產生一個變量p,變量p里面存放的值是,Person類new的實例化對象的堆地址,通過這個值就可以找到堆中new對象的值,因為Person類是繼承Animal父類的子類,所以在new Person對象時,這個對象里包含了Animal對象,Animal的name屬性聲明是沒有初始化值,在程序編譯時,會默認賦值null(String類型為null,int類型是0),Animal的age屬性,在調用Person類的構造方法時,會先調用父類的無參構造函數,並給age賦值為100,同理Person類對象自己的屬性name值為null,因此在執行Person p=new Person();之后,虛擬機中的內存分配
如下:


執行第二句話
 
        
p.showInfo();

我們在new一個對象時,這個對象如果是繼承一個父類,那么在堆中會產生一個this和一個super引用,this引用指向這個子類對象本身,super引用則指向子類包含的父類對象,如何沒有繼承父類,則僅僅只有this引用。當執行p.showInfo();時,進入Person類的showInfo()方法,開始會通過super引用,調用父對象的 showInfo();的方法,將父對象的name值變成“動物名”並打印,然后通過this引用調用子類自己的name屬性並賦值“人名”,然后打印自己的name值,父對象的age(100)值,這是內存如下:

結合內存分析,上面打印結果,就一目了然啦!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM