在其方法中修改类实例也更改呼叫者变量



我不确定我是否正确,但是我的课程中有一个方法,在该方法中,我在其中创建了一个课程实例以存放数据,以存放数据。但是,当我从某个地方打电话:

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)?我不知道我到底是什么,你能给我一个提示吗?谢谢。

您指的两个变量都是相同的。因为每次调用doStuff()方法时,都会创建MyClass的新实例并将其返回。正是此实例在(1)和(3)中更改。

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

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

现在,当您调用此方法时,只有传递给方法的实例才会更改。希望它有帮助。

谢谢你们@Ryan J,@hitz。我总共忘记了它是一个传递的对象,因此引用其值是相同的。

我从:

更改(3)
    m.add(i);

to:

    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

最新更新