2

次のシナリオを見てください。

public class ParentClass {

    private Integer testVar = 1;

    public Integer getTestVar() {
        return testVar;
    }

    public void setTestVar(Integer testVar) {
        this.testVar = testVar;
    }
}


public class ChildClass extends ParentClass {

    private Integer testVar = 2;

    @Override
    public Integer getTestVar() {
        return testVar;
    }

    @Override
    public void setTestVar(Integer testVar) {
        this.testVar = testVar;
    }
}


public class TestClass {

    public static void main(String[] args) {

        ChildClass childClass = new ChildClass();
        childClass.setTestVar(3);
        Gson gson = new Gson();
        String str = gson.toJson(childClass);
        System.out.println(str);
    }
}

ここでは、json変換にcom.google.gson.Gsonパッケージを使用しました。次の出力が得られます。

{"testVar":1}

json文字列に3を期待していましたが、得られたのは、parentClassのtestVar変数によって保持されている値でした。

  1. 子のgetTestVarは、親の対応するものをオーバーライドするべきではありませんか?

  2. インスタンスメンバーに直接アクセスしていますか(各クラスのインスタンスメンバーの名前を変更しますが、ゲッターの名前を同じに保つことでこれが証明されます)?

  3. はいの場合、誰でもプライベートメンバーに直接アクセスするにはどうすればよいですか?

編集:私はこの質問を編集しました。このバージョンでは、jsonで親の値のみが表示されます。子のインスタンスメンバーを取得する方法はありますか?

4

1 に答える 1

3
  1. はい、そうです

  2. はい、Gsonはフィールドに直接アクセスします。同様のタスクを実行する他のライブラリでは、多くの場合、フィールドアクセスとプロパティアクセス(つまり、ゲッターとセッターを使用)のどちらかを選択できますが、Gsonはフィールドアクセスのみをサポートしています。

  3. プライベートフィールドは、通常のコードではアクセスできないようになっていますが、一部の特殊なケース(シリアル化/逆シリアル化など)では、直接アクセスするのが完全に合理的です。そのため、リフレクションを使用してプライベートフィールドにアクセスできます(を参照AccessibleObject)。

于 2012-06-25T17:40:13.167 に答える