用Java传递的对象引用。通过参考通过不同的工作方式?

时间:2013-05-19 08:50:31

标签: java oop computer-science

在Java中玩游戏。如果对象被修改并且给定值和不同的值(如果它被分配了新对象),我看到了不同的行为。这是我用来显示结果的代码。

public class Test {

    int i;

    public Test(int j) {
        this.i = j;
    }

    public static void main(String[] args) {

        Test A = new Test(5);
        Test N = new Test(5);
        add(A);
        makeNew(N);
        System.out.println("Value of A.i= "+A.i);
        System.out.println("Value of N.i= "+N.i);

    }

    private static void add(Test t) {
        t.i+= 3;
        System.out.println("Inside method add() t.i= "+t.i);

    }

    private static void makeNew(Test t) {

        t = new Test(8);
        System.out.println("Inside method makeNew() t.i= "+t.i);

    }

}

以下是上述代码的输出。

Inside method add() t.i= 8
Inside method makeNew() t.i= 8
Value of A.i= 8
Value of N.i= 5  

在上面的例子中,对象A被修改为值8.对象B本身被赋予一个新对象。但是回调它们只有对象A显示新值。对象B显示旧值本身。它们不应该显示相同的值,因为这两种情况都是通过推荐传递的吗?我期待A.i和N.i的价值相同。

6 个答案:

答案 0 :(得分:3)

以下是发生的事情:

Test A = new Test(5);
Test N = new Test(5);

enter image description here

add(A);  // method is add(Test t)

enter image description here

makeNew(N)// method is makeNew(Test t)

enter image description here

t = new Test(8);

enter image description here

System.out.println("Value of A.i= "+A.i);
System.out.println("Value of N.i= "+N.i);

enter image description here

答案 1 :(得分:1)

makeNew中,您将使用new test(8)对象覆盖对现有对象(作为参数传入的对象)的引用。但是,这是makeNew内的本地内容,因此位于main(...)内的原始对象不会受到影响。

答案 2 :(得分:1)

每当你使一个变量等于一个对象,然后在其他地方使用new就像通过另一个引用一样,你设置为对象引用的变量不再指向新对象,而是仍然保留旧对象。因此,如果不同范围的多个变量都有一个引用,那么它们都需要一种方法让它们等于新对象或者它们不再同步。

答案 3 :(得分:1)

我认为这会让你怀疑:

Before assigning t inside makeNew to another object

After you assign t to a new object

您看到N仍然指向第一个对象

答案 4 :(得分:0)

Java是按值传递的。您将对象的引用作为值传递,因此您可以修改该对象。但是,您无法修改对象的实际引用并使其指向其他内容。

您的问题已在此处得到解答:Is Java "pass-by-reference" or "pass-by-value"?

答案 5 :(得分:-1)

在Java中,您不传递实际对象,也不传递对象的引用。 您将引用的副本传递给该对象。现在当您说

makeNew(N);

N是new Test(5)的引用,但未传递,但传递了它的引用的副本。在makeNew()函数中,此副本指向一些新对象并适当地打印该值,但N仍将指向原始对象。