在其方法中修改类的实例也会更改调用者变量

时间:2015-05-12 16:19:06

标签: java variables instance

我不确定我是否正确,但我在我的课程中有一个方法,我创建了一个类的实例来保存数据,因为有些转换。但是,当我从某个地方打电话时:

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)中它改变了变量(2)的m(3)和myClass(1),为什么(1)? 我不知道到底我到底是什么,你能给我一个提示吗? 感谢。

2 个答案:

答案 0 :(得分:0)

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

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

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

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

答案 1 :(得分:0)

谢谢你们@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