Java对象混乱

时间:2015-04-18 01:35:08

标签: java

我正在进行一项产生意外输出的课堂练习。希望有人能解释我所缺少的东西。

我对Class1的最后4行很好,然后我有点困惑。

public class Class1 {
public static void main(String[] args){
    Class2 val1 = new Class2 ();
    Class2 val2 = new Class2 ();
    val1.set (3);
    val2.set (4);

    for (int num = 11; num>=1; num -=4){
        val1.change (num);
        val2.change(val1.get());

        System.out.println("Val1 " + val1);
        System.out.println("Val2 " + val2);
    }
    val1 = val2;

    val1.change(3);
    val2.change(val1.get());
    System.out.println(val1.get());
    System.out.println(val2.get());


    }
} // end Class1

这是Class2

public class Class2 {
private int num1;
private int num2;

public void set (int inValue){
    num1 = inValue;
    num2 = inValue + 2;
}

public void change (int inValue){
    num1++;
    num2 += inValue;
}

public int get (){
    return num1 + num2;
}

public String toString (){
    return num1 + " = " + num2;
}
}

我期望从代码中得到的输出如下:

Val1 4 = 16

Val2 5 = 26

Val1 5 = 23

Val2 6 = 54

Val1 6 = 26

Val2 7 = 86

97

191

然而,运行代码时产生的输出是:

Val1 4 = 16

Val2 5 = 26

Val1 5 = 23

Val2 6 = 54

Val1 6 = 26

Val2 7 = 86

195

195

我不明白195的来源。

在最后4行之前,我们将val1设置为等于val2,所以现在两者都是(num1 = 7,num2 = 86) 在Class1的最后4行:

val1.change(3);    // should change val1 to (num1 = 8, num2 = 89)
val2.change(val1.get());  // val.get() should return (8+89)=97, 

将其作为参数传递给val2.change()应该导致val2(num1 = 8,num2 = 183)

System.out.println(val1.get()); // should produce (8+89)=97
System.out.println(val2.get()); // should produce (8+183)=191

然而,这些数字都不是输出。我错过了什么?

2 个答案:

答案 0 :(得分:2)

由于这是一项家庭作业,我第二次大卫的建议是学习如何使用调试器。但是,我会给你一个提示 - 当你这样做时你的问题就出现了:val1 = val2; - 你的变量现在都指向同一个对象。

这样想:

Class2 val1 = new Class2 (); //now val1 points to instance #1 of Class2
Class2 val2 = new Class2 (); //now val2 points to instance #2 of Class2
val1 = val2; //now val1 also points to instance #2 of Class2

答案 1 :(得分:0)

看起来在主要方法结束时你将val2分配给val1,你的意思是这样做吗?从那时起,val2和val1将是相同的。