Java接口默认方法是Java 8引入的用default关键字定义的有具体实现的方法,用于解决接口升级时的向后兼容问题,如Collection新增stream()方法而不强制修改所有实现类。
Java接口默认方法是什么,为什么需要它
接口默认方法是 Java 8 引入的特性,允许在
中用
关键字定义有具体实现的方法。它解决了「向后兼容」这个现实问题:当给已有接口新增方法时,所有实现类不用被迫改代码就能编译通过。
典型场景比如
接口后来加了
、
,如果没默认方法,JDK 升级就会让成千上万自定义集合类直接编译失败。
如何正确定义和调用 default 方法
定义时必须带
修饰符,且不能是
或
(Java 9+ 才支持
方法)。实现类可直接继承,也可选择重写。
接口中定义:
实现类使用:
调用方式和普通实例方法一样:
遇到冲突时的解决规则(最容易踩坑)
当一个类同时实现多个接口,而这些接口提供了同签名的
方法,编译器会报错,强制你明确选择——这是设计上的保护机制,不是 bug。
立即学习
“
Java免费学习笔记(深入)
”;
Eclipse导入Android或其他的JAVA项目的正确方法 WORD版
本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
下载
解决方式只有两种:
在实现类中显式重写该方法,并决定逻辑走向(哪怕只是调用某一方的
)
使用
显式调用指定接口的默认实现
例如两个接口都有
,实现类必须写:
default 方法和 static 方法、抽象方法混用的边界
方法本质是实例方法,可以访问
,也能被子接口继承;
方法属于接口本身,不能被实现类继承,只能通过接口名调用,比如
那种风格。
注意几个硬限制:
方法不能访问接口的静态字段(除非显式用
)
不能在
方法里调用未实现的抽象方法(会导致运行时
)
如果父接口有
方法,子接口可以重写它,但不能改为
(否则所有实现类立刻编译失败)
真正容易被忽略的是:default 方法在
字节
码层面仍属于接口的
实例方法,反射能拿到,但
才能准确识别它——不是靠修饰符字符串判断。
interfacedefaultCollectionstream()parallelStream()defaultstaticprivateprivate defaultpublic interface Logger {
void log(String msg);
default void info(String msg) {
log("[INFO] " + msg);
}
}public class ConsoleLogger implements Logger {
public void log(String msg) {
System.out.println(msg);
}
// 不重写 info(),就自动获得默认实现
}logger.info("startup")defaultsuperInterfaceName.super.methodName()default void close() { ... }public void close() {
SomeInterface.super.close(); // 或自己实现
}defaultthisstaticObjects.requireNonNull()defaultInterfaceName.FIELDdefaultAbstractMethodErrordefaultabstractpublicMethod.isDefault()