Java中的对象引用传递。通过引用在不同的情况下工作是否不同?

Java中的对象引用传递。通过引用在不同的情况下工作是否不同?,java,oop,computer-science,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 =

在玩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被赋予一个新的对象本身。但是,仅将它们调用回一个对象就显示了新的值。对象B显示旧值本身。它们不应该显示相同的值,因为这两种情况都是通过引用传递的吗?我希望A.I和N.I的值相同。

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


您的问题已经在这里得到了回答:

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


您的问题已经在这里得到了回答:

在makeNew中,您正在覆盖对现有对象的引用,该对象已作为新test8对象的参数传入。但是,这是makeNew中的局部对象,因此位于主对象中的原始对象。。。不受影响。

在makeNew中,您正在覆盖对现有对象的引用,该对象已作为新test8对象的参数传入。但是,这是makeNew中的局部对象,因此位于主对象中的原始对象。。。不受影响。

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

每当您将一个变量等于一个对象,然后通过另一个引用在该对象上使用new时,设置为对象引用的变量不再指向新对象,而是保留旧对象。因此,如果多个变量在不同的范围内持有一个引用,它们都需要一种方法使它们等于新对象是什么,或者它们不再同步。

我想这会让你很清楚:


你看N仍然指向第一个物体

我想这会让你清楚地怀疑:


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

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

makeNew(N);

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

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

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

以下是发生的情况:

Test A = new Test(5);
Test N = new Test(5);
下面是发生的情况:

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

Java不是按值传递的。仅原语通过值传递。OP的对象不改变状态的原因是因为参数是对该对象的另一个引用,而makeNew只是将t引用设置为另一个新对象,这不会影响NNo,您的否决票是不正确的。看看我链接的第一个答案,Java总是按值传递。这是您在此链接中引用的内部语义。进一步阅读后,您所演示的是,是的,内存位置地址通过值传递。。。当然是了!显然,任何其他给定语言中的指针也是如此。当我们谈到引用时,我们只是简单地说,对象是通过引用传递的,而在潜台词中,不必费心去提及:借助于一个实际上是通过值传递的内存地址。这是学究式的,它不能帮助OP真正理解他的问题的答案。这种内部语义帮助我理解了将对象传递给函数时发生的事情,所以我猜这也会帮助他。Java不是按值传递的。仅原语通过值传递。OP的对象不改变状态的原因是因为参数是对该对象的另一个引用,而makeNew只是将t引用设置为另一个新对象,这不会影响NNo,您的否决票是不正确的。看看我链接的第一个答案,Java总是被忽略
E这是您在此链接中引用的内部语义。进一步阅读后,您所演示的是,是的,内存位置地址通过值传递。。。当然是了!显然,任何其他给定语言中的指针也是如此。当我们谈到引用时,我们只是简单地说,对象是通过引用传递的,而在潜台词中,不必费心去提及:借助于一个实际上是通过值传递的内存地址。这是学究式的,它不能帮助OP真正理解他的问题的答案。这种内部语义帮助我理解将对象传递给函数时发生了什么,所以我猜这也会帮助他。Java不是按引用传递的,是,Java将对象作为引用按值传递。Java不是按引用传递,是,Java将对象作为引用按值传递。可能的重复
t = new Test(8);
System.out.println("Value of A.i= "+A.i);
System.out.println("Value of N.i= "+N.i);