Java SE8:未实现继承抽象方法的具体类为何可编译运行?
问题原因解析
1. IDE提示的合理性
按照Java语法规范,非抽象类实现接口时必须覆盖该接口及其所有父接口的全部抽象方法,如果做不到,就必须把这个类声明为abstract(抽象类)。
你的代码里Class1是普通类(非抽象),实现了继承自Interface1的Interface2,但只实现了method2(),没实现method1(),所以Eclipse提示“类型Class1必须实现继承的抽象方法Interface1.method1()”是完全符合Java语法规则的。
2. 代码能编译运行的原因
这是Eclipse使用的ECJ编译器与Oracle官方javac编译器的行为差异导致的:
- ECJ编译器对这类场景有一定容忍度:只要代码中没有直接创建未完成抽象方法的类的实例,且没有调用未实现的抽象方法,就允许编译通过。
- 你的代码里,
main方法只是用Class1作为引用类型指向子类Class2的实例,实际运行时只调用了已经被实现的method2(),完全没涉及未实现的method1(),因此ECJ允许编译并正常输出结果。
补充验证
如果修改代码做以下操作,Eclipse就会触发编译错误:
- 直接创建
Class1的实例:Class1 x = new Class1(); - 调用未实现的
method1():x.method1();
内容的提问来源于stack exchange,提问作者LaVeron
相关产品推荐
相关产品推荐

