對象在內存中存在的形式
阿新 • • 發佈:2017-09-24
nbsp 查找 操作系統 也有 rgs 一段 http 全局 str
程序運行起來會在內存劃分為如圖幾個區域:
堆區:對象
棧區:基本數據類型(String類型也會存放在棧區)
全局區:存放全局數據
常量區:存放常量
代碼區:存放代碼
看下面一段代碼
public class PersonOBJ{ public static void main(String[] args){ class Person{ int age; String name; } Person a = new Person(); a.age = 10; a.name= "小明"; Person b = a;
System.out.println(a.name); System.out.println(b.name); } }
內存圖:
存儲地址以十六進制表示,存儲地址類似房間門牌號,而變量(對象)相當於為門牌號命名,地址分配的十六進制數不是如圖所示,而是取決於操作系統的分配。
Person a存放了一個對象(new Person())的地址(比如說[0x123]),Person a其自身也有個地址(比如說[0x111]),
但為了方便就簡寫成Person a存放了一個(new Person())對象的地址(Person a [0x123])。
Person a =new Person();會在內存中開辟一個新的堆空間,堆空間存放一個存儲地址為0x123的具有Person類屬性的Person a對象
在new Person();創建對象後,賦給棧區Person a變量,Person a將引用對象new Person();所在堆區的地址[0x123]
訪問並賦值對象屬性(a.age=10),會查找對象所在堆區的地址[0x123],並賦值相應屬性值;a.name="小明"以此類推。
Person b =a;
Person b仍然在棧區,把a變量(對象)賦給Person b實際上賦的值是堆區類的地址[0x123],
也就是說兩個變量指向了堆空間的同一個地址,這也就是為什麽看到兩個小明的原因。
對象在內存中存在的形式