码迷,mamicode.com
首页 > 编程语言 > 详细

java是值传递还是引用传递?

时间:2019-07-03 19:59:20      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:obj   ali   nta   基本类型   ipa   val   details   赋值运算   ons   

最近在项目中发现了类似如下的代码。


import com.alibaba.fastjson.JSONObject;

public class ValuePassParamTest {
    public static void main(String[] args) {
        JSONObject paramJson=new JSONObject();
        paramJson.put("date","1993_12_22");
        addJson(paramJson);
        System.out.println("paramJson:"+paramJson.toString());
    }

    public  static JSONObject addJson(JSONObject paramJson){
        String value=paramJson.getString("date");
        if(value!=null && value.contains("_")) {
            value=value.replace("_","");
        }
        paramJson.put("date",value);
        return paramJson;
    }
}

期望原来的paramJson不改变,只改变方法参数中的paramJson。
结果却发现对形参paramJson进行替换操作,实参也跟着改变了。
问题在于,JSONObject是引用类型,而不是基本类型,原来的paramJson指向了某块内存,而方法参数中的paramJson也指向了相同的内存

类似的例子如下:


第一个例子:基本类型
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://www.zhihu.com/question/31203609

https://blog.csdn.net/newmoons/article/details/51512481

java是值传递还是引用传递?

标签:obj   ali   nta   基本类型   ipa   val   details   赋值运算   ons   

原文地址:https://www.cnblogs.com/expiator/p/11128479.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!