Java的实现 - 调用Parent类方法来利用Child类数据成员

时间:2016-05-28 13:27:40

标签: java inheritance this super

此问题与Java中superthis实施决策有关。考虑,

父类包含变量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的实现决策,以及它的用途。

4 个答案:

答案 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()时,将调用父版本,因为它未在子类中被覆盖。