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

引用类型作为参数传递

引用类型作为参数传递时,传递的是引用地址。所以在改变引用类型的值时,原值会改变。

代码如下:

1 public classParameterTransfer {2 public static voidmain(String[] args) {3 String[] array = new String[] {"huixin"};4 System.out.println("调用reset方法前array中的第0个元素的值是:" + array[0]);5 reset(array);6 System.out.println("调用reset方法后array中的第0个元素的值是:" + array[0]);7 }8

9 public static voidreset(String[] param) {10 param[0] = "hello, world!";11 }12

13 }

View Code

运行的结果如下:

调用reset方法前array中的第0个元素的值是:huixin

调用reset方法后array中的第0个元素的值是:hello, world!

当程序执行了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变量的值并没有改变。

参考文章:http://blog.sina.com.cn/s/blog_59ca2c2a0100qhjx.html

java 参数值_java参数传值方式相关推荐

  1. java 参数值_Java中的参数传值方式

    本文转载自 https://blog.csdn.net/SEU_Calvin/article/details/70089977 1.  你觉得下面程序会输出什么 public static void  ...

  2. soap java实现_java使用soap方式简单实现webservice (二)

    [调用webservice,可以首先根据wsdl文件生成客户端,或者直接根据地址调用,下面讨论直接调用地址的两种不同方式:axis和Soap,soap方式主要是用在websphere下 axis方式调 ...

  3. java打包_java工程打包(方式一)

    1.新建工程myproject package cn.zj; public class TestMain { public static void main(String[] args) { Syst ...

  4. 上传图片的表单java代码_java模拟post方式提交表单实现图片上传(示例代码)

    转自:http://blog.csdn.net/5iasp/article/details/8669644 模拟表单html如下: java代码如下: [java] view plain copy p ...

  5. java 打印机_java调用打印机方式二

    一.主类: package org.jeecg.print; import java.awt.BasicStroke; import java.awt.Color; import java.awt.F ...

  6. java 参数传值的练习题及答案_java方法参数传递面试题三则

    传值还是传引用是Java中很基础的一个问题,也是笔试的时候经常被考察的一个问题,总结一下. 题目1: 写出以下程序的输出内容. public class Test { public static vo ...

  7. java webmethod 参数_java详解Spring接收web请求参数的方式

    本篇文章给大家带来的内容是java详解Spring接收web请求参数的方式 .有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助. 1 查询参数 请求格式:url?参数1=值1&参 ...

  8. Java的知识点10——static关键字、静态初始化块、 参数传值机制、包、导入类import、 静态导入

    static 关键字 在类中,用static声明的成员变量为静态成员变量,也称为类变量. 类变量的生命周期和类相同,在整个应用程序执行期间都有效.它有如下特点: 1. 为该类的公用变量,属于类,被该类 ...

  9. java中数值023是什么类型_【Java 教程(原创)】023.参数传值——引用类型参数的传值...

    马上注册,结交更多好友,享用更多功能^_^ 您需要 登录 才可以下载或查看,没有帐号?立即注册 x 本帖最后由 零度非安全 于 2017-3-12 14:03 编辑 点击图片穿越到 索引帖,听说有惊喜 ...

最新文章

  1. 机房布线的最高境界……
  2. android脚步---不同界面之间切换
  3. 计算未来轻沙龙 | AI=知识+推理,知识工程与数据管理专场来了!
  4. 让我们来了解一下:操作系统和平台相关性
  5. 2014-2-28 思杨的语言能力
  6. IntelliJ IDEA for Mac 如何设置 tab 键为 4 个空格?
  7. 通过回调函数阻止进程创建(验证结束,方案完全可行)
  8. vscode python环境配置_用VScode配置Python开发环境
  9. Byval 和 ByRef 使用
  10. 大数据处理与分析方向主要干什么_不了解干法制砂?6个影响干法制砂效果的主要因素及干法制砂生产加工7大技术要点分析...
  11. 修改驱动器重定向显示格式
  12. 编写适合于自己的代码生成器 (zhuan)
  13. 【java学习之路】(java SE篇)012.网络编程
  14. SQL根据下标,返回split分割后字符串
  15. java.lang.NoClassDefFoundError: org/junit/runner/manipulation/Filter
  16. 笔记本电脑怎么拆开后盖_联想笔记本电脑怎么拆开后盖_联想笔记本怎么拆
  17. Markdown语法-表格内换行
  18. 纯生js ajax,纯生js实现Element中input组件的部分功能(慢慢完善)并封装成组件
  19. python安卓开发-一个Android开发者自学Python的心路历程
  20. 计算机组装硬件要求,组装电脑必懂的硬件知识,全是干货,教你选购硬件不求人...

热门文章

  1. 103.二叉树的锯齿形层次遍历:DFS解法
  2. 优先队列之Leetcode 23合并K个有序链表
  3. 常见熟知端口号的记忆技巧
  4. 堆栈用数组和用链表实现
  5. PhpSpreadsheet如何读取excel文件
  6. 伯克利推出世界最快的KVS数据库Anna:秒杀Redis和Cassandra
  7. 我的山寨敏捷四季之春
  8. 苹果为CloudKit云服务添加服务器端API
  9. 【scala】 scala xml 处理(⑨)
  10. 思科交换机2950 强制恢复出厂设置(清密码)