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;
    }
}  

swap メソッドは正常に機能します。つまり、x と y の値を交換します。

ここで、2 つの質問があります。

  1. swap メソッドは、渡された実際のデータをどのように変更できるのでしょうか? (Java では参照渡しではないことを読みました。)
  2. change メソッドがクラス参照を交換しないのはなぜですか?
4

1 に答える 1

3
  1. Java の値渡しは、やや興味深いものです。でヒープ上のオブジェクトへの参照を渡しています。したがって、逆参照/アクセスすることで、ヒープ上の既存のオブジェクトにアクセスしています。そのオブジェクトのフィールドが変更され、そのインスタンスへの他の参照は、(同じオブジェクトであるため) 逆参照されるときにこれらの変更を反映します。refDemo

  2. 参照は値で渡されるため、呼び出しはおよび参照のchange(myDemo1, myDemo2)を渡します。参照への参照を渡しません。値を切り替えても、メソッドの外部には影響しません。myDemo1myDemo2myDemo1

簡単にするために、参照の値が 12345 と 23456 であるとしましょう。最初に、12345 への参照を渡し、次にそのオブジェクトで物事を変更します。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 に答える