【问题标题】:Modifying instance of class in its method changes caller variables too在其方法中修改类的实例也会改变调用者变量
【发布时间】:2015-07-23 15:41:59
【问题描述】:

我不确定我是否做对了,但我的类中有一个方法,在该方法中我创建了一个类的实例来保存数据,因为某些切换。但是,当我从某个地方调用它时:

public static void otherClassMethod(MyClass myClass) {
    MyClass m = myClass.doStuff(); // 1
}

public class MyClass {

    private Item myItem;
    private int mCount;


    public void add(Item item) {
        if (mCount == 0) {
            myItem = item;
            myItem.setNext(null); // 2
            mCount++;
        } else {
            ....
        }
    }

    public MyClass doStuff() {
        if (mCount == 0) return null;
        MyClass m = new MyClass();
        Item i = myItem;
        do {
            m.add(i); // 3
            i = i.getNext(); // 4
        } while (i != null);
        return m;
    }
}

在 (4) 中,它更改了 (3) 中的 m 和 (1) 中的 myClass 的变量 (2),为什么还要更改 (1)? 我不知道我到底在这里没有得到什么,你能给我一个提示吗? 谢谢。

【问题讨论】:

  • 您正在修改每个方法中对一个对象的相同引用,它指向内存中的相同位置。当您将其分配给另一个变量时,您不会得到一个新对象。

标签: java variables instance


【解决方案1】:

您所指的两个变量都是相同的。因为每次调用doStuff() 方法时,都会创建MyClass 的新实例并返回它。 正是这个实例在 (1) 和 (3) 处发生了变化。

如果您只想修改特定实例,请尝试将其传递给doStuff() 方法,而不是创建新实例。像这样的:

    public void doStuff(MyClass s){
        //..
    }

现在当你调用这个方法时,只有你传递给方法的实例会改变。 希望对您有所帮助。

【讨论】:

    【解决方案2】:

    谢谢你们@Ryan J,@hitz。我完全忘记了它是一个正在传递的对象,所以对它的值的引用是相同的。

    我将 (3) 更改为:

        m.add(i);
    

    到:

        m.add(new Item(i.getA(), ..));
    

    如果有人在寻找答案:

        Object a = new Object();
        Object b = a; // they are refering to the same reference, so they will change as one
    
        Object c = new Object(a.getParam()); // set through a constructor parameter
        Object d = new Object();
        d.setParam(a.getParam()); // set through setter and getter
    

    【讨论】:

      猜你喜欢
      • 2017-03-27
      • 2017-07-11
      • 2014-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-19
      • 2013-01-18
      相关资源
      最近更新 更多