Java里implements关键字怎么用_Java接口实现规则说明

implements必须写在class声明后、extends之后;一个类可实现多个接口,接口名用英文逗号分隔;实现接口须重写所有public abstract方法,default和static方法除外;接口方法默认public,实现类方法访问权限不可降低。

implements必须写在class声明后、extends之后

Java中一个类只能继承一个父类,但可以实现多个接口,implements

关键字的位置有严格语法要求:它必须紧跟在class声明之后,且在extends(如果存在)的后面。顺序写错会直接编译失败。

  • 正确写法:class Dog extends Animal implements Runnable, Serializable
  • 错误写法:class Dog implements Runnable extends Animal → 编译报错 Syntax error on token "extends", delete this token
  • 如果没继承父类,implements直接跟在class后:class Calculator implements MathOps, Loggable

实现接口必须重写全部抽象方法

接口里的public abstract方法(Java 8 之前只有这类方法)在实现类中必须提供具体实现,否则该类必须声明为abstract。Java 8+ 接口可含defaultstatic方法,这两类不强制重写。

  • 接口定义:
    interface Payment {
        void process();           // 必须实现
        default void log() {     // 可不重写
            System.out.println("logged");
        }
        static void validate() { // 不能被重写,只能通过接口名调用
            System.out.println("validating...");
        }
    }
  • 实现类若只写class CreditCardPayment implements Payment,却不提供process()方法,编译报错:CreditCardPayment is not abstract and does not override abstract method process() in Payment
  • 注意:即使接口方法没显式写public abstract,Java也会自动补全——所以省略修饰符不等于可以不实现

接口之间用逗号分隔,不能用and或&&

一个类实现多个接口时,接口名之间只能用英文逗号,分隔,不能用逻辑运算符或中文顿号。这是常见拼写错误点。

  • 正确:class ServiceHandler implements Runnable, Closeable, AutoCloseable
  • 错误:class ServiceHandler implements Runnable && Closeable → 编译错误 illegal start of type
  • 错误:class ServiceHandler implements Runnable、Closeable(中文顿号)→ 编译错误 illegal character: '\u3001'
  • 接口名顺序无关语义,但建议按常用程度或依赖关系排列,便于阅读

实现类可以同时继承父类并实现接口,但父类方法不能替代接口契约

即使父类已定义了与接口同名同签名的方法,只要该方法不是public,或访问权限不够(如父类是protected),实现类仍需显式重写以满足接口的public要求。

  • 接口要求:void start() → 隐含 public abstract void start()
  • 父类中:protected void start() { ... } → 不满足接口契约,实现类必须新增public void start()
  • 父类中:public void start() { ... } → 满足,可不重写(但建议加@Override注解明确意图)
  • 接口方法默认是public,实现类中对应方法不能降级为protectedprivate,否则编译报错:attempting to assign weaker access privileges
接口实现看似简单,真正踩坑多发生在访问修饰符隐含规则、多接口方法冲突(比如两个接口都有同名default方法)、以及父类已有方法是否真正“兑现”了接口承诺——这些地方不看字节码或不跑编译器,很容易凭直觉写错。