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

    执行示意图如下:

  • 相关阅读:
    机器学习-线性模型
    机器学习-性能度量
    机器学习-模型评估
    机器学习-术语笔记本
    linux中文在线帮助文档
    【docker】搭建本地私有镜像库(转)
    【VUE】VUE问题记录
    【JS】闭包的本质
    【Maven】Maven使用记录
    【JS】纯JS实现div中的文字双击可编辑
  • 原文地址:https://www.cnblogs.com/ibelieve618/p/6381904.html
Copyright © 2011-2022 走看看