0

这是我写的类的代码

class Demo
{
    int x,y;
    Demo(int a,int b){x=a;y=b;}
    public void swap(Demo ref) // interchanges field values of x and y
    {
        int temp;
        temp=ref.x;
        ref.x=ref.y;
        ref.y=temp;
    }

    public void change(Demo ref1,Demo ref2) // supposed to interchange to class variables of Demo class
    {
        Demo temp = ref1;
        ref1 = ref2;
        ref2 = temp;
    }
}  

交换方法工作正常,即交换 x 和 y 的值。

现在,我在这里有两个问题:

  1. 交换方法如何能够改变传递给它的实际数据?(我已经读到它们在 Java 中不是通过引用传递的。)
  2. 为什么更改方法不交换类引用?
4

1 回答 1

3
  1. Java 中的按值传递有点有趣。您通过 value传递对堆上对象的引用。因此,通过取消引用/访问,您正在访问堆上的现有对象。该对象的字段已更改,并且对该实例的任何其他引用将在取消引用时反映这些更改(因为它是同一个对象)。refDemo

  2. 因为引用是按值传递的,所以调用change(myDemo1, myDemo2)会传递the和引用的值。我们没有传递对引用的引用。在方法之外切换值不会影响它们。myDemo1myDemo2myDemo1

我们只是说为了简单起见,引用的值是 12345 和 23456。首先,我们传入一个对 1​​2345 的引用,然后我们使用该对象进行更改。对 12345 的任何其他取消引用都将反映这些更改。

现在,让我们尝试以下操作:

public static void main(String... args){
    Demo d1,d2;
    d1=new Demo(1,2); //VALUE of d1 is 12345, and deferencing d1 will get us a demo object at 12345 with 1 and 2.
    d2=new Demo(9,8); //VALUE of d2 is 23456. Deference it, get a demo with 9 and 8.
    change(d1,d2); //d1 and d2 are passed by VALUE. `change()` gets its own copy of d1 and d2 to play with.
}
于 2013-09-14T16:54:42.870 回答