java只有值传递
分为基础类型与object
基础类型直接传递值,而object中传递引用(地址)
比如
void main(){
int i = 0;
function(i);//改变i的值: i = 1;
print(i);
//结果为0
}
其中i被传递,拷贝了一份,修改的是拷贝以后的值
void main(){
String string = "function";
function(string);//改变string的值:string = "new";
print(string);
//结果为function
}
其中string被传递引用,但是在方法中并没有改变引用的值,而是使拷贝的临时变量指向了内存内容为“new”的字符串,原先的string还是指向了“function”
void main(){
StringBuilder build = new StringBuilder("function");
function(build);//改变build的值:build.append(" new");
print(build);
//结果为function new
}
其中build被传递引用,在方法中使用了拷贝后的地址后修改了build的内容。
以上string比较特殊的是,在编译过程中,如果使用了“=”为其复制,则是指向新的内存地址,并不会影响拷贝之前的对象。因为在jvm中,为每一个字符对象都创建了一个物理空间,随后把string类型的对象指向这个物理空间的地址。其他的对象传递则是传递地址,根据地址去执行修改object的操作。