标签: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
标签:obj ali nta 基本类型 ipa val details 赋值运算 ons
原文地址:https://www.cnblogs.com/expiator/p/11128479.html