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