Java基础:值传递和引用传递

概念

值传递:指的是在方法调用时,传递的是参数是按值的拷贝传递。
    特点:传递的是值的拷贝,也就是传递后就互不相关了。


引用传递:指的是在方法调用时,传递的参数是按引用进行传递,其实传递的是引用的地址,也就是变量所对应的内存空间的地址。
     特点:传递的是值的引用,也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间

 

这不就是看传的参数是基本类型的还是引用类型的吗?(其中比较特殊一点的是String类型和基本类型的包装类类型,它们也是按值传递的,但它是属于引用类型)

 

值传递:基本类型

传递后=复制一份

改变不会影响原始数据

 

值传递:String类,包装类

传递后=复制一份

改变不会影响原始数据

string类是因为+=,=,这些操作都是复制了一份新的到内存空间

包装类:

传递后=复制一份

改变不会影响原始数据

 

引用传递:引用类型

传递指针

改变会影响原始数据

 

作者:Intopass
链接:https://www.zhihu.com/question/31203609/answer/50992895
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

第一个例子:基本类型
void foo(int value) {
    value = 100;
}
foo(num); // num 没有被改变

第二个例子:没有提供改变自身方法的引用类型
void foo(String text) {
    text = "windows";
}
foo(str); // str 也没有被改变

第三个例子:提供了改变自身方法的引用类型
StringBuilder sb = new StringBuilder("iphone");
void foo(StringBuilder builder) {
    builder.append("4");
}
foo(sb); // sb 被改变了,变成了"iphone4"。

第四个例子:提供了改变自身方法的引用类型,但是不使用,而是使用赋值运算符。
StringBuilder sb = new StringBuilder("iphone");
void foo(StringBuilder builder) {
    builder = new StringBuilder("ipad");
}
foo(sb); // sb 没有被改变,还是 "iphone"。

 

 

数组的情况:

数组是引用类型

所以是引用传递

 

 

参考:

https://zhuanlan.zhihu.com/p/61517562

https://www.zhihu.com/question/31203609/answer/50992895

 

posted @ 2021-03-08 15:51  将来的事  阅读(200)  评论(0编辑  收藏  举报