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不在被使用。

java中参数调用方法有哪些方法 java调用方法传入参数_Java

  • 引用数据类型
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中参数调用方法有哪些方法 java调用方法传入参数_引用传递_02

到此,就有人疑问了,不是说好的,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);

如果按照,之前的猜想,引用传递,引用赋值,那么这里就可以对引用进行修改,在赋值。事实上并非如此,看图,无需多做解释。。。

java中参数调用方法有哪些方法 java调用方法传入参数_java中参数调用方法有哪些方法_03