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

匿名类的创建时机:每次调用封装方法时是否重复定义/加载?

关于Java匿名类的类定义复用问题

嘿,这个问题问到点子上了——很多刚接触匿名类的开发者都会混淆“类定义/加载”和“实例创建”这两个概念,我来给你掰扯清楚:

  • 核心结论:匿名类的类定义(也就是类的加载过程)只会执行一次,不管你调用多少次封装它的方法,这个类都不会被重复创建,而是会被复用。拿你举的例子来说,多次调用getAnonymousMyInterface(),只会生成同一个类,绝对不会出现两个不同的类。

具体解释:

Java编译器在处理匿名类时,会把它编译成一个形如外部类名$序号的独立class文件(比如你的外部类叫Foo,那对应的匿名类就是Foo$1.class)。当程序第一次调用getAnonymousMyInterface()时,JVM的类加载器会加载这个class文件,把类信息存入方法区;之后再调用这个方法,JVM发现类已经加载过了,就不会再重复加载或重新定义这个类。

不过要注意:每次调用方法时,会创建这个匿名类的新实例——也就是说,两次调用得到的是同一个类的不同对象,但类本身是同一个。你可以通过代码验证这一点:

public class AnonymousClassTest {
    public MyInterface getMyInterface() {
        return new MyInterface() {
            @Override
            public void execute() {
                System.out.println("匿名类实例执行");
            }
        };
    }

    public static void main(String[] args) {
        AnonymousClassTest test = new AnonymousClassTest();
        MyInterface obj1 = test.getMyInterface();
        MyInterface obj2 = test.getMyInterface();

        // 打印两个对象的类名,会看到完全一致
        System.out.println(obj1.getClass().getName());
        System.out.println(obj2.getClass().getName());
        
        // 直接比较Class对象,结果为true,证明是同一个类
        System.out.println(obj1.getClass() == obj2.getClass());
    }
}

interface MyInterface {
    void execute();
}

运行这段代码,你会发现两个对象的类名都是AnonymousClassTest$1,而且obj1.getClass() == obj2.getClass()会输出true——这就实锤了类是被复用的,只有实例是每次调用新生成的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:33:06