获得此输出的可能原因是什么?

时间:2016-07-25 13:46:31

标签: java methods constructor

这是我在某个网站上发现的一个问题。代码是这样的。

public class Test {
public static void main(String[] args) {
    new B();
  }
}

class A {
  int i = 7;

  public A() {
   setI(20);
   System.out.println("i from A is " + i);
  }

  public void setI(int i) {
    this.i = 2 * i;
  }
}

class B extends A {
  public B() {
    // System.out.println("i from B is " + i);
  }

  public void setI(int i) {
    this.i = 3 * i;
  }
}

我想知道为什么这个来自A的输出是60而不是40.提前感谢=)

1 个答案:

答案 0 :(得分:4)

这是简单的多态性。

你正在创建一个B对象,所以当A构造函数调用setI()时,它正在调用" B版本" (导致3 * 20 = 60)。

换句话说:当您在Java中调用对象上的方法时,JVM将在运行时检查该对象是哪个具体类;并调用它在那个类上找到的方法。因此:setI()在其" B"中被调用一次。版本

当您将不同的打印行语句放入两个设置器时,您可以很容易地想到这一点。