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#fight
和 CanFight#fight
声明的是同一件事。 Java 对两者没有区别(无论是编译器还是 JVM/字节码格式)。
您的 Hero
继承了 ActionCharacter
的 fight
,但由于它恰好也匹配 CanFight
中定义的方法,它还兼作该接口(interface)的实现。
可以更清楚地改变方法名称(如果它们应该是两种不同的方法)或者让 ActionCharacter
也实现 CanFight
(如果这确实是为了方法相同)。
关于java - jvm 对此有何 react ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15608743/