1

在玩 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 显示旧值本身。它们不应该显示相同的值,因为两种情况都是通过引用传递的吗?我期待 Ai 和 Ni 的值相同

4

6 回答 6

3

这是发生的事情:

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

在此处输入图像描述

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

在此处输入图像描述

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

在此处输入图像描述

t = new Test(8);

在此处输入图像描述

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

在此处输入图像描述

于 2013-05-19T09:13:58.433 回答
1

在您的makeNew中,您正在用您的对象覆盖对现有对象(作为参数传入)的引用new test(8)。但是,这是 local inside makeNew,所以坐在里面的原始对象main(...)不受影响。

于 2013-05-19T08:54:14.463 回答
1

每当您使一个变量等于一个对象并稍后在该对象的其他地方(例如通过另一个引用)使用该对象时,您设置为对象引用的变量不再指向新对象,但仍保留旧对象。因此,如果不同范围内的多个变量持有一个引用,它们都需要一种方法使它们等于新对象的任何内容,或者它们不再同步。

于 2013-05-19T08:58:04.083 回答
1

我想这会让你怀疑清楚:

在将 makeNew 中的 t 分配给另一个对象之前

将 t 分配给新对象后

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

于 2013-05-19T09:00:58.407 回答
0

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

您的问题已在此处得到解答:Java 是“按引用传递”还是“按值传递”?

于 2013-05-19T08:54:12.443 回答
-1

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

makeNew(N);

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

于 2013-05-19T09:02:18.717 回答