覆盖toString()会导致行为与覆盖普通方法不同吗?

时间:2019-06-23 18:39:58

标签: java inheritance polymorphism

我在javadeathmatch.com上遇到了一个继承问题,似乎无法解决问题。我对多态的理解是,对象将在实例化时表现出来(即Object a = new Child())将表现为孩子,因为它是内存中的孩子对象。因此,在下面的代码中调用p2的父级之前,p2不应该先搜索它自己的toString()方法吗?

经过一番探索,我发现p2.name设置了Person的实例变量,这与我从方法和继承中学到的完全相反。字段有不同的规则吗?

public class Person {
    public String name;

    @Override
    public String toString() {  return name;    }
}

class Student extends Person {
    public String name;

    @Override
    public String toString() {  return name;    }
}

      Person p1 = new Person();
      Person p2 = new Student();

      p1.name = "ricky";
      p2.name = "maru";

      System.out.println(p1.toString() + p2);

}

Output is rickynull
I would have guessed rickymaru

1 个答案:

答案 0 :(得分:0)

是导致不同行为的变量。当在子类中创建相同名称的变量时,这称为隐藏。现在,生成的子类实际上将同时具有这两个属性。您可以使用super.var或(((SuperClass)this).var。变量甚至不必是同一类型。它们只是两个共享名称的变量,就像两个重载方法一样。