【发布时间】:2021-12-18 12:15:57
【问题描述】:
考虑以下 sn-p:
interface Super{
public static void doIt(){}
}
class Sub implements Super{
public void doIt(){}
}
- 这里我声明了一个静态成员方法,它被重新声明为子类中的实例方法。
- 编译器允许这样做 - 但是当我对超类和子类类型执行相同操作时 - 这会导致编译错误:
class Super{
public static void doIt(){}
}
class Sub extends Super{
public void doIt(){}
}
- 相同的原因是什么? - 理想情况下,访问子类的方式基本相同 - 那么为什么会有这种限制?
【问题讨论】:
-
我怀疑编译器正在阻止一个错误。因为可以在实例上调用超类上的静态方法(是的,带有警告),这最终可能会产生误导……
subObject.doIt()将调用哪个方法?如果Super是接口,则不能使用subObject.doIt()调用Super.doIt(),编译器已经禁止这样做。 -
作为类实例一部分的成员被覆盖(即公共和受保护),静态成员不是类实例的一部分,它是实际类的一部分。
标签: java inheritance java-8 interface static-methods