java 值传递和引用传递

最近心血来潮看了看Java中的值传递和引用传递。

根绝网上搜罗的资料都看晕了,比如说常量池里放的是对象还是对象的引用,很乱。

不管怎么样,先按照如下记录一下:

对于原始类型的变量(包括它们的封装类)和字符串类型String,就是值传递。

结果就是,原始值不变。

String a = "test";或者String a = new String("test");

tests(a);

System.out.println(a);//依旧是test,也可以认为String本身就是final类型的,不可更改

分析为:可以认作把值("test")放在了常量池中,作为参数传递的过程中仅仅是串值。

public void tests(String a){

  a = "testa";//可以认作是又新建了一个变量指向常量池里的testa,此时的a与传递的参数a不相同

  System.out.println(a);

}

但是涉及到具体的对象的时候,比方说StringBuffer sb = new StringBuffer("test");

//对象test并不是在常量池里,而是在内存的堆(deap)中。

把sb作为参数传递到方法里时:

public void tests(StringBuffer sb){

  sb = sb.append("ddddd");

  System.out.println(sb);//打印出testddddd,而原始的sb也会变成testddddd。

  //原因就是他们传递的不是值,而是地址,对参数sb的操作,实际上就是对对象地址所对应的对象操作,(有点绕)所以原来就变了。

}

仅仅是个人的理解,欢迎拍砖。

原文地址:https://www.cnblogs.com/ihanliu/p/4371510.html