![](/img/trans.png)
[英]In java, if I call, from a subclass, a superclass method that calls an overriden method, which class' method will be called?
[英]JAVA: what happend when i call a getter method of a object which actually extend the method from it's superClass
public class Person {
public String name = "person";
public String getName(){
return name;
};
}
public class Teacher extends Person{
public String name ="teacher";
public static void main(String[] args) {
Teacher teacher = new Teacher();
System.out.println(teacher.getName());
}
}
**无论名称属性的修改是私有的还是公共的,结果始终是“人”,但到目前为止我所学到的告诉我,如果子类从超类扩展,它也会包含超类的方法,所以当我调用该方法时子类object,方法中的名称应该是this.name,这应该是老师吧?,但为什么我仍然得到超类的名称? **
子类中名为name
的变量隐藏了super class中的同名变量。参见https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#d5e12172
您可能希望在超类中只有一个字段name
,并希望在构造 object 时设置它:
class Person {
private final String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
class Teacher extends Person {
public Teacher(String name) {
super(name);
}
public static void main(String[] args) {
Teacher teacher = new Teacher("teacher");
System.out.println(teacher.getName());
}
}
这基本上是范围界定的问题。 private
变量只能由定义的 class 访问。在您的例子中,基数 class 负责实现 getter function,它只会知道自己的变量。
基础 class 不知道子类中定义的变量(这可以说是过于简单化了,下面的建议中有一些解释性细节,但至少应该让你走上正确的道路)。
如果您希望子类能够修改变量值,而不仅仅是 function,那么您需要执行以下操作之一:
protected
(仅对 class 及其子类可见),并在子类的构造函数中对其进行赋值。 或者,return "teacher";
)。 如果这样做,请记住您正在分配一个碰巧共享相同名称的新变量; 它与 state 的基类视图不同。super(name)
,就像@tgdavies 所做的那样。 如果设置名称是所有子类的一个相当关键的行为,这个解决方案连同上面的#1 和#2,确保名称只有一个真实来源。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.