无论是什么语言,要讨论参数传递方式,就得从内存模型说起,主要是我个人觉得从内存模型来说参数传递更为直观一些。闲言少叙,下面我们就通过内存模型的方式来讨论一下Java中的参数传递。

这里的内存模型涉及到两种类型的内存:栈内存(stack)和堆内存(heap)。基本类型作为参数传递时,传递的是这个值的拷贝。无论你怎么改变这个拷贝,原值是不会改变的。看下边的一段代码,然后结合内存模型来说明问题:

这段代码运行的结果如下:

程序运行的结果也说明这一点,无论你在add()方法中怎么改变参数param的值,原值num都不会改变。

下边通过内存模型来分析一下。

当执行了int num = 30;这句代码后,程序在栈内存中开辟了一块地址为AD8500的内存,里边放的值是30,内存模型如下图:

执行到add()方法时,程序在栈内存中又开辟了一块地址为AD8600的内存,将num的值30传递进来,此时这块内存里边放的值是30,执行param = 100;后,AD8600中的值变成了100。内存模型如下图:

地址AD8600中用于存放param的值,和存放num的内存没有任何关系,无论你怎么改变param的值,实际改变的是地址为AD8600的内存中的值,而AD8500中的值并未改变,所以num的值也就没有改变。

以上是基本类型参数的传递方式,下来我们讨论一下对象作为参数传递的方式。

先看下边的示例代码:

运行的结果如下:

当对象作为参数传递时,传递的是对象的引用,也就是对象的地址。下边用内存模型图来说明。

当程序执行了String[] array = new String[] {"huixin"}后,程序在栈内存中开辟了一块地址编号为AD9500内存空间,用于存放array[0]的引用地址,里边放的值是堆内存中的一个地址,示例中的值为BE2500,可以理解为有一个指针指向了堆内存中的编号为BE2500的地址。堆内存中编号为BE2500的这个地址中存放的才是array[0]的值:huixin。

当程序进入reset方法后,将array的值,也就是对象的引用BE2500传了进来。这时,程序在栈内存中又开辟了一块编号为AD9600的内存空间,里边放的值是传递过来的值,即AD9600。可以理解为栈内存中的编号为AD9600的内存中有一个指针,也指向了堆内存中编号为BE2500的内存地址,如图所示:

这样一来,栈内存AD9500和AD9600(即array[0]和param的值)都指向了编号为BE2500的堆内存。

在reset方法中将param的值修改为hello, world!后,内存模型如下图所示:

改变对象param的值实际上是改变param这个栈内存所指向的堆内存中的值。param这个对象在栈内存中的地址是AD9600,里边存放的值是BE2500,所以堆内存BE2500中的值就变成了hello,world!。程序放回main方法之后,堆内存BE2500中的值仍然为hello,world!,main方法中array[0]的值时,从栈内存中找到array[0]的值是BE2500,然后去堆内存中找编号为BE2500的内存,里边的值是hello,world!。所以main方法中打印出来的值就变成了hello,world!

小结:

无论是基本类型作为参数传递,还是对象作为参数传递,实际上传递的都是值,只是值的的形式不用而已。第一个示例中用基本类型作为参数传递时,将栈内存中的值30传递到了add方法中。第二个示例中用对象作为参数传递时,将栈内存中的值BE2500传递到了reset方法中。当用对象作为参数传递时,真正的值是放在堆内存中的,传递的是栈内存中的值,而栈内存中存放的是堆内存的地址,所以传递的就是堆内存的地址。这就是它们的区别。

补充一下,在Java中,String是一个引用类型,但是在作为参数传递的时候表现出来的却是基本类型的特性,即在方法中改变了String类型的变量的值后,不会影响方法外的String变量的值。关于这个问题,可以参考如下两个地址:

我觉得是这两篇文章中提到的两个原因导致的,一个是String实际上操作的是char[],可以理解为String是char[]的包装类。二是给String变量重新赋值后,实际上没有改变这个变量的值,而是重新new了一个String对象,改变了新对象的值,所以原来的String变量的值并没有改变。

