要了解JAVA中的傳值與傳址問題,必要先要了解JVA中的棧內存和堆內存,>>>>點些查看<<<<昨天寫的學習記錄
棧:基本數據類型、數據的引用變量,這兩種存放在棧內存
堆:new創建的對象(包換數組),是存放在堆內存中,同時分配一個內存地址值,並將其附值給引用他的變量。
以上兩點理解清楚了,傳值還是傳址問題就迎刃而解了。
以下代碼運行結果:
class ClassDemo { public static void main(String[] args) { Person a=new Person(); a.age=20; a.name="zhangsan"; Person b; b=a; b.age=33; Person c; c=b; c.age=50; System.out.println(a.age); System.out.println(b.age); System.out.println(c.age); } } class Person { String name; int age; }
這段代碼的運行步驟說明及示意圖如下:
第一步——Person a=new Person();
棧開辟空間,存放變量a;同hi ,堆中開辟空間,存放新創建的Person類實體,並分配內存地址值,假設值為0x0088,並將0x0088賦給堆中的變量a。
第二步——a.age=20;
給a在堆中的Person類對象創建age屬性,附值20。
第三步——a.name="zhangsan";
給a在堆中的Person類對象創建name屬性,附值zhangsan。
第四步——Person b;
棧開辟新空間,存放Person類變量b。此時b空間是空的,沒有地址值。
第五步——b=a;
將a的內存地址值傳給了b。此時,b也會指向堆中的Person類實體,即和a指向同一實體。
第六步——b.age=33;
給b在堆中的Person類對象創建age屬性,附值33。所以,原來的20被替換成33。
第七步——Person c;
棧開辟新空間,存放Person類變量c。此時c空間是空的,沒有地址值。
第八步——c=b;
將b的內存地址值傳給了b。此時,c也會指向堆中的Person類實體,即和b指向同一實體。
第九步——c.age=50;
給c在堆中的Person類對象創建age屬性,附值50。所以,原來的33被替換成50。
所以,以上棧內存中的a、b、c三個變量的指向堆內存中的同一實體,任一屬性值改變,其它的屬性同是變化。
執行示意圖如下: