You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

子类接口能否调用父接口默认方法?匿名类方法调用指向解析

关于接口继承与匿名类中默认方法调用的问题

先直接给你明确结论,再一步步拆解细节:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:59:45