执行到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. CommonJs模块规范
  2. UIImage加阴影
  3. 【NLP】如何利用BERT来做基于阅读理解的信息抽取
  4. 【解决问题】idea启动本地tomcat访问localhost:8080报404错误
  5. centos上安装和配置tomcat
  6. VS2008中VC 项目 文件目录的管理 (最终无错误版)
  7. TexStudio编译报错“Critical Package xeCJK Error: The xeCJK package requires XeTeX to function. ..._criti”
  8. dump文件 linux,linux使用MAT分析dump文件
  9. 【大话Mysql面试】-Mysql常见面试题目
  10. 人工神经网络通俗解释
  11. 车辆运动学自行车模型
  12. 使用TensorFlow调用PTB数据集并且搭建基于LSTM的PTB语言模型
  13. 全网最透彻的Hash分析
  14. Computed property “XXX“ was assigned to but it has no setter
  15. 关于光源色温与标准光源的讨论
  16. js 获取字符串长度方法length
  17. 1367:查找二叉树(tree_a)
  18. Yanmar(洋马)发动机SPN-FMI代码在仪表显示
  19. 用Java程序模拟实现新冠病毒传染
  20. vue项目导入谷歌字体包

热门文章

  1. 修改jupyter notebook的默认工作目录
  2. Leetcode 109.有序链表转换二叉搜索树
  3. 理论分析IRLS迭代加权最小二乘法(根据Gorodnitsky and Rao)
  4. textarea 自动检测高度换行
  5. vue better-scroll 下拉上拉,加载刷新
  6. 2017.9.6.语文
  7. JAVA基础--继承(inheritance)
  8. [PAT] 02-线性结构2 Reversing Linked List(单向链表的逆转) - C语言实现
  9. 【转】Objective-C语法property详解
  10. android多媒体部分学习笔记八------音频录制 mediaRecorder