此问题与Java中super
和this
的实施决策有关。考虑,
父类包含变量name
和方法getName()
public class Parent {
protected String name = "Parent";
protected String getName(){
return this.name;
}
}
Child类继承Parent类,但有自己的name
变量
public class Child extends Parent {
protected String name = "Child";
protected void printNames() {
System.out.println("Parent: " + super.getName());
System.out.println("Child: " + this.getName());
}
public static void main(String[] args) {
Child c = new Child();
c.printNames();
}
}
输出:
Parent: Parent
Child: Parent
从输出中,我们可以看到:当从具有getName()
上下文的Child类调用方法super
时,它返回“Parent”,但在使用this
调用时上下文,它再次返回“父”
如果该方法仅存在于Parent类中,但两者中都存在具有相同访问修饰符的数据成员,
为什么不应该从Child类this.getName()
返回“Child”,因为它 is-a
Parent因此getName()
作为其方法
更新
这个问题不是关于如何打印或覆盖“Child”,而是关于Core Java Team的this
的实现决策,以及它的用途。
答案 0 :(得分:2)
字段不是overridable
只有方法,字段只能隐藏或不隐藏。 this
实际上是指方法Object
中类型为Parent
的当前Parent#getName()
,以便获取Parent
中定义的变量名称的值或者可能是父类,但不是像Child
这样的子类。
以下是一个简单的代码段,其中显示了这个想法:
Child child = new Child();
// Show the variable name of the class Child
System.out.println(child.name);
// Show the variable name of the class Parent which is what this.name
// does in the getName method
System.out.println(((Parent)child).name);
<强>输出:强>
Child
Parent
答案 1 :(得分:1)
如果你想把'child'作为输出你必须覆盖getname()方法,否则它将被继承,它将始终显示'parent'作为输出。
答案 2 :(得分:0)
只需覆盖Child类
中的getName()
方法即可
@Override
protected String getName() {
return name;
}
如果您不想覆盖getName()
方法,可以这样做:
name
构造函数中设置Child
值,因为它是protected
属性请勿在{{1}}类中重写name
属性
Child
答案 3 :(得分:0)
您需要向子类添加getName()方法。现在,当您调用this.getName()时,将调用父版本,因为它未在子类中被覆盖。