java是值传递还是引用传递?
2020-12-13 05:01
                         标签:obj   ali   nta   基本类型   ipa   val   details   赋值运算   ons    最近在项目中发现了类似如下的代码。 期望原来的paramJson不改变,只改变方法参数中的paramJson。 类似的例子如下: 参考资料: https://blog.csdn.net/newmoons/article/details/51512481 java是值传递还是引用传递? 标签:obj   ali   nta   基本类型   ipa   val   details   赋值运算   ons    原文地址:https://www.cnblogs.com/expiator/p/11128479.html
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进行替换操作,实参也跟着改变了。
问题在于,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