这可能在某个地方回答了,但是我不知道要搜索什么。假设您有以下...

超类Animal.java

public class Animal {
  public String noise = "squeak";
  public String toString() { return noise; }
}


子类Lion.java

public class Lion extends Animal {
  public String noise = "ROAR!!";
  public String toString() { return noise; }
}


主类Runner.java

public class Runner {
  public static void main(String[] args) {
    Animal a = new Animal();
    System.out.println(a);
    System.out.println(a.noise);
    Lion b = new Lion();
    System.out.println(b);
    System.out.println(b.noise);
    Animal c = new Lion();
    System.out.println(c);
    System.out.println(c.noise);
  }
}


输出为:

squeak
squeak
ROAR!!
ROAR!!
ROAR!!
squeak


为什么c.noise返回吱吱声?实例方法调用与实例变量之间的区别是什么(一个实例返回您所期望的,而另一个实例则没有)? Java为什么要这样做?

谢谢

最佳答案

简短答案:

您可以覆盖方法,但不能覆盖字段。

长答案:

每个类都可以看到其自己的方法和字段以及其父方法(私有方法除外)。如果子对象关心的方法与其父类中的方法名称相同,则该方法将被覆盖-如果以某种方式在子实例上调用了该方法(即使从父方法之一),将会使用全新的方法,而不是父母的方法。子代仍可以通过super.method(...)调用其上一个父代的原始方法。

但是当我们来到田野时,情况就不同了。如果孩子声明了一个新字段,该字段的名称与父类中的字段完全相同,它将简单地隐藏父字段而不覆盖它,就像局部变量隐藏全局字段一样。因此,子方法将仅看到子项的字段,而父方法将继续看到父项的字段,而子类的字段将不会从父类中以任何方式显示-这就是您所拥有的。

子级可以通过((Parent)this).field访问其父级的字段。

10-07 19:25
查看更多