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"。