java中关于“按值传递”的相关问题
来源:互联网 发布:puppy linux xiazai 编辑:程序博客网 时间:2024/06/05 02:11
关于“按值传递”相关问题
在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 = 2After Swap -- a = 1 b = 2Before Swap -- num1 = 1 num2 = 2After Swap -- num1 = 2 num2 = 1
输出结果与分析的结果一样
遗留问题
如果将基本数据类型改成基本数据类型对应的封装对象,为什么不能得到与情况二一样的结果?
0 0
- java中关于“按值传递”的相关问题
- 关于JAVA中参数传递问题的总结(按值传递和引用传递)
- 关于java中参数传递的问题
- 关于Java中作用域和值传递的问题
- 关于java中byte的相关问题
- JAVA中参数传递问题的总结(按值传递和引用传递)
- 关于JAVA中参数传递问题的总结
- java中关于参数传递问题的解释(传…
- 关于java中方法的参数传递问题
- Java中关于参数传递的问题,可以看看!!
- 关于使用mxGetPr从MATLAB向C中传递数组的相关问题
- Java中关于构造函数继承的相关问题
- 关于ios5的值传递(IB相关)
- 关于Java按值传递的学习
- 关于函数中参数传递的问题
- 关于Untiy中数值传递的问题
- 关于JAVA参数传递的问题!~
- java 关于传递参数的问题
- wampserver无法启动之mysql疑难杂症
- Atitti opencv2.4 实现的人脸检测 attilax总结
- JavaCV1.2环境搭建
- pms包管理服务分析-初步理解
- iOS 10 的适配问题
- java中关于“按值传递”的相关问题
- Shader自学笔记 3.3.2 采样遮罩纹理 使高光部分更加柔和
- Atitit opencv 模板匹配
- Atitit 函数调用的原理与本质attilax总结 stdcall cdecl区别
- 【九度】题目1080:大数进制转换
- Storm 流程分析
- Atitti python2.7安装 numpy attilax总结
- 1008. Airline Routes (35)解题报告
- 虚拟化的首选:VMware vSphere