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

为何无法实例化Interface类型?new Runnable()语法为何合法?

为什么不能直接实例化接口,但new Runnable() { ... }却合法?

你提的这个问题很典型,很多刚接触Java接口的开发者都会有这个疑惑,我来给你拆解清楚:

首先明确一个核心规则:接口本身确实不能被直接实例化。比如你单独写一行Runnable r = new Runnable();,编译器一定会报错——因为接口是完全抽象的,它只定义了方法的签名,没有具体实现,JVM根本不知道要创建一个什么样的对象出来。

那你代码里的new Runnable() { ... }为什么不报错?因为这不是在实例化Runnable接口,而是在做两件事:

  • 第一步:定义一个匿名内部类——这个类没有名字,但它实现了Runnable接口,并且在大括号里提供了run()方法的具体实现。
  • 第二步:立刻实例化这个匿名内部类——把这个刚定义的匿名类的对象,赋值给Runnable类型的引用(这是Java多态的体现:父类型引用可以指向子类型对象)。

举个更直观的对比,你代码里的写法等价于下面这种显式定义类的写法,只是把类的定义和实例化合并成了一行:

// 显式定义一个实现Runnable的类
class MyRunnable implements Runnable {
    @Override
    public void run() {
        // 你的业务逻辑
        try {
            frame = new Library();
            frame.setVisible(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

// 然后实例化这个类
EventQueue.invokeLater(new MyRunnable());

这种匿名内部类的写法在Java里非常常见,尤其是在需要临时提供一个接口实现的场景(比如事件回调、线程任务),它能帮你省去单独定义类的繁琐,让代码更紧凑。

内容的提问来源于stack exchange,提问作者Squeez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:52:03