子类接口能否调用父接口默认方法?匿名类方法调用指向解析
关于接口继承与匿名类中默认方法调用的问题
先直接给你明确结论,再一步步拆解细节:
1. 子接口能不能调用父接口的默认方法?
接口本身没法实例化,所以不能直接执行方法,但子接口的实现类(包括匿名类)完全可以调用父接口的默认方法——要么直接继承使用,要么通过显式指定父接口的super来精准调用。
举个基础示例:
// 父接口A interface A { default void doSomeWork() { System.out.println("A的默认实现"); } } // 子接口B继承A interface B extends A { void doWork(); // 抽象方法,需要实现类来完成 }
2. 匿名类doWork里的doSomeWork()调用指向谁?
你提到的“用.调用”如果是指直接写doSomeWork(),那调用指向的规则很清晰:
- 如果子接口B重写了父接口A的
doSomeWork默认方法,匿名类里的调用会优先使用B的实现; - 如果B没有重写,则会自动继承A的默认方法,调用的就是A的实现。
要是匿名类自己也重写了doSomeWork,那调用的就是匿名类自身的实现——毕竟实现类的重写优先级是最高的。
另外,如果你想强制跳过子接口的实现,直接调用父接口A的默认方法(哪怕B已经重写了),可以在匿名类里这么写:
B b = new B() { @Override public void doWork() { A.super.doSomeWork(); // 明确指定调用A的默认方法 } };
最后给你总结个优先级规则,方便记忆:
实现类自身的方法 > 子接口的默认方法 > 父接口的默认方法
完整代码验证示例
interface A { default void doSomeWork() { System.out.println("A's default"); } } interface B extends A { // 注释/放开这行,观察输出变化 default void doSomeWork() { System.out.println("B's default"); } void doWork(); } public class Test { public static void main(String[] args) { B b = new B() { @Override public void doWork() { doSomeWork(); // 核心调用位置 } }; b.doWork(); } }
- 当B重写
doSomeWork时,输出B's default; - 当B不重写时,输出
A's default; - 若匿名类内也重写
doSomeWork,则输出匿名类的自定义实现。
内容的提问来源于stack exchange,提问作者Bissi singh
相关产品推荐
相关产品推荐

