3

私の質問は非常に基本的なものですが、すべてを 100% 理解したいと思っています。SO の多くの質問は私の投稿を参照していますが、満足のいく答えが見つかりません。

Java の Enum は参照型であることはわかっています。次のスニペットを考えてみましょう。

public static class A {
    public int i;
    public A(int i) {
        this.i = i;
    }
}

public static class Test {
    int i;
    A a;

    public Test(int i, A a){
        this.i = i;
        this.a = a;
    }

    public Test(Test oldTest){
        this.i = oldTest.i;
        this.a = oldTest.a;
    }
}

public static void main(String[] args) {
    Test t1 = new Test(10, new A(100));
    System.out.println(t1.i + " " + t1.a.i);
    Test t2 = new Test(t1);
    t2.i = 200;
    t2.a.i = 3983;
    System.out.println(t2.i + " " + t2.a.i);
    System.out.println(t1.i + " " + t1.a.i);

}

Test のコピー コンストラクターが浅いコピーを作成するため、出力は非常に明白です。

10 100
200 3983
10 3983

しかし、Javaの列挙型も参照型であるため、1つ理解できません。A クラスを Enum に置き換えましょう。

public static enum TestEnum {
        ONE, TWO, THREE;        
    }

    public static class Test {
        int i;
        TestEnum enumValue;

    public Test(int i, TestEnum enumVar){
        this.i = i;
        this.enumValue = enumVar;  
    }

    public Test(Test oldTest){
        this.i = oldTest.i;
        this.enumValue = oldTest.enumValue;  // WHY IT IS OK ?? 
    }
}

public static void main(String[] args) {
    Test t1 = new Test(10, TestEnum.ONE);
    System.out.println(t1.i + " " + t1.enumValue);
    Test t2 = new Test(t1);
    t2.i = 200;
    t2.enumValue = TestEnum.THREE;  // why t1.emunValue != t2.enumValue  ??
    System.out.println(t2.i + " " + t2.enumValue);
    System.out.println(t1.i + " " + t1.enumValue);

}

私は出力を期待していました:

10 ONE
200 THREE
10 THREE   <--- I thought that reference has been copied... not value

しかし、私は持っています:

10 ONE
200 THREE
10 ONE

質問: なぜですか? 私の考えはどこが間違っていますか?

4

1 に答える 1