Java中子类调用getName()返回父类变量?如何改用子类变量?
问题原因与修复方案
错误原因
Java中成员变量不具备多态特性,子类定义与父类同名的name变量,只是对父类变量的隐藏(Hide),而非方法那样的重写(Override)。
父类的getName()方法属于父类成员,方法内的this.name在编译阶段就已经绑定到父类的name变量。哪怕是通过子类对象调用这个方法,由于方法本身没有被子类重写,执行的还是父类的方法逻辑,自然返回父类的name值。
修复方法
方法1:重写子类的getName()方法
在子类中重写getName(),让它返回子类自己的name变量:
class Child extends Parent { public String name = "child"; @Override public String getName() { return this.name; } }
此时调用child.getName()时,由于多态机制,会执行子类重写后的方法,返回子类的name值。
方法2:避免变量隐藏,通过构造方法修改父类变量
不在子类中定义同名变量,而是通过父类构造方法初始化name:
class Parent { public String name = "parent"; // 新增带参构造方法 public Parent(String name) { this.name = name; } // 保留无参构造 public Parent() {} public String getName() { return this.name; } } class Child extends Parent { public Child() { // 调用父类构造方法,修改父类的name值 super("child"); } }
这种方式避免了变量隐藏的问题,子类对象的name本质是父类的成员变量,调用getName()自然返回修改后的值。
内容的提问来源于stack exchange,提问作者GBLightning
相关产品推荐
相关产品推荐

