java的值传递和引用传递

一:搞清楚 基本类型 和 引用类型的不同之处

int num = 10;
String str = "hello";

如图所示,num是基本类型,值就直接保存在变量中。而str是引用类型,变量中保存的只是实际对象的地址。一般称这种变量为"引用",引用指向实际对象,实际对象中保存着内容。

二:搞清楚赋值运算符(=)的作用

num = 20;
str = "java";

对于基本类型 num ,赋值运算符会直接改变变量的值,原来的值被覆盖掉。
对于引用类型 str,赋值运算符会改变引用中所保存的地址,原来的地址被覆盖掉。但是原来的对象不会被改变(重要)。
如上图所示,"hello" 字符串对象没有被改变。(没有被任何引用所指向的对象是垃圾,会被垃圾回收器回收)

一个段有趣和令人困惑的代码

1  public static void main(String[] args){
2         String str = new String("ab");
3         change(str);
4         System.out.println(str);
5     }
6
7 public static void change(String str){
8         str = "cd";
9     }

结果为:ab

常见的困惑问题

x存储指向堆中的“ab”字符串的引用。所以,当x被作为参数传递到change()方法时,它仍然指向堆中“ab”,像下面这样:

因为java是按值传递的(pass-by-value), x的值是“ab”的引用。当方法的change()被调用,它会创建一个新的“cd”的对象,而x现在是指向“cd”像下面这样:

这似乎是一个相当合理的解释。他们明确表示,Java是总是传递按值。但是,错在哪里呢?

代码真正做了些什么呢?

上面的解释有几个错误。为了容易理解这一点,这是一个好主意,简单地描述整个过程。
当字符串“ab”被创建,java分配存储字符串对象所需的内存空间。然后,将对象分配给变量x,该变量是被实际分配的引用对象。此引用是该对象被存储在内存的地址。
变量x包含一个字符串对象的引用。 x不是引用本身!它是用于存储一个引用(内存地址)的变量。
Java是仅仅是按值传递。当x传递给change()方法,x的(引用)值的副本被传递。方法change()创建另一个对象“cd”,它有一个不同的引用。它是被改变的x副本指向“cd”的变量,而不是x引用本身。

下面的图表展现了真实的过程:

总结:实际上JAVA在方法里传递的只是对象的副本。

值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量.
引用传递一般是对于对象型变量而言的,传递的是该对象地址的一个副本, 并不是原对象本身 。
一般认为,java内的基础类型数据传递都是值传递. java中实例对象的传递是引用传递

转载于:https://www.cnblogs.com/xiaocao123/p/10535304.html

java中的对象传递相关推荐

  1. 一文彻底搞懂Java中的值传递和引用传递!

    关于Java中方法间的参数传递到底是怎样的.为什么很多人说Java只有值传递等问题,一直困惑着很多人,甚至我在面试的时候问过很多有丰富经验的开发者,他们也很难解释的很清楚. 我很久也写过一篇文章,我当 ...

  2. 为什么说 Java 中只有值传递?

    对于初学者来说,要想把这个问题回答正确,是比较难的.在第二天整理答案的时候,我发现我竟然无法通过简单的语言把这个事情描述的很容易理解,遗憾的是,我也没有在网上找到哪篇文章可以把这个事情讲解的通俗易懂. ...

  3. java中是引用传递还是值传递....

    刚才与Z师兄聊天,他提问: 你说java中是引用传递还是值传递啊? 当时俺搞混了这个"传递"的意思, 本来以为是对象的实例化比如: abc a=new abc(); 这个a 是引用 ...

  4. java只有值传递_面试官:为什么 Java 中只有值传递?

    1.为什么 Java 中只有值传递? 首先回顾一下在程序设计语言中有关将参数传递给方法(或函数)的一些专业术语.按值调用(call by value)表示方法接收的是调用者提供的值,而按引用调用(ca ...

  5. Java中,一切皆是对象——java中的对象类型与基本数据类型的区别

    起因:取一个list给另一个list赋值,然后在另一个list中取出进行修改.list其中类型为对象时,String时,基本数据类型时. [java中的对象类型与基本数据类型的区别] #声明和实例化 ...

  6. 【Java基础】Java中的值传递、引用传递

    Java中的值传递.引用传递 对于一个方法而言,参数是为该方法提供信息的,而不是想让该方法改变自己.--<Java编程思想> 值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本 ...

  7. 用画小狗的方法来解释Java中的值传递

    在开始看我画小狗之前,咱们先来看道很简单的题目: 下面程序的输出是什么? 如果你的回答是"小强",好,恭喜你答对了.下面我们改一下代码: 是的,我只是在changeName方法里面 ...

  8. 为什么说Java中只有值传递(另一种角度)

    转载自 为什么说Java中只有值传递 对于初学者来说,要想把这个问题回答正确,是比较难的.在第二天整理答案的时候,我发现我竟然无法通过简单的语言把这个事情描述的很容易理解,遗憾的是,我也没有在网上找到 ...

  9. java中String对象作为参数传递问题

    问题 java中将对象作为参数传递究竟是值传递还是引用传递? 1.基本类型作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝,原值是不会改变的. 2.对象作为参数传递时,是把对象在内存中的地址拷贝 ...

  10. java引用传递_理解Java中的引用传递和值传递

    关于Java传参时是引用传递还是值传递,是一个讨论比较多的话题, 有说Java中只有值传递,也有些地方说引用传递和值传递都存在,本篇记录思考过程,不保证正确性, 感兴趣的同学一起讨论. 1.基本类型和 ...

最新文章

  1. SAP QM初阶之事务代码CR05查询QM Work Center List
  2. linux学习之路--(六)用户及权限详解
  3. Ajax+jquery实现异步验证用户名功能
  4. 基于GIS的视频管理指挥平台
  5. python实现单张图像拼接与批量图片拼接
  6. 【转】MS-DOS下怎样使用解压缩共具
  7. 从PCI上读取数据 线程和定时器效率
  8. Node.js:中间件——express简单的错误处理日志中间件
  9. 【bozj2287】【[POJ Challenge]消失之物】维护多值递推
  10. 用c语言实现数字时钟课程设计,基于C51单片机的数字时钟课程设计(C语言,带闹钟).doc...
  11. readelf命令解析及演示
  12. 彻底卸载VS2015
  13. 社交网络与社会计算课程内容梳理总结
  14. 使用微信公众号openid获取用户信息判断是否关注公众号
  15. Ambari 安装多个impala deamon节点(apache impala)
  16. ps一点等于多少厘米_请问PS中“像素”和“厘米”是怎么换算的?
  17. php调用谷歌翻译,PHP调用谷歌翻译实现翻译功能
  18. Xenu简单使用说明
  19. [转]我的故乡 - 冰心
  20. PS长投影文字制作教程

热门文章

  1. shell中exec命令
  2. Word文档分割总结
  3. Objective-C 协议(protocol)
  4. 【特征选择】特征选择的通俗讲解!
  5. 【EMNLP2020】一种多层对多层的BERT蒸馏方法
  6. 使用 TensorFlow 做文本情感分析
  7. 这份字节、阿里内部秘传的面经,被我搞到手了……
  8. 每日算法系列【LeetCode 42】接雨水
  9. 具体数学-第7课(取整基础)
  10. 5.2 分类器的评价指标—accuracy、precision、recall、F1、Fβ、AUC与ROC