java参数的值传递和引用传递

今天抽了点时间继续啃java核心基础,即使出来做web挺长时间了,始终觉得基础极其重要。

遇到了java参数的传递类型,豁然开朗之时不忘写下记录。

java中采用的总是值传递,包括对对象参数的传递,采用的也是值传递!

首先,最普通的数据类型  例如 :

int a = 10 ; 

int b  = 20 ; 

public void add(int a , int b){

  a = a + 10 ; 

     b = b+ 10 ;

结果是 :   a 依旧为10   b 依旧为20   

其次:

public Employee {

  private Double salary;  

    ...

}

public test {

  public static void main(Stirng[] args){

    Employee e = new Employee() ;

    changeVal(e);

    //之后输入 e的薪水     会发现  e的薪水的确加了  100.

  }

  public static void changeVal(Employee e){

    e.setSalary(e.getSalary() + 100 );

  }

}

结果:e的薪水状态值发生了改变,在方法调用是,changeVal(e)  , 这个e拿到了相同的引用地址,然后在方法内部时,对薪水状态发生了改变,所以虽然方法

走完后,e被废弃了,但是同样引用地址对应的变量值确确实实也发生了变化,所以状态被改变了。

最后:

java 对对象也是用的值传递,(即使给的是引用地址。)

Employee x = new Employee("X");
Employee y = new Employee("Y");
Employee.swap(x, y);
System.out.println(x);
System.out.println(y);

public static void swap(Employee x , Employee y){
Employee temp = x;     //x 给了 temp temp持有x的引用
x = y;       //x持有y的引用
y = temp;       //y持有temp的引用 》》 结果 : y持有x的引用 最终 打印出来的却是大跌眼镜 X还是X Y还是Y

}

原因:  为什么最后x在tostring后发现还是原来的x    y也还是原来的y?
其实在方法调用的时候 ,  swap(x,y)   这里的x 和y是原有的一份拷贝,    所以参数x和参数y在内部如何改变指向,都只是改变了参数x和参数y的指向,而不会改变真正x和y的指向。

总结: 

 1.值变量在函数结束后还是不会被改变。

 2 函数可以改变对象的状态。

 3 函数不能改变对象的引用。