1. 程式人生 > >對象在內存中存在的形式

對象在內存中存在的形式

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],

也就是說兩個變量指向了堆空間的同一個地址,這也就是為什麽看到兩個小明的原因。

對象在內存中存在的形式