我最近在玩Java 8的新功能并观察到一个有趣的行为:
这没关系:
Class A { static void staticMethodInA() {println();} }
Class B extends A {}
B.staticMethodInA();
这会导致错误:静态方法只能在包含接口类时调用。
interface A { static void staticMethodInA() {println();} }
Class B implements A {}
B.staticMethodInA(); // from here IntelliJ complaints..
有人能告诉我为什么Java 8的设计师会选择以不同的方式处理上述两种情况吗?
答案 0 :(得分:33)
在Java 8中,在接口中添加static
方法有1个限制 - 实现它的类不能继承这些方法。这是有道理的,因为一个类可以实现多个接口。如果2个接口具有相同的static
方法,则它们都将被继承,编译器将不知道要调用哪个接口。
但是,通过扩展课程,这没有问题。 static
类方法由子类继承。
请参阅JLS §8.4.8:
C类从其直接超类继承超类的所有具体方法m(静态和实例)
...
C类继承自其直接超类和直接超接口所有抽象和默认(§9.4)方法m
...
类不会从其超接口继承静态方法。