看一下以下情景:
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);
}
}
在这里,我使用 com.google.gson.Gson 包进行json转换。它给出了以下输出:
{“testVar”:1}
我在json字符串中预期3,但我得到的是parentClass的testVar变量所持有的值。
孩子的getTestVar不应该覆盖父母的对手吗?
是否直接访问实例成员(更改每个类的实例成员的名称,但保持getter名称相同证明了这一点)?
如果是,那么任何人都可以直接访问私人成员?
编辑:我编辑了这个问题。此版本仅在json中显示父级的值。有没有办法让孩子的实例成员?
答案 0 :(得分:3)
是的,确实
是的,Gson直接访问字段。其他执行类似任务的库通常允许您在字段和属性(即使用getter和setter)访问之间进行选择,但Gson仅支持字段访问。
私有字段对于常规代码是不可访问的,但在某些特殊情况下(例如序列化/反序列化),直接访问它们是完全合理的。这就是您可以使用反射访问私有字段的原因(请参阅AccessibleObject
)。