刚接触java的时候,就被告知,java中都是值传递,作为初学者,不求甚解。直到看到某个博主总结的一句话,才恍然大悟。
java中都是值传递,完整的意思是:java中按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递。
其实大家纠结java到底是值传递还是引用传递,主要是以下四种场景造成的:
(例子转载自链接:https://www.zhihu.com/question/31203609/answer/50992895,作者:Intopass)
第一个场景:参数是基本类型
void foo(int value) {
value = 100;
}
foo(num); // 基本类型都是值传递,num 没有被改变
第二个场景:参数是没有提供改变自身方法的引用类型
void foo(String text) {
text = "windows";
}
foo(str); // 引用的地址值传递,由于String类没有改变自身的方法,text = "windows"相当于text = new String("windows"),原str 字符串并没有被改变
第三个场景:参数是提供了改变自身方法的引用类型
StringBuilder sb = new StringBuilder("iphone");
void foo(StringBuilder builder) {
builder.append("11");
}
foo(sb); // 引用但地址值传递,sb 地址值对应的堆中的对象被改变了,变成了"iphone11"。
第四个场景:参数是提供了改变自身方法的引用类型,但是不使用改变自身的方法,而是使用赋值运算符。
StringBuilder sb = new StringBuilder("iphone");
void foo(StringBuilder builder) {
builder = new StringBuilder("ipad");
}
foo(sb); // 引用的地址值传递,foo方法里面新建了一个StringBuilder,sb 地址值对应的堆中的对象没有被改变,还是 "iphone"。
综上,得出结论:java中都是值传递。