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

执行示意图如下:

JAVA传值与传址的更多相关文章

  1. Java传值和传址

    调用函数时,传的参数过去可能是传值,也可能是传址.如果是传值,函数内部的操作对参数的值没有影响:如果是传址,函数内部的操作是对参数指向的内存进行操作,会影响参数的值. Java到底是传值还是传址?用下 ...

  2. java方法中,传参是传值还是传址问题(对比C语言、C#和C++)

    问题引出: 编写一个简单的交换值的小程序,如果我们只是简单地定义一个交换函数接收两个数,在函数内部定义一个中间变量完成交换.那么当我们把a,b两个实参传给这个函数时,往往得不到预期的结果.这是为什么呢 ...

  3. Java方法传递参数传值还是传址的问题

    这几天重构项目代码遇到一个疑问:可不可以在方法A中定义一个boolean变量b为false,然后A调用方法C把b传递到C方法中经过一些列业务判断后修改为true,C执行结束后A方法中b的值还是原来的f ...

  4. javascript的变量,传值和传址,参数之间关系

    先把收获晾一下: 1.javascrip变量包含两种类型的值,一种为引用类型的值,一种是基本类型的值.引用类型包括:Array,Object,Function(可以这么理解,非基本类型的都是引用类型) ...

  5. Python的传值和传址与copy和deepcopy

    1.传值和传址 传值就是传入一个参数的值,传址就是传入一个参数的地址,也就是内存的地址(相当于指针).他们的区别是如果函数里面对传入的参数重新赋值,函数外的全局变量是否相应改变,用传值传入的参数是不会 ...

  6. 图解JS的传值与传址

    //编程过程中经常会碰到传值,传址的问题!今天的主题就是关于传值.与传址. //先讲讲赋值操作 //下例是原始类型赋值操作 var a=1,b=a,a=2; console.log("a=& ...

  7. javascript . 05 json的组成、for...in 遍历对象、简单数据类型与复杂数据类型的传值与传址、内置对象

    对象字面量  JSON var obj = { aaa :999}; var json={"aaa":999,"bbb":888}; "kay&quo ...

  8. 工控随笔_18_西门子_WinCC的VBS脚本_07_变量作用域和传值、传址

    在vbs脚本中也存在和其他编程语言一样的概念,那就是变量的作用域,变量的作用域决 定在什么范围内可以访问. 同样的在vbs脚本中对于变量也有一个生命周期, 变量的生命周期决定了变量的存续时间 这个主要 ...

  9. Python 传值和传址 copy/deepcopy

    传值:被调函数局部变量改变不会影响主调函数局部变量 传址:被调函数局部变量改变会影响主调函数局部变量 Python参数传递方式:传递对象引用(传值和传址的混合方式),如果是数字,字符串,元组则传值:如 ...

随机推荐

  1. ELK 日志分析体系

    ELK   日志分析体系 ELK 是指 Elasticsearch.Logstash.Kibana三个开源软件的组合. logstash                       负责日志的收集,处 ...

  2. ICE BOX 配置,使用----第一篇

    一 理论部分 (1) 为什么要使用icebox? icebox server代替了通常的server. icebox是为了方便集中管理多个ice服务而建立的. 它通过使用icebox服务器,把ice服 ...

  3. iOS开发——绘图电池按百分比显示

    1.在DrawLine.h文件中提供了一个改变电池电量数值的接口 // //  DrawLine.h //  Demo-draw2 // //  Created by yyt on 16/5/11. ...

  4. VR元年,VR虚拟现实这只风口上的猪有怎样的变化?

    走过了2016年,无论我们承认不承认,这一年到底是不是VR元年,我们都很难否定,在这一年,VR虚拟现实生态圈有很大的变化,那么,这一年VR虚拟现实到底有怎样的改变呢?我们的VR虚拟现实生态圈,发生了什 ...

  5. 在IOS中使用DES算法对Sqlite数据库进行内容加密存储并读取解密

    在IOS中使用DES算法对Sqlite 数据库进行内容加密存储并读取解密 涉及知识点: 1.DES加密算法: 2.OC对Sqlite数据库的读写: 3.IOS APP文件存储的两种方式及读取方式. 以 ...

  6. java系列--JSP的属性和内置对象

    一.JSP指令: <%@ 指令名 属性=" " %> 1.page指令 import属性 errorPage属性 language属性 session属性 isErro ...

  7. 笔记整理——使用openssl编程

    error: openssl 的所有解决方案 (2013/6/22 17:39:00) error: openssl/crypto.h: No such file or directory 解决方案 ...

  8. 包含中文字符的NSString 转换为NSURL

    转包含中文字符的NSString 转换为NSURL NSString中如果包括中文字符的话转换为NSURL得到的值为nil,在网上搜了下,用stringByAddingPercentEscapesUs ...

  9. 【T】并行调度

    /** * 并行调度相关处理 * * 按卫星*日期 ,将待处理的任务分解为 卫星+日期 粒度的子任务 添加到paramMapList列表中 */ List<Map<String, Obje ...

  10. PHP header( ) 禁止页面后退

    header("Cache-control:no-cache,no-store,must-revalidate"); header("Pragma:no-cache&qu ...