为什么这段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
相关产品推荐
相关产品推荐

