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中方法参数传递方式是按值传递。
如果参数是基本类型,传递的是基本类型的字面量值的拷贝。
如果参数是引用类型,传递的是该参量所引用的对象在堆中地址值的拷贝。

posted @ 2021-04-23 11:49  哦克Oak  阅读(558)  评论(0编辑  收藏  举报