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

标签 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 的 i 的输出是 60 而不是 40。提前致谢 =)

最佳答案

这是简单的多态性。

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

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

当您将不同的打印行语句放入两个 setter 中时,您可以轻松地计算出这一点。

关于java - 获得此输出的可能原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38569485/

相关文章:

java - 多个 "cannot find symbol"错误

java - 使用Java匹配文本中的某些单词(模式)

java - Android studio中POST请求示例

java - 为什么我们必须在内部类中将静态变量声明为final?

javascript - 使用复选框标记要删除的行

java - 并发调用单例对象的Java方法

c# - 在 C# 4 中,如何在具有重载构造函数的父类的子类中拥有带可选参数的构造函数?

java - 部分方法的Spring和同步

mongodb - meteor 延迟补偿和 Date()

javascript - 如何在 javascript 中使用构造函数返回实例或其他东西?