3
public class AAA {
    public static void main(String[] args) {
        Integer bbb, aaa = new Integer(5);
        System.out.print(aaa);
        bbb = aaa;
        System.out.print(bbb);
        aaa = 4;  
        System.out.print(aaa);
        System.out.print(bbb);
    }
}

結果として、5544 ではなく 5545 と表示されるのはなぜですか?

※javaバージョン「1.7.0_10」

おかげさまで、自分の間違いがわかりました。

4

6 に答える 6

3
public class AAA {
    public static void main(String[] args) {
        Integer bbb, aaa = new Integer(5);
        System.out.print(aaa);
        bbb = aaa;

上記の行は、bbbとaaaを同じオブジェクトを指すように割り当てています。

        System.out.print(bbb);
        aaa = 4;  

これで、aaaは新しいオブジェクト(オートボクシングによって目に見えない形で作成されます)を指します。これは、bbbがまだ指している元のオブジェクトの値を変更しません。整数は不変であることに注意してください。これは、Integerオブジェクトの値を変更できないことを意味します。異なる値でのみ新しいIntegerオブジェクトを作成できます。

        System.out.print(aaa);
        System.out.print(bbb);
    }
}
于 2013-01-11T03:50:16.103 に答える
1

aaa = 4;これは、自動ボクシングaaa = new Integer(4);原因で、その割り当て後に別のオブジェクトを参照することを意味します。aaabbb

于 2013-01-11T03:52:38.700 に答える
1

参照変数に代入すると、それが指しているものが変更されます。オブジェクトの値を変更して、その変更が 2 つ以上の異なる参照を通して見えるようにするには、値の変更をサポートするクラスを持つオブジェクトが必要です。整数はありません。StringBuffer は次のことを行います。

public class Test {
  public static void main(String[] args) {
    StringBuffer a = new StringBuffer();
    StringBuffer b = a;
    a.append("Hello, world");
    System.out.println(b);
  }
}

a.append 呼び出しは、a と b の両方が参照する StringBuffer の内容を変更します。

于 2013-01-11T05:05:34.027 に答える
0

に設定bbbしても、後で再割り当てされたときに更新されるaaaわけではありません( )。bbbaaaaaa = 4

于 2013-01-11T03:45:26.903 に答える
0

Java では、オブジェクトは参照による呼び出しとして定義され、型は値による呼び出しとして定義されるためです

それを変更するとint bbb, aaa = 5;、結果は期待どおりに戻ります。

これは、 anIntegerがオブジェクトであり、 anintが型であるためです。

于 2013-01-11T04:02:01.473 に答える
0

bbbと変わらないaaa。プログラムに 5544 を出力させたい場合は、行bbbaaaすぐ下に再定義する必要があります。aaa = 4;

于 2013-01-11T03:45:13.963 に答える