网站首页 > 技术文章 正文
当一个对象被当作参数传递到一个方法后,在此方法内可以改变对象的属性,那么这里到底是“按值传递”还是“按引用传递”?
答:是按值传递。Java语言参数传递只有按值传递。当一个实例对象作为参数被传递到方法中时,参数的值就是该对象的引用的一个副本。指向同一个对象,对象的内容可以在被调用的方法内改变,但对象的引用(不是引用的副本)永远不会改变。
Java的参数传递,不管是基本数据类型还是引用类型的参数,都是按值传递,没有按引用传递!
Microsoft文档中对引用传递的定义:在方法的参数列表中使用ref关键字,它指示参数按引用传递,而非按值传递。按引用传递的效果是,对所调用的方法中的参数进行任何的修改都反映在此方法中。例如,如果调用方传递本地变量表达式或数组元素访问表达式,所调用方法会替换ref参数引用的对象,然后,当该方法返回时,调用方的本地变量或数组元素将开始引用新对象。
不要混淆通过引用传递与引用类型的概念。这两种概念是不同的。无论方法参数是值类型还是引用类型,均可由ref修改。当通过引用传递时,不会对值类型装箱。
1.基本数据类型参数
public class TransferTest { public static void main(String[] args) { int num = 1; System.out.println("changeNum()方法调用之前:num = " + num); changeNum(num); System.out.println("changeNum()方法调用之后:num = " + num); } public static void changeNum(int x) { x = 2; } }
运行结果:changeNum()方法调用之前:num = 1,changeNum()方法调用之前:num = 1
num作为参数传递给changeNum()方法时,是将内存空间中num所指向的那个存储单元中存放的值1传递给了changeNum()方法中的x变量,而这个x变量也在内存空间中分配了一个存储单元,这个时候,就把num的值1传递给了x这个存储单元中。此后在changeNum()方法中对x的一切操作都是针对x所指向到的这个存储单元,与num所指向的那个存储单元无关。
所以,在changeNum()方法调用之后,num所指向的存储单元的值还是没有发生变化,这就是所谓的**“按值传递”**!按值传递的精髓是:传递的是存储单元中的内容,而不是存储单元的引用!
2.引用数据类型参数
public class TransferTest2 { public static void main(String[] args) { Person p1 = new Person(); System.out.println(p1); change(p1); System.out.println(p1); } public static void change(Person p2) { p2 = new Person(); } } /** * Person类 */ class Person { }
运行结果:两次打印person的地址值是一样的,即调用完change() 方法之后,person变量并没有发生改变。
当执行到第3行代码时,程序在堆内存中开辟了一块内存空间,用来存储Person类的实例对象,同时在栈内存空间中开辟了一个存储单元,用来存储该实例对象的引用,person指向的存储单元。 按 当执行到第5行代码时,person作为参数传递给change()方法,需要注意的是:person将自己的存储单元的内容传递给了change()方法中的p变量。在change()方法中对p的一切操作都是针对p所指向的存储单元,与person所指向的那个存储单元没有关系了!
猜你喜欢
- 2024-10-22 经典问题探讨:Java中为什么只有值传递?
- 2024-10-22 深入理解Java中方法的参数传递机制
- 2024-10-22 什么是按值传递和按引用传递,Python属于哪一种?
- 2024-10-22 为什么Java只有值传递(java为什么要有数据类型)
- 2024-10-22 【Java】中只有值传递,没有引用传递!
- 2024-10-22 阿瑟Java (19):Java 的函数是值传递吗?
- 2024-10-22 Java-值传递(java值传递机制)
- 2024-10-22 你们不要再吵了!Java只有值传递..
- 2024-10-22 Java中的值传递有什么作用?(java 值传递还是引用传递)
- 2024-10-22 java的值传递和引用传递(java 传值传引用区别)
- 02-21走进git时代, 你该怎么玩?_gits
- 02-21GitHub是什么?它可不仅仅是云中的Git版本控制器
- 02-21Git常用操作总结_git基本用法
- 02-21为什么互联网巨头使用Git而放弃SVN?(含核心命令与原理)
- 02-21Git 高级用法,喜欢就拿去用_git基本用法
- 02-21Git常用命令和Git团队使用规范指南
- 02-21总结几个常用的Git命令的使用方法
- 02-21Git工作原理和常用指令_git原理详解
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)