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

Posted expiator

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java是值传递还是引用传递?相关的知识,希望对你有一定的参考价值。

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


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是值传递还是引用传递?的主要内容,如果未能解决你的问题,请参考以下文章

Java调用函数传递参数到底是值传递还是引用传递

Java中的参数传递,到底是值传递还是引用传递?

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

Java 到底是值传递还是引用传递?

Java 到底是值传递还是引用传递?

Java是值传递还是引用传递-总结