Java 返回旧值的Getter

Java 返回旧值的Getter,java,object,constructor,initialization,Java,Object,Constructor,Initialization,我最近遇到了一个对象初始化问题 我有一个类(它是以这种方式设置的,用于持久数据存储和加载) 初始化对象后调用的getName()返回的是”,而不是“示例” 你知道这一切的根本原因是什么吗?如果我在构造函数中设置name,它可以正常工作。但是当它通过super时,它会出错 Example e = new Example(); System.out.println(e.getName()); 我认为这是因为示例类方法受到保护。它不能从类外调用,因此您正在调用超类方法。这不起任何作用,因此值仍然是“

我最近遇到了一个对象初始化问题

我有一个类(它是以这种方式设置的,用于持久数据存储和加载)

初始化对象后调用的
getName()
返回的是
,而不是
“示例”

你知道这一切的根本原因是什么吗?如果我在构造函数中设置
name
,它可以正常工作。但是当它通过
super
时,它会出错

Example e = new Example();
System.out.println(e.getName());

我认为这是因为示例类方法受到保护。它不能从类外调用,因此您正在调用超类方法。这不起任何作用,因此值仍然是
“”
。要检查这一点,请向load方法添加一条print语句,并查看是否正在调用它。

初始值设定项代码:private String name=“”;在父构造函数之后运行。删除初始化,它将正常工作。但您不应该从构造函数调用可重写的方法。:)

而不是

private String name="";

TL;DR:不要在构造函数中调用可重写的方法。实例变量initialiser在super()调用之后运行。不要从构造函数调用可重写的方法。啊哈,谢谢@lealcelderio在他提到后发现了这个。这回答了你的问题吗?不,这和这件事无关,这不是问题所在。尽管这确实是一个问题。事实上,在超级构造函数中使用受保护的负载是一件可怕的事情。这并不能纠正在超级类的构造函数中调用一个被子类重写的方法的事实(这里是问题的根本原因)。被重写的方法不是问题的根本原因。这不是一个好的编程实践,但名称值被覆盖的根本原因正如我所描述的。
private String name;
private String name="";