java中关于“按值传递”的相关问题
2017-01-17 01:50
633 查看
关于“按值传递”相关问题
在java的世界中,只有“按值传递”,不存在“按引用传递”。(这不同于c/c++,c/c++存在按值传递和按引用传递两种方式)按值传递
按值传递意味着当将一个参数传递给一个方法时,方法接收的原始值的一个副本。按引用传递
按引用传递意味着当将一个参数传递给一个方法时,方法接收到原始值的内存地址,而不是值的副本。个人看法
其实,“内存地址”也是一个“值”,而这个“值”被叫作“引用”。按值传递还是按引用传递的区别在于“是否在传递的时候进行对象的内存拷贝”,java中的基本数据类型在jvm中存储的区域不同于普通对象,所以传递前会拷贝,传递的是拷贝后的值;而对象在传递时不拷贝,直接传“地址”(引用),指向同一片对象堆内存区域。
所以,就存在两种情况。
1、 两值交换,初始值不变(基本数据类型)
2、 两对象值交换,值改变(对象)
public static void swap ( int a, int b ) { int temp; temp = a; a = b; b = temp; }
因为两个参数都是基本数据类型,所以传递前会进行拷贝,所以交换的是“副本”,而非原始数据,不会对原始数据造成影响。
public static void swap(Swap swap){ int temp; temp = swap.num1; swap.num1 = swap.num2; swap.num2 = temp; }
参数为对象,对象传递时不会进行拷贝,传递的是地址的“引用值”(指向同一片地址区域),当两个成员变量所在指向的地址发生交换时,成员变量对应的值也会发生改变,所以交换后会对对象中的成员变量的值造成影响。
//测试代码// public static void main ( String[] args ) { int a = 1, b = 2; System.out.println ( "Before Swap -- a = " + a + " b = " + b ); swap ( a, b ); System.out.println ( "After Swap -- a = " + a + " b = " + b ); int num1 = 1,num2 = 2; Swap s = new Swap ( num1,num2 ); System.out.println ( "Before Swap -- num1 = " + s.num1 + " num2 = " + s.num2); swap ( s ); System.out.println ( "After Swap -- num1 = " + s.num1 + " num2 = " + s.num2 ); }
输出结果:
Before Swap -- a = 1 b = 2 After Swap -- a = 1 b = 2 Before Swap -- num1 = 1 num2 = 2 After Swap -- num1 = 2 num2 = 1
输出结果与分析的结果一样
遗留问题
如果将基本数据类型改成基本数据类型对应的封装对象,为什么不能得到与情况二一样的结果?相关文章推荐
- 关于工作中的相关问题的看法和建议 (一)JAVA小组的调整问题
- 关于Boolean类型在flex与java中间传递的问题
- 关于java语言中方法参数传递问题
- 关于Java对象作为参数传递是传值还是传引用的问题
- 关于java中的值传递问题
- 关于java值传递的问题
- 关于java中是引用传递还是值传递的问题!!!经常在笔试中遇到,今天终于弄明白了!
- 尽管关于Java中文问题的讨论已经相当多了,但由于Java的相关技术标准繁多,面向Java的Web服务器、应用服务器以及JDBC数据库驱动等都没有官方的标准,所以Java应用在处理中文时所存在的问
- 关于Java中String类型的参数传递问题
- 关于java值传递的问题,图解直观,若您有有高见请斧正!
- Java中JDK中path和classpath的设置相关问题(关于import自定义包和jar的问题)
- java 关于传递参数的问题
- 黑马程序员——Java中的一个关于参数传递的小问题
- Java中关于构造函数继承的相关问题
- 关于使用mxGetPr从MATLAB向C中传递数组的相关问题
- java中关于参数传递问题的解释(传…
- 关于java.lang.NoClassDefFoundError相关问题
- 关于java的JDK环境变量设置方法及相关问题解决方案
- 关于java内存使用的相关问题(寄存器、栈、堆、静态存储、常理存储、非RAM存储)
- 关于java中有符号数转换成无符号数的相关问题