1,按值调用:表示方法接收的是调用者提供的值;参数=变量值
按引用调用:表示方法接收的是调用者提供的变量地址:参数=指向变量值的引用
2,方法可以修改传递引用对应的变量值,但是不能修改传递值对应的变量值
3,Java总是采用按值调用,方法得到的是所有参数值的一个拷贝,也就是说不能修改这个拷贝的值
4,来个例子:
public static void triple(double x){
x=a*x;
}
//执行
double per=3;
triple(per);
执行了triple()方法,per的值还是3,看一下流程:
x被初始化为per值的一个拷贝(3)
x被乘以3后等于9,但是呢,per还是3
方法结束后,参数x不再使用
方法参数有两种类型:
基本数据类型(数字,布尔)
对象引用
可以看到,一个方法不可能修改一个基本数据类型的参数,但是对象作为引用就不同了:
//class=Boss
public static void tripleSalary(Emplyee x){
x.money=x.money*2;
}
Boss b=new Boss();
Emplyee e=new Emplyee ();
b.tripleSalary(e); //老板给指定员工涨双倍工资
执行过程为:
x被初始化为对e值的拷贝,这里是一个对象的引用(简单说就是方法得到的就是对象引用的拷贝,对象引用及其他拷贝同时引用同一个对象)
tripleSalary()方法应用于这个对象引用,此时,x和e同时引用的这个对象的工资提高了两倍
方法结束后,参数变量x不再使用,但是e继续引用着这个涨了双倍工资的雇员对象。
切记:java看上去对对象的引用是引用调用,但是这是错的:
//假设java对对象是引用调用,class=Boss
public static void swap(Emplyee a,Emplyee b){
Emplyee temp =a;
a=b;
b=temp;
}
Emplyee N=new Emplyee (“Newton”);
Emplyee M=new Emplyee (“Martin”);
Boss.swap(N,M);
如果java的引用是对象引用,那么这个方法就能实现交换:N->Martin;M->Newton,但是在方法结束时,参数变量a,b被舍弃,交换失败:可以如下理解:
方法定义的形参a,b就像第二个图的x
调用方法时:
第二个图的x拷贝了e的引用
这个图的a,b,拷贝了N,M的引用
方法调用结束,x,a,b都失去作用,而第3点提到:Java总是采用按值调用,方法得到的是所有参数值的一个拷贝,也就是说不能修改这个拷贝的值,因此,N,M的值(对象引用的拷贝)也就不会发生变换;
特别提一下不可变字符串String和可变字符串StringBuilder:
public void sum(StringBuilder name){
name.append("a");
}
public void sum1(String name){
name.concat("a");
}
这两个方法分别调用,String对象不会加"a",而StringBuilder会加"a"。