Java 到底是值传递还是引用(址)传递?
写代码的时候遇到一个非常有意思的问题,至于过程在此就不多提了,略显尴尬,直入正题吧。
首先纠正常见的三个错误的理解
(1)Java是引用传递
(2)普通类型是值传递,引用类型是址传递
(3)普通类型是值传递,对象类型是址传递
小案例
int num = 10;
String str = "hello";
num = 20;
str = "java";
对于基本类型 num ,赋值运算符会直接改变变量的值,原来的值被覆盖掉。
对于引用类型 str,赋值运算符会改变引用中所保存的地址,原来的地址被覆盖掉。但是原来的对象不会被改变(重要)。
如上图所示,"hello" 字符串对象没有被改变。(没有被任何引用所指向的对象是垃圾,会被垃圾回收器回收)
划重点(关键在于理解这个)
StringBuilder sb = new StringBuilder("iphone");
void foo(StringBuilder builder) {
builder = new StringBuilder("ipad");
}
foo(sb); // sb 没有被改变,还是 "iphone"。
值传递和引用传递之前的区别的重点是什么?
最终结论
Java中方法参数传递方式是按值传递。
如果参数是基本类型,传递的是基本类型的字面量值的拷贝。
如果参数是引用类型,传递的是该参量所引用的对象在堆中地址值的拷贝。