2017-06-25 9 views
5

Javaのラッパークラスが参照型のように動作しない理由を理解するのに大きな問題があります。 例:Javaのラッパークラスが参照型のように動作しないのはなぜですか?

Integer one = 10; 
Integer two = one; 
one = 20; 
System.out.println(one); 
System.out.println(two); 

出力は次のようになります。

を私はtwoは、私は自分のクラスを作成するには、この例のように20になると思いました

class OwnInteger { 
     private int integer; 

     public OwnInteger(int integer) { 
      this.integer = integer; 
     } 

     public int getInteger() { 
      return integer; 
     } 

     public void setInteger(int integer) { 
      this.integer = integer; 
     } 
    } 

    OwnInteger one = new OwnInteger(10); 
    OwnInteger two = one; 
    one.setInteger(20); 
    System.out.println(one.getInteger()); 
    System.out.println(two.getInteger()); 

質問はInteger wraです授業は特別ですか?私の例で示したように、なぜそれは動作しますか?

+4

'one = 20;'と 'one.setInteger(20);'には大きな違いがあり、ラッパークラスとは何の関係もありません。最初のスニペットの 'one = 20;'は2番目のスニペットで 'one = new OwnInteger(20);'と等しくなります。 – Eran

+1

これらのクラスは参照型とまったく同じように動作します。 1つの参照を別のオブジェクトにポイントすると、他のポインタは変更されません。ポインタは独立しています。同じ_オブジェクト_へのポインタを介して表示される_オブジェクト_への変更のみです。 JLSの言うとおり、Javaの「参照はポインタです」ということを覚えておいてください。 –

答えて

8

これはまさに参照の振る舞いであると等価になりますタイプ。あなたの例では、twoは、割り当て後にoneと同じオブジェクトを参照します。ただし、新しいオブジェクトoneを再割り当てしても、表示される動作はtwoには影響しません。あなたは一つのオブジェクトを変更する際の挙動を示すために参照クラスは、他を変更するためには例

StringBuilder one = new StringBuilder("10"); 
StringBuilder two = one; 
one = new StringBuilder("20"); 
// two still references StringBuilder with "10" 

のために、同様に他の参照オブジェクトと同じ動作を確認します

、クラスがあることが必要のように、コード内のOwnIntegerクラスのように、のコードでは、オブジェクトを再割り当てするのではなく、コードを変更する必要があります。 Integerなどのラッパークラスは不変なので、そのような動作は発生しません。 「ボクシング」を使用して、実際にこれに相当し

3

私はあなたがこの

Integer two = one; 
one = 20; 

を行うときに、あなたが実際に変数oneに新しいオブジェクトを割り当て、変数され、

NOP ... 2は20だろうと思いましたtwoはこれらの変更で更新されません...

あなたのクラスOwnIntegえー、彼らはonetwoには同一の参照を指しているので、あなたが期待何

OwnInteger one = new OwnInteger(10); 
OwnInteger two = one; 
one.setInteger(20); 

..

コードA

OwnInteger one = new OwnInteger(10); 
OwnInteger two = one; 
one = new OwnInteger(20); //one.setInteger(20); 
+0

"1人と2人が同じ参照を指しています.."間違っている、彼らは同じ_オブジェクト_を指しています。 –

0
one = 20; 

:あなたのケースでは

one = Integer.valueOf(20); 

valueOf方法新しいオブジェクトを作成し、その新しく作成されたオブジェクトの参照を返す前にキャッシュに存在しないため、 。

自分のクラスでは、onetwoの両方の参照変数が同じオブジェクトを指しています。

+0

オートボクシングがなくても同じことが起こりましたが、これはOPの観察の理由ではありません。 –

0

その他の回答はこれまでのところすべてが少なくとも部分的に間違っています。あなたが見る効果は、オートボクシングや可変性とは関係ありません。あなたの最初のステップのようなポインタを変更し、2番目のステップのようにポインタを介してオブジェクトを変更することは全く異なることです。ポインタを変更すると、別のオブジェクトを指していました。両方のポインタが異なるオブジェクトを指しているように、両方のポインタを変更しませんでした。これは、変更やボクシングの変換に関係なく発生します。

関連する問題