Java方法中参数的调用,到底是值传递还是引用传递
- 我在Java核心艺术一书中阅读到这个点,解开了困扰我多年的疑惑。
首先说下方法参数传递都有哪些- call by value 按值传递
- call by reference按引用调用
- call by name 按名称调用
- ···
- 以上是程序语言方法调用的方式,在这里我可以很明确的告诉大家:
Java程序设计语言总是按值调用 - 解析
- 方法得到的是所有参数值的一个拷贝,特别是,方法不能修改传递给它的任何参数变量内容。
-
案例
- 基本数据类型参数
double percent = 10;
tripleValue(percent );
public static void tripleValue(double x){
x = x *3;
}
执行这个程序你会发现,无论怎么样percent的值都不会改变,然后我们拆解一下执行过程:
1)x被初始化,值为percent的值拷贝
2 )x倍乘以3后,值为30,但是percent的值不变
3)这个方法结束后,参数变量x不在被使用。- 引用数据类型
public statuc void tripleSalary(Employee x){
x.setSalary(200);
}
Employee harry = new Employee();
tripleSalary(harry);
具体执行过程:
1) x被初始化为harry值的拷贝,这里指的是一个对象的引用的拷贝
2) setSalary方法引用于这个对象的引用,x和harry指向同一块实例区域的值被改变
3)方法结束后,参数变量x不在使用,harry继续引用并指向被修改的实例区域 - 基本数据类型参数
到此,就有人疑问了,不是说好的,java总是值传递吗,刚才怎么说是拷贝了引用,是不是前后矛盾,我只能说是值传递,引用也是拷贝的引用值,在看下一个例子,你的疑问就没了。
-
例子3,引用对象,引用修改
public static void swap(Employee x,Employee y){
Employee temp = x;
x=y;
y=temp;
}
Employee a=new Employee("alice",...);
Employee b=new Employee("bob",...);
swap(a,b);如果按照,之前的猜想,引用传递,引用赋值,那么这里就可以对引用进行修改,在赋值。事实上并非如此,看图,无需多做解释。。。