java 参数传递_java中方法的参数传递机制相关推荐

  1. java传参数的方法_java中方法的参数传递机制

    无论是什么语言,要讨论参数传递方式,就得从内存模型说起,主要是我个人觉得从内存模型来说参数传递更为直观一些.闲言少叙,下面我们就通过内存模型的方式来讨论一下Java中的参数传递. 这里的内存模型涉及到 ...

  2. 类与方法java讲解_Java中方法使用的深入讲解

    方法的使用 1.方法的基本用法 什么是方法,方法就是一个代码片段,类似于c/c++ 语言中的"函数". 1.1方法存在的意义: 是能够模块化的组织代码(当代码规模比较复杂的时候). ...

  3. 两种参数类型_深入理解Java中方法的参数传递机制

    形参和实参 我们知道,在Java中定义方法时,是可以定义参数的,比如: public static void main(String[] args){ } 这里的args就是一个字符串数组类型的参数. ...

  4. java中gettext方法_深入理解Java中方法的参数传递机制

    形参和实参 我们知道,在Java中定义方法时,是可以定义参数的,比如: public static void main(String[] args){ } 这里的args就是一个字符串数组类型的参数. ...

  5. java中方法的参数传递机制

    转载自 :https://www.cnblogs.com/lixiaolun/p/4311863.html 问:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果, ...

  6. java 中方法里的参数_【Java基础】12、java中方法的参数传递机制

    无论是什么语言,要讨论参数传递方式,就得从内存模型说起,主要是我个人觉得从内存模型来说参数传递更为直观一些.闲言少叙,下面我们就通过内存模型的方式来讨论一下Java中的参数传递. 这里的内存模型涉及到 ...

  7. Java中方法调用参数传递的方式是传值,尽管传的是引用的值而不是对象的值。(Does Java pass by reference or pass by value?)

    原文地址:http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html 在Java中,所有的对象变量都是引用,Java通 ...

  8. java中方法的参数传递

    java中方法的参数传递方式只有一种:值传递: 对于基本类型来说,传递的是实参的副本(值传递),故在方法内修改传递进来的值并不会影响实参本身: 对于引用类型来说,传递进来的是引用变量的副本(也是值传递 ...

  9. java 传入参数_Java 中方法参数的传递

    java中方法参数传递看似有两种,值传递和引用传递.而实际上都是值传递. 所谓值传递,传递的是变量的副本就是说,在将变量a作为参数传进方法中时,方法中接收到的是a的副本,在方法中对参数的修改实际上修改 ...

最新文章

  1. 院士论坛|李德仁:测绘遥感与智能驾驶
  2. Matt Smith 的 悬浮标签
  3. 算法与数据结构(归并排序)
  4. springboot redis 断线重连_Redis的主从复制是如何做的?复制过程中也会产生各种问题?...
  5. dynamic web module 2.5与2.4
  6. 使用sharepreferce记录数组数据
  7. iview 3.x 升级指南 —— Icon 篇
  8. selenium自动化案例(二)滑动验证码破解
  9. oracle pl/sql 游标,Oracle PL/SQL 关于游标的介绍
  10. python 单位根检验代码_python时间序列分析
  11. 历时 7 天,我把一万行 Scala 代码移植到了 Kotlin 上!
  12. java创建集合有的不用泛型_Java如何创建泛型集合?
  13. Revit中导入的CAD标高不统一处理及“标高管理”
  14. 传统制造业和工业如何和大数据进行结合
  15. 软件测试缺陷等级划分_软件测试的缺陷等级
  16. 汽车门店管理系统 php,大型汽车4s店维修管理系统多门店版(源码+数据库+截图)...
  17. 阻抗匹配是什么意思?阻抗匹配原理详解
  18. 5月地图软件影响力报告:百度谷歌搜狗居前三甲
  19. 1.3 新概念 可数名词变复数
  20. 命名时取代基优先顺序_烷烃的系统命名

热门文章

  1. 牛气!GitHub 标星 119K+!这些神器仅需一行代码即可下载全网视频!
  2. 入门 | 32 个常用 Python 实现
  3. 京东也不甘当当后!买书4折优惠!
  4. python asyncio理解_我实在不懂Python的Asyncio
  5. 已知三角形三边长怎么求面积_已知三角形三边求面积的公式——海伦公式
  6. 交大网院计算机第五次作业答案,交大网院计算机第三次作业分析.docx
  7. 通过doi可以检索到文献_怎么查看中外文献的期号和卷号?
  8. 深度学习-Tensorflow2.2-深度学习基础和tf.keras{1}-梯度下降算法概述-03
  9. json报文转化为xml报文_JSON与XML互相转化(Jackson)
  10. [转] Oracle中Blob转Clob