Java 参数传递机制详解 Java 中的参数传递机制是一个经久不息的讨论话题,究竟是“传值”还是“传引用”,双方各执一词,互不相让。本文将通过详细的分析和实例,揭开 Java 参数传递机制的奥秘。 基本类型作为参数传递 我们来看基本类型作为参数传递的例子: ```java public class Test1 { public static void main(String[] args) { int n = 3; System.out.println("Before change, n = " + n); changeData(n); System.out.println("After changeData(n), n = " + n); } public static void changeData(int nn) { n = 10; } } ``` 从输出结果可以看到,基本类型作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝,原值是不会改变的。 对象作为参数传递 现在,我们来看看对象作为参数传递的例子: ```java public class Test2 { public static void main(String[] args) { StringBuffer sb = new StringBuffer("Hello "); System.out.println("Before change, sb = " + sb); changeData(sb); System.out.println("After changeData(n), sb = " + sb); } public static void changeData(StringBuffer strBuf) { strBuf.append("World!"); } } ``` 从输出结果可以看到,sb 的值被改变了,那么是不是可以说:对象作为参数传递时,是把对象的引用传递过去,如果引用在方法内被改变了,那么原对象也跟着改变。 对象作为参数传递的迷惑 但是,下面的例子让我们感到迷惑: ```java public class Test3 { public static void main(String[] args) { StringBuffer sb = new StringBuffer("Hello "); System.out.println("Before change, sb = " + sb); changeData(sb); System.out.println("After changeData(n), sb = " + sb); } public static void changeData(StringBuffer strBuf) { strBuf = new StringBuffer("Hi "); strBuf.append("World!"); } } ``` 按照前面的例子,我们认为对象作为参数传递时,是把对象的引用传递过去,如果引用在方法内被改变了,那么原对象也跟着改变。那么,我们应该输出: Before change, sb = Hello After changeData(n), sb = Hi World! 但是,运行这个程序,结果却是: Before change, sb = Hello After changeData(n), sb = Hello 这是让人迷惑的地方,对象作为参数传递时,同样是在方法内改变了对象的值,为什么有的是改变了原对象的值,而有的并没有改变原对象的值呢? 揭开奥秘 我们来仔细分析一下,揭开这中间的奥秘吧。我们来看 Test2 这个程序: StringBuffer sb = new StringBuffer("Hello "); 这一句执行完后,就会在内存的堆里生成一个 sb 对象,请看图 1: 如图 1 所示,sb 是一个引用,里面存放的是一个地址“@3a”(这个“@3a”是我举的代表内存,实际上是 JVM 分配的内存地址)。 当我们调用 changeData 方法时,实际上是将 sb 的引用传递给了 changeData 方法。在 changeData 方法中,我们可以改变 sb 引用的值,但是这并不意味着原来的 sb 对象也跟着改变。 在 Test3 中,我们可以看到,changeData 方法中创建了一个新的 StringBuffer 对象,并将其赋值给 strBuf,这时,strBuf 引用的是新的对象,而不是原来的 sb 对象。所以,原来的 sb 对象并没有改变。 结论 Java 中的参数传递机制,可以简单地总结为:基本类型作为参数传递时,是传递值的拷贝;对象作为参数传递时,是传递对象的引用。如果你在方法内改变了对象的值,那么原对象也跟着改变,但是如果你重新分配了对象的引用,那么原对象并不会改变。 Java 参数传递机制详解,揭开了 Java 中的参数传递机制的奥秘,详细分析了基本类型和对象作为参数传递的机制,并揭开了对象作为参数传递的迷惑。
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于Spring Boot框架的博客系统.zip
- (源码)基于Spring Boot框架的博客管理系统.zip
- (源码)基于ESP8266和Blynk的IR设备控制系统.zip
- (源码)基于Java和JSP的校园论坛系统.zip
- (源码)基于ROS Kinetic框架的AGV激光雷达导航与SLAM系统.zip
- (源码)基于PythonDjango框架的资产管理系统.zip
- (源码)基于计算机系统原理与Arduino技术的学习平台.zip
- (源码)基于SSM框架的大学消息通知系统服务端.zip
- (源码)基于Java Servlet的学生信息管理系统.zip
- (源码)基于Qt和AVR的FestosMechatronics系统终端.zip