Java中类实现接口必须用implements关键字,并提供所有abstract方法的具体实现,否则需声明为abstract;接口方法默认public abstract,字段默认public static final。

Java 中一个类要实现接口,必须用 implements 关键字声明,并且**必须提供接口中所有 abstract 方法的具体实现**,否则该类必须声明为 abstract。
implements 语法和基本规则
类通过 implements 后接一个或多个接口名来声明实现关系,多个接口用逗号分隔。接口中的方法默认是 public abstract,字段默认是 public static final,这些修饰符即使不写也自动生效。
常见错误现象:
- 忘记实现某个接口方法 → 编译报错:
class X must either be declared abstract or implement abstract method Y() in Z - 方法签名(含参数类型、返回值、方法名)与接口不一致 → 不算重写,编译失败
- 把
implements写成extends→ 编译错误:unexpected token: implements
实操建议:
立即学习“Java免费学习笔记(深入)”;
- IDE(如 IntelliJ)通常会提示未实现的方法,按
Alt + Enter可自动生成存根 - 接口方法不能有方法体,但 Java 8+ 允许
default和static方法,子类可选择是否重写default方法
interface Drawable {
void draw(); // public abstract
int MAX_SIZE = 100; // public static final
default void resize() {
System.out.println("Resizing to " + MAX_SIZE);
}
}
class Circle implements Drawable { // ✅ 正确声明
public void draw() { // ✅ 必须显式 public(即使接口里没写)
System.out.println("Drawing a circle");
}
// resize() 可不重写,直接继承 default 实现
}
实现多个接口时的冲突处理
当一个类同时 implements 多个接口,而这些接口定义了**同名同签名的 default 方法**,编译器无法决定用哪个,就会报错。
使用场景:比如 Runnable 和自定义 Loggable 都有 run(),但签名不同不会冲突;若两个接口都有 default void close(),就必须在实现类中显式覆盖。
本文档主要讲述的是Android JNI开发入门与提高;JNI在Android系统中有着广泛的应用。Android系统底层都是C/C++实现的,上层提供的API都是Java的,Java通过JNI调用底层的实现。比如:Android API多媒体接口MediaPlayer类,其实底层通过JNI调用libmedia库。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 遇到
class inherits unrelated defaults for close() from types A and B错误,必须在类中重写该方法 - 可在重写方法中用
A.super.close()或B.super.close()显式调用某一方的 default 实现 - 注意:如果两个接口的方法只是名字相同但参数/返回值不同(即重载),不构成冲突
interface A {
default void log() { System.out.println("A"); }
}
interface B {
default void log() { System.out.println("B"); }
}
class Logger implements A, B {
@Override
public void log() {
A.super.log(); // ✅ 显式选择 A 的实现
// 或 B.super.log()
}
}
implements 和 extends 能否共存?
可以,但顺序固定:extends 必须在 implements 之前。Java 不支持多继承,所以一个类只能 extends 一个父类,但可以 implements 多个接口。
性能 / 兼容性影响:
-
implements是编译期契约,不产生运行时开销 - 接口方法调用实际走的是虚方法表(vtable)查找,和普通实例方法性能一致
- Java 8+ 的
default方法让接口演化更安全,旧实现类无需修改即可兼容新接口版本
容易踩的坑:
- 写成
class X implements I extends Y→ 语法错误,必须是class X extends Y implements I, J - 父类已实现某接口方法,子类仍需确保该方法对实现的接口可见(比如父类方法是
protected,而接口要求public→ 编译失败)
最常被忽略的一点:接口方法的实现必须是 public —— 即使父类以 protected 提供了同名方法,也不能满足接口契约,因为接口强制要求实现为 public。









