我知道Java方法总是按值传递,但我发现这个代码,当你将JSONObject传递给这个方法并在方法中修改那个对象时,当方法返回时仍然被修改。
此方法用于替换json对象的某些值,并且工作正常。
有人可以解释当Java按值传递时会发生这种情况吗?
public static void setProperty(JSONObject js1, String keys, String valueNew) throws JSONException {
String[] keyMain = keys.split("\\.");
for (String keym : keyMain) {
Iterator iterator = js1.keys();
String key = null;
while (iterator.hasNext()) {
key = (String) iterator.next();
if ((js1.optJSONArray(key) == null) && (js1.optJSONObject(key) == null)) {
if ((key.equals(keym))) {
js1.put(key, valueNew);
return;
}
}
if (js1.optJSONObject(key) != null) {
if ((key.equals(keym))) {
js1 = js1.getJSONObject(key);
break;
}
}
}
}
return;
}
这就是你怎么称呼它
public static void main(String[] args) throws JSONException {
String text="{\"a\": { \"b\": { \"c\": \"x\", \"d\": \"y\" }}}";
JSONObject json = new JSONObject(text);
setProperty(json,"a.b.d","************");
System.out.println(json.toString(4));
}
答案 0 :(得分:1)
此方法不会更改引用js1
。对象本身是可变的,并且该方法调用js1
的方法来改变其内部状态。
答案 1 :(得分:0)
使用这种方法:
public static void setProperty(JSONObject js1, String value) {....}
你是通过
来称呼的JSONObject json = ...;
setProperty(json, "xxx");
需要注意的几点(为了避免混淆,我会在这里使用“指针”代替“参考”):
json
不是对象本身。 json
是指向JSONObject
当您调用setProperty(json, "xxx");
时,会将json
指针的副本传递给该方法。鉴于它是指针的副本,而不是对象本身,该指针指向同一个对象实例,因此如果您操纵该对象的内容,来电者当然会看到效果。
如果在您的setProperty(...)
中执行类似js1 = null;
的操作,您将会看到传值的效果。您将看到调用者传入的值未更改。