我常常在想匿名内部类的有名创建接口对象,和直接用一个类去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 极简版");

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