1. 程式人生 > >JAVA_SE基礎——24.面向對象的內存分析

JAVA_SE基礎——24.面向對象的內存分析

白色 pac 函數 rac 屬性 入學 gravity water pub

黑馬程序猿入學blog ...


接著上一章的代碼:

//車類
class Car{
	
	//事物的公共屬性使用成員變量描寫敘述。

String name; //名字的屬性 String color; //顏色屬性 int wheel; //輪子數 //事物的公共行為使用函數描寫敘述。 public void run(){ System.out.println(name+"飛快的跑起來啦..."); } } class Demo1{ public static void main(String[] args) { //使用了Car類聲明了一c變量, c變量指向了一個車對象。

Car c = new Car(); //設置車對象的屬性值。 c.name = "BMW"; c.color = "白色"; c.wheel = 4; //訪問車對象的屬性值 System.out.println("名字:"+ c.name+" 顏色:"+ c.color+" 輪子數:"+c.wheel); c.run(); } }

結果是:

名字:BMW 顏色:白色 輪子數:4

BMW飛快的跑起來了



上面代碼在內存中是怎麽執行的呢?

以下我來給大家分析下:

技術分享

c是局部變量

1.先聲明了c變量 分配在棧內存

2.new Car 在堆內存創建了一個車對象 看看Car有那些成員屬性,然後再給對象分配初始值,為name=null。color=null。wheel=0 (成員一旦創建。對象的成員變量也會立即分配默認的初始值) 然後把地址0x97賦給了c c就指向了車的這個對象。

3.

c.name 就是c拿著地址找到車的對象 然後把name改成BMW.

c.color 就是c拿著地址找到車的對象 然後把color 改成白色.

c.wheel 就是c拿著地址找到車的對象 然後把wheel改成4.



以下再看個樣例:

//車類
class Car{
	//事物的公共屬性使用成員變量描寫敘述。
	String	name; //名字的屬性

	String	color; //顏色屬性

	int wheel;	//輪子數
					
	//事物的公共行為使用函數描寫敘述。

public void run(){ System.out.println(name+"飛快的跑起來啦..."); } } class Demo1{ public static void main(String[] args) { Car c1 = new Car(); Car c2 = new Car(); c1.name = "寶馬"; c2.name = "大眾"; System.out.println("名字:"+ c1.name); } }

結果:名字:寶馬


看下圖解釋:技術分享

1.先聲明了c1變量 分配在棧內存

2.new Car 在堆內存創建了一個車對象 看看Car有那些成員屬性,然後再給對象分配初始值,為name=null,color=null。wheel=0 (成員一旦創建。對象的成員變量也會立即分配默認的初始值) 然後把地址0x97賦給了c1 c1就指向了車的這個對象。

3.再聲明了c2變量 分配在棧內存

4.再new 一個 Car 在堆內存再創建了一個車對象 看看Car有那些成員屬性。然後再給對象分配初始值。為name=null,color=null,wheel=0 (成員一旦創建,對象的成員變量也會立即分配默認的初始值) 然後把地址0x67賦給了c2 c2就指向了車的這個對象。

5. c1.name 就是c1拿著地址找到車的對象 然後把name改成" 寶馬 "

6. c2.name 就是c2拿著地址找到車的對象 然後把name改成“ 大眾 ”

7. 最後輸出c1.name c1就拿著地址找到相應的對象 輸出了那個對象的name

所以結果是:寶馬

以下再把這個樣例改下:

//車類
class Car{
	
	//事物的公共屬性使用成員變量描寫敘述。
	String	name; //名字的屬性

	String	color; //顏色屬性

	int wheel;	//輪子數
					
	//事物的公共行為使用函數描寫敘述。

public void run(){ System.out.println(name+"飛快的跑起來啦..."); } } class Demo1{ public static void main(String[] args){ Car c1 = new Car(); c1.name = "寶馬"; Car c2 = new Car(); c2.name = "大眾"; c1 = c2; System.out.println("名字:"+ c1.name); } }

結果:大眾

下圖解釋:

技術分享

1.先聲明了c1變量 分配在棧內存

2.new Car 在堆內存創建了一個車對象 看看Car有那些成員屬性。然後再給對象分配初始值,為name=null,color=null,wheel=0 (成員一旦創建,對象的成員變量也會立即分配默認的初始值) 然後把地址0x97賦給了c1 c1就指向了車的這個對象。

3. c1.name 就是c1拿著地址找到車的對象 然後把name改成" 寶馬 "

4.再聲明了c2變量 分配在棧內存

5.再new 一個 Car 在堆內存再創建了一個車對象 看看Car有那些成員屬性,然後再給對象分配初始值。為name=null,color=null,wheel=0 (成員一旦創建。對象的成員變量也會立即分配默認的初始值) 然後把地址0x67賦給了c2 c2就指向了車的這個對象。

6. c2.name 就是c2拿著地址找到車的對象 然後把name改成“ 大眾 ”

7. 把c2的持有地址賦給了c1 c1的地址原來是0x97 改為 0x67

8. 最後輸出c1.name c1拿著改後的地址去找地址為0x67的對象 輸出為0x67地址的對象中的屬性name.

所以結果為;大眾

JAVA_SE基礎——24.面向對象的內存分析