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

为什么这段Java代码看起来可以实例化Java接口?

代码逻辑说明

Java确实不允许直接实例化接口,你看到的new I() { ... } 根本不是在实例化接口I,这是Java提供的匿名内部类语法糖,实际逻辑拆解开非常好懂:

  • 编译阶段,javac会自动生成一个没有显式命名的类,这个类实打实实现了I接口,重写了你在大括号里定义的a()、b()两个方法。编译完你去看class输出目录,除了你自己写的I.class、C.class,还会多一个类似C$1.class的文件,这就是编译器自动生成的匿名实现类的字节码。
  • 代码里的new I() { ... }本质是new了这个自动生成的匿名实现类的实例,和接口实例化没有任何关系。表达式外层包裹的那层小括号完全是多余的,删掉也不影响程序运行。
  • 把这个实例赋值给I类型的变量i,是最普通的Java多态用法:接口类型的引用可以指向任何实现了该接口的类的实例。后面调用i.a()、i.b()的时候,实际执行的就是你在大括号里写的方法逻辑,所以断言i.a()==1 && i.b()==2可以正常通过。

这种写法的核心作用是简化代码:如果某个接口的实现只在当前位置用一次、不需要复用,就没必要专门单独写一个具名的实现类,直接用匿名内部类写在使用位置即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 19:01:29