该参数如何在方法内部发生变化

时间:2016-02-12 07:11:12

标签: java methods

我知道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));

    }

2 个答案:

答案 0 :(得分:1)

此方法不会更改引用js1。对象本身是可变的,并且该方法调用js1的方法来改变其内部状态。

答案 1 :(得分:0)

使用这种方法:

public static void setProperty(JSONObject js1, String value) {....}

你是通过

来称呼的
JSONObject json = ...;
setProperty(json, "xxx");

需要注意的几点(为了避免混淆,我会在这里使用“指针”代替“参考”):

  1. json不是对象本身。 json是指向JSONObject

  2. 的指针
  3. 当您调用setProperty(json, "xxx");时,会将json指针的副本传递给该方法。鉴于它是指针的副本,而不是对象本身,该指针指向同一个对象实例,因此如果您操纵该对象的内容,来电者当然会看到效果。

  4. 如果在您的setProperty(...)中执行类似js1 = null;的操作,您将会看到传值的效果。您将看到调用者传入的值未更改。