调用子类对象继承的父类getter方法为何返回父类属性值?
为什么teacher.getName()返回"person"?
先看你给出的两个类代码:
Person类
public class Person { public String name = "person"; public String getName(){ return name; }; }
Teacher类
public class Teacher extends Person{ public String name ="teacher"; public static void main(String[] args) { Teacher teacher = new Teacher(); System.out.println(teacher.getName()); } }
问题解答
核心原因是Java的成员变量没有多态性,只有方法才支持多态特性。
具体拆解:
- Teacher类继承了Person的
getName()方法,但没有重写这个方法,调用时执行的是父类Person中的getName()实现。 - 在父类的
getName()里,return name本质是return this.name,这里的name是Person类自己定义的成员变量。 - 子类Teacher中定义的同名
name属性,只是隐藏了父类的name,不是覆盖——因为属性不支持多态,父类方法只会访问自身类中定义的成员变量,不会被子类的同名属性替换。
你提到的「不管父类name是私有还是公有,结果都是person」也能对应这个逻辑:
- 如果父类name是私有:父类的
getName()方法属于Person类,天然能访问自己的私有成员,子类继承该方法后,执行时依然访问父类的私有name。 - 如果父类name是公有:子类的同名name只是隐藏了父类属性,父类方法里的name还是指向自己的那个,不会指向子类的。
内容的提问来源于stack exchange,提问作者zfing
相关产品推荐
相关产品推荐

