java中的方法参数传递机制---值传递
来源:互联网 发布:linux查看指定进程 编辑:程序博客网 时间:2024/06/05 14:34
一直以来,都被java中的参数传递方式都是 — 值传递。被这个说法搞的很糊涂。有时候传过去的值会发生变化,有的又不会,相信初学者会遇到这样的坑。今天就来说为啥会这样?
先来一段代码?
/** * 值传递的演示 * @author hjm * */public class TestDemo {public static void swap(int a,int b) { //用一个临时变量来存a的值 int temp = a; a = b; b = temp; System.out.println("来自swap方法内的"+a+",和"+b);}public static void main(String[] args) { int a = 6; int b = 9; swap(6,9); System.out.println("来自swap方法外的"+a+",和"+b); }}
看下这两个输出是否一致?
第一个输出是 来自swap方法内的9,和6
第二个输出是 来自swap方法外的6,和9
为什么会出现不一样的结果呢?真相是main方法中调用的swap(6,9);将6,9作为实参传到形参中去,问题就出在这里。传过去的值其实是这俩个值的拷贝。就好比《西游记中》的孙悟空在要干架的时候,都是变出几个假孙悟空跟别人打。 这个也是道理。我传过去的值都是我的替身,你在swap中进行的一番折腾,其实都是改变的我的替身值,我真身没有丝毫变化。于是就出现了两个输出内容不一样的值。
这么写的话不好理解的话,那就看图帮助理解
这图看了之后应该不会有疑惑了?那么这个是基本类型的传值,那么传过去的是个引用类型的呢?那么值会发生变化 吗?
public class TestDemo02 {public static void swap(DataSwap ds) { int temp = ds.a; ds.a = ds.b; ds.b = temp; System.out.println("来自swap方法内的"+ds.a+",和"+ds.b);}public static void main(String[] args) { DataSwap ds = new DataSwap(); ds.a = 6; ds.b = 9; swap(ds); System.out.println("来自swap方法外的"+ds.a+",和"+ds.b);}} class DataSwap{//成员变量不用赋初值,但最好还是赋比较好int a;int b;
这个会出现什么情况呢?
来自swap方法内的9,和6
来自swap方法外的9,和6
为什么值会发生变化呢?难道不是用到了值传递的方式吗?
其实,敢肯定的是 他们用到了都是值传递的方式。 记得引用类型的引用变量存的是什么吗?引用变量存的是对象的地址。 所以将引用变量作为参数传过去,其实就是将对象的地址传过去。 这个好比 我将家里的地址告诉你,你去找这个地址,不就找到了我家(这个对象 )。然后你在我家(对象中)的各种操作不就会有影响产生。
看图
看到这个图,应该就会恍然大悟了吧。
真正明白了,java中的参数传值传值都是采用值传递方式。以后看见了着种情况不会再迷惑了吧。
本篇思路来源于《疯狂java讲义》
我只是大自然的搬运工。
- java中的方法参数传递机制---值传递
- Java方法参数的传递机制,值传递?引用传递?
- java中的方法参数的传递机制
- Java中的参数传递机制
- java方法中参数的传递机制(值传递)
- 三张图讲清楚Java中的方法的参数传递机制
- [置顶] 三张图讲清楚Java中的方法的参数传递机制
- 方法的参数传递机制——值传递机制
- java中方法的参数传递机制
- java中方法参数的传递机制
- Java方法的参数传递机制
- Java中方法的参数传递机制
- java中方法的参数传递机制
- java中方法的参数传递机制
- java中方法的参数传递机制
- java中方法的参数传递机制
- java方法的参数传递机制
- Java中方法的参数传递机制
- Hibernate检索策略
- html之表单总结
- Hadoop(六)--->核心设计
- spring cloud config
- 利用Python进行数据分析(1)—— Numpy Basic(1)
- java中的方法参数传递机制---值传递
- php文件锁的使用
- HDU 1325 Is It A Tree? ( 有向图判断环
- HDU1005(2)
- Hibernate批量抓取
- ITIL 2011 服务管理与认证读书笔记——第五章 服务转换
- Hadoop(七)---MapReduce计算模型
- (7)2017.8.7-面向对象(2)
- curl