java - jvm 对此有何 react

标签 java jvm

interface CanFight {
  void fight();
}

interface CanSwim {
  void swim();
}

interface CanFly {
  void fly();
}

class ActionCharacter {
  public void fight() {
      System.out.println("Inside class fight");
  }
}

class Hero extends ActionCharacter
    implements CanFight, CanSwim, CanFly {
  public void swim() {}
  public void fly() {}
}

      public class MultipleInterface {
  public static void t(CanFight x) { x.fight(); }
  public static void u(CanSwim x) { x.swim(); }
  public static void v(CanFly x) { x.fly(); }
  public static void w(ActionCharacter x) { x.fight(); }
  public static void main(String[] args) {
    Hero h = new Hero();
    t(h); // Treat it as a CanFight
    u(h); // Treat it as a CanSwim
    v(h); // Treat it as a CanFly
    w(h); // Treat it as an ActionCharacter
  }
}

当我不是从 canFight 接口(interface)实现方法而是从 ActionCharacter 类获取方法时,JVM 的行为如何?其背后的逻辑是什么?重点是我没有定义实现 canFight() 接口(interface)时必须完成的方法 fight()

最佳答案

主要不是 JVM,而是 Java 编译器。 (如果 JVM 发现缺少一个应该存在的方法,您将得到一个 NoSuchMethodException,但编译器不会让您到达那个点,除非您欺骗它)。

至于你的问题,方法在哪个类或父类(super class)或接口(interface)中声明并不重要,只需要名称和签名匹配即可。因此,ActionCharacter#fightCanFight#fight 声明的是同一件事。 Java 对两者没有区别(无论是编译器还是 JVM/字节码格式)。

您的 Hero 继承了 ActionCharacterfight,但由于它恰好也匹配 CanFight 中定义的方法,它还兼作该接口(interface)的实现。

可以更清楚地改变方法名称(如果它们应该是两种不同的方法)或者让 ActionCharacter 也实现 CanFight(如果这确实是为了方法相同)。

关于java - jvm 对此有何 react ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15608743/

相关文章:

java - HTML 单元 : filling a form that refreshes automatically

java - Java对象头是什么?

java.lang.VerifyError 构造函数调用

java - 如何通过环境变量设置系统属性?

java - Groovy 如何访问 Java 类的私有(private)方法?

java - DataJpaTest 不创建架构

java - 应用于 Paragraph 的 itext spacingBefore 属性导致新页面

java - 从不同设备导入后,(Eclipse Android 应用程序)项目缺少所需的库

Java 应用程序在 Mac 和 Windows 上运行自己的 JVM

java - 尝试返回到以前的 JFrame 时遇到困难