接口是否提供完全抽象?Java 8引入default方法后该如何理解?
好问题!答案是肯定的——Java 8引入default方法之后,接口依然可以提供完全抽象的能力,这一点并没有改变,核心逻辑可以拆解成这几点来看:
完全抽象的接口依然合法且常用
你完全可以定义一个没有任何default或static方法的接口,所有方法都是抽象的(接口方法默认就是abstract,不需要显式声明),这样的接口和Java 8之前的完全抽象接口毫无区别。比如:public interface PurelyAbstract { void executeTask(); String transformInput(String rawData); }实现这个接口的类必须重写所有抽象方法,没有任何默认实现可以依赖,这就是标准的完全抽象契约模式。
default方法是可选增强,不是强制要求
Java 8引入default方法的初衷是为了给现有接口添加新功能,同时不破坏已有的实现类(比如集合框架里Iterable接口新增的forEach方法)。它只是给接口增加了可选的具体实现能力,但你完全可以选择不用这个特性。
就算你在接口里定义了default方法,也不影响你同时保留抽象方法——甚至你可以只定义抽象方法,完全忽略default和static方法,让接口保持100%抽象。区分“允许有具体方法”和“必须有具体方法”
很多人会误以为Java 8之后接口就不能完全抽象了,其实是混淆了“允许有”和“必须有”。接口的核心本质是定义契约,default方法只是给契约增加了可选的默认实现,并没有改变契约本身的抽象性。
另外要注意,抽象类和接口的核心区别依然存在:抽象类可以有实例变量、构造方法,而接口只能有public static final常量;抽象类是单继承,接口是多实现——这些特性和是否使用default方法无关。
内容的提问来源于stack exchange,提问作者SbrTa

