Java接口实现类编译规则及代码语法错误排查
代码问题拆解与修正
第一次作答的问题与优化点
- 存在对题目原始结构的过度修改:题目明确给定了接口I的固定框架,要求补充类C的代码逻辑,你擅自将接口中的
m2()修改为带default实现的方法,改动了题目指定的原有接口定义,不符合答题要求。 - 存在多处语法漏写:
- 接口中的
default方法声明漏写方法圆括号,正确语法应为default public void m2() { ... } - 类C中实现的
m1()方法漏写方法体大括号,只有方法声明没有闭合结构,无法通过编译 - 游离的实例调用代码位置错误:
C c = new C(); c.m2();这类执行语句不能直接写在类结构外层,Java要求可执行语句必须放在某个类的方法内部。
- 接口中的
第二次代码的编译报错根源
error: illegal start of expression的触发原因是非法嵌套方法定义:你将m1()、m2()两个需要实现的成员方法,直接定义在了类C的main()方法内部。Java语法不允许在方法内部直接声明带访问修饰符的成员方法,方法块内只能编写执行逻辑、调用已定义的方法,不能嵌套定义方法结构,因此编译器会在方法内的public void m1()位置抛出非法起始的错误。- 关于编译器提示“需要在类C中插入
public static void main(String[] args)方法”的原因:你定义的类C是被public修饰的公开类,按照Java的编译运行规则,一个Java源文件中如果存在公开类,程序运行时会优先在该公开类中查找标准签名的main方法作为程序入口;由于你在类C的main方法内部嵌套写了其他方法,打乱了类的结构,编译器无法识别完整的入口方法,才会给出对应的提示,并非你单独写了Main类的main方法就可以绕开公开类的入口检查规则。
符合题目要求的可编译参考实现
严格保留题目给定的接口结构,类C仅需在自身的类层级直接实现两个抽象方法即可:
public interface I { public void m1(); public void m2(); } public class C implements I { // 类C待编写区域:直接实现接口要求的抽象方法 @Override public void m1() { System.out.println("m1 执行逻辑"); } @Override public void m2() { System.out.println("m2 执行逻辑"); } // 如需直接运行测试,可在类C中编写标准main方法 public static void main(String[] args) { C cInstance = new C(); cInstance.m1(); cInstance.m2(); } }
注意:所有实现接口的成员方法,都必须放在类的大括号直接下属的层级,不能嵌套到其他方法内部。
内容的提问来源于stack exchange,提问作者Ms. Confused
相关产品推荐
相关产品推荐

