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

Java 获得此输出的可能原因是什么?,java,methods,constructor,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 *

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

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;
  }
}

我想知道为什么这是我的输出是60,而不是40。提前感谢=)

这是一个简单的多态性

您正在创建一个B对象,因此当a构造函数调用setI()时,它正在调用“B版本”(这导致3*20=60)

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


当您将不同的打印行语句放入两个setter中时,您可以很容易地看出这一点。

这是一个简单的多态性

您正在创建一个B对象,因此当a构造函数调用setI()时,它正在调用“B版本”(这导致3*20=60)

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


当您将不同的打印行语句放入两个setter中时,您可以很容易地看出这一点。

为什么您希望它是40?当你不表达你的想法时,很难纠正它。如果你期望它是40,那么你就完全忽略了多态性的概念。:)你为什么期望它是40?当你不表达你的想法时,很难纠正它。如果你期望它是40,那么你就完全忽略了多态性的概念。:)所以A中的方法setI()从未被调用。是吗?明白了。谢谢!!=)所以A中的方法setI()从未被调用。是吗?明白了。谢谢!!=)