为何无法实例化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
相关产品推荐
相关产品推荐

