Java子类调用继承的父类字符串属性返回null的原因及解决办法
问题原因
- 子类
TrueFalseQuestion中重复声明了和父类同名的question属性,该操作会隐藏父类的同名属性,子类方法中直接调用question时,默认访问的是子类自身声明的属性,而非父类中存储了值的属性。 - 父类的
question属性被private修饰,子类本身无法直接访问该私有属性,只能通过父类提供的公共getQuestion()方法获取值。 - 你仅在子类构造方法中通过
super(question)给父类的question完成了赋值,没有给子类自身声明的question赋值,该属性默认值为null,重写的getQuestion()方法中读取的就是这个未赋值的属性,因此输出结果带null。
修正方案
最优的修正方式是删除子类中冗余的同名question声明,在需要获取问题内容时调用父类已有的公共getter方法即可,修正后的子类代码如下:
public class TrueFalseQuestion extends Question implements ITrueFalseQuestion{ boolean answer; public TrueFalseQuestion(String question, boolean answer){ super(question); this.answer=answer; } @Override public String getQuestion(){ // 调用父类getQuestion方法获取已赋值的问题内容 return super.getQuestion() + " True/False?"; } @Override public boolean checkAnswer(boolean answer){ return this.answer == answer; } }
如果你出于特殊场景必须保留子类的同名question属性,也可以在子类构造方法中补充对该属性的赋值:this.question = question;,但该方案存在属性冗余定义的问题,不推荐使用。
内容的提问来源于stack exchange,提问作者Dennis
相关产品推荐
相关产品推荐

