乙個物件,兩個物件,同乙個物件的記憶體解析

2021-09-11 16:21:56 字數 1036 閱讀 7779

1.首先我們知道方法區放的是.calss檔案 所以 phone.calss he  demo01phoneone.calss出現在方法區,

2.然後當方法要執行的時候首先需要進棧這時候main 方法進棧 宣告了乙個區域性變數 phone one;

3.我們,我們又知道方法堆中放的是new出來的,所以 new phone()在堆中  他有 成員變數和成員方法(成員方法 儲存的是方法區中記憶體的16 進製的乙個位址 0x999 )而這就是整個new phone()的記憶體空間,而new phone()也有乙個在堆中開闢的物件位址(0x666)

4.這時候當我們執行 one.brand="蘋果"時 通過位址0x666 去訪問堆中的記憶體將成員變數的預設值進行替換

5.當我們繼續執行 call(string who) 這個方法時他有2 個步驟先根據0x666找到new phone()在堆中開闢的空間,然後通過0x999

去方法區找到 call(string who) 方法,然後進棧 執行完畢出棧。

1.兩個物件和乙個物件基本沒有什麼區別

2.只是要注意當又new了乙個物件的時候,堆中又開闢了乙個物件的空間,這時候 phone two 這個區域性變數指向的是新開闢的堆的物件空間物件位址為0x333 ,而成員方法在方法區的位址不變。

1.同乙個物件和前面沒什麼大的區別

只需要注意當你 phone two=one時 one儲存的是堆中的物件的位址值,也就是0x666

而two這時候和one指向的是堆中的同乙個位址值,因為執行第乙個one時成員變數變為了蘋果等等,這時候當two指向這個位址值時,成員變數已經不是原來的預設值 null等,而是蘋果了,這時候講蘋果替換成三星。然後執行方法出棧

c 實現同乙個類的兩個物件融合為乙個物件

需求是,同一型別的兩個物件a,b,合併為c,要求 a所有字段及其巢狀欄位有值的話,將來自a的值賦給c,若沒有值的話,將來自b的值賦給c。一開始我想使用反射遍歷所有子欄位成員去完成這個工作,但是實際嘗試之後發現其中邏輯分支比較多,尤其是對泛型的處理,導致很複雜而不好實現。後來調整思路,對物件的所有字段...

new乙個物件的過程和clone乙個物件的區別?

new 操作符的本意是分配記憶體。程式執行到 new 操作符時,首先去看 new 操作符後面的型別,因為知道了型別,才能知道要分配多大的記憶體空間。分配完記憶體之後,再呼叫建構函式,填充物件的各個域,這一步叫做物件的初始化,構造方法返回後,乙個物件建立完畢,可以把他的引用 位址 發布到外部,在外部就...

PLSQL訪問同乙個Oracle的兩個例項

客戶端直接看配置檔案,wolfdb 和zt 是例項 listener.ora network configuration file c.0 dbhome 1 network admin listener.ora generated by oracle configuration tools.list...