笔者使用的eclipse IDE版本:
笔者使用的java版本
前提条件:static方法不能被继承也不能被重写。
触发bug的方法:创建一个接口并编写一个静态方法
package testing;
public interface JInterface{
int i = 0;
static int a() {
return 1;
}
}
创建一个类实现该接口,并定义一个同名方法a()
package testing;
public class JTesting implements JInterface{
public void hello() {
System.out.print(this.a());
}
public int a() {
return JInterface.a();
}
}
在eclipse IDE中,该方法被理解为override。
该bug还有其他的体现形式,当以另一个接口extends该接口时,亦可以编写一个抽象方法重写该方法。
package testing;
public interface JInterface_2 extends JInterface{
public int a();
}
并且可以被多重继承。更有趣的是这个所谓重写关系不用满足任何条件,只要名字相同就行,返回值可以任意定义,参数亦可以任意定义,不必满足Java的重写条件或者lsp原则。
实际上这个方法并没有被继承,如果批注@Override,无法通过静态检查。
错误报告称必须override父类中的方法,可见static方法对于子类是不可见的。
IDEA中也无法复现该现象,可见该现象实际上是一个bug。按照笔者的理解这个不构成重写,而是单纯的定义了一个同名方法。
另:eclipse中,实际上interface中的方法除了不能用final修饰,别的用什么都可以。但是一个抽象方法不能用private或者static修饰,必须具有方法体。按照笔者推测,使用private修饰时编译器会默认将该方法视为static,因为interface既然属于一种抽象类,那么它里面不允许存在具有方法体的方法,除非是static方法。