JAVA傳值與傳址


要了解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三個變量的指向堆內存中的同一實體,任一屬性值改變,其它的屬性同是變化。

 

執行示意圖如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM