Java 匿名内部类与普通接口实现类的区别
·
我常常在想匿名内部类的有名创建接口对象,和直接用一个类去implements这个接口,这俩有啥区别?不都是要重写接口里的方法,然后实现吗?
一、最直接的结论
implements 接口 + 单独类:正式、可复用、独立存在的实现类,像一个 “正式员工”。
匿名内部类(有名接口):临时、一次性、就地写的实现,像一个 “临时工 / 外包”,用完就没了。
二、代码对比
方式 1:普通类 implements 接口
// 使用
public class Test {
public static void main(String[] args) {
MyInterface obj = new MyImpl(); // 多次复用
obj.sayHello();
}
}
// 接口
interface MyInterface {
void sayHello();
}
// 单独写一个类,实现接口
class MyImpl implements MyInterface {
@Override
public void sayHello() {
System.out.println("我是正式实现类");
}
}
方式 2:匿名内部类(临时写法)
interface MyInterface {
void sayHello();
}
public class Test {
public static void main(String[] args) {
// 直接 new 接口 + 大括号重写方法
MyInterface obj = new MyInterface() {
@Override
void sayHello() {
System.out.println("我是匿名内部类");
}
};
obj.sayHello();
}
}
三、核心区别(重点)
1. 复用性(最大区别)
implements 单独类:可以到处 new、反复用,是全局可用的实现。
匿名内部类:只在当前这一处有效,别的地方想用必须重写一遍,不能复用。
2. 类的存在形式
普通实现类:有类名(如 MyImpl),编译后生成独立 .class 文件。
匿名内部类:没有类名,编译后是 外部类$1.class 这种编号类。
3. 使用场景
implements 类:逻辑复杂、要多次使用、要继承扩展、要被其他类依赖。例:Service 实现类、DAO 实现类。
匿名内部类:逻辑简单、临时、只用一次。典型场景:
四、不都是重写方法、实现接口吗?为啥要搞两种?
是的,功能上等价,但工程上完全不一样:
要长期复用、结构清晰、模块化 → 用 implements 单独类。要快速临时写个小逻辑、不想多建一个文件 / 类 → 用匿名内部类。
五、现代简化:Lambda(匿名内部类的升级版)
接口只有一个抽象方法(函数式接口)时,匿名内部类可以直接写成 Lambda:
MyInterface obj = () -> System.out.println("Lambda 极简版");
更多推荐


所有评论(0)