一直以来,都被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讲义》
我只是大自然的搬运工。