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的操作,实际上就是对对象地址所对应的对象操作,(有点绕)所以原来就变了。
}
仅仅是个人的理解,欢迎拍砖。