• 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三个变量的指向堆内存中的同一实体,任一属性值改变,其它的属性同是变化。

    执行示意图如下:

  • 相关阅读:
    声音走样
    Terrain
    输出循环小数
    解决代码中多余的空行
    与二进制有关的几道面试题
    反转一个整数
    DirectX常见编译错误及解决办法
    STLset
    Visual Studio Autoexpand Information for DirectX 9
    素数环谈代码优化
  • 原文地址:https://www.cnblogs.com/ibelieve618/p/6381904.html
Copyright © 2020-2023  润新知