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