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

Java匿名类对象类型疑问:创建的是B的子类还是B的实例?

Java匿名类实例类型解析:是B的子类还是B的实例?

嘿,这个问题问到点子上了,刚好能帮你搞清楚Java匿名内部类的底层逻辑~

核心结论

你写的这段匿名类代码,创建的是B的子类的实例,而不是B类本身的对象。

为什么是子类?

在Java中,当你使用new 父类/接口() { 重写方法 }这种语法时,本质上是在动态定义一个没有名字的子类(如果是父类的话)或者实现类(如果是接口的话),然后立刻创建这个无名类的实例。所以你这里的new B() { ... },相当于偷偷定义了一个class 无名类 extends B,然后创建了这个无名类的对象。

用反射验证的方法

你不知道怎么获取这个匿名类的Class对象?很简单,直接调用实例的getClass()方法就行,下面给你一段可运行的测试代码:

class A {
    public void doProcess(){
        System.out.println("Process from A class!");
    }
}
class B extends A {
    @Override
    public void doProcess(){
        System.out.println("Process from B class!");
    }
}

public class TestAnonymousClass {
    public static void main(String[] args) {
        // 创建匿名类实例并赋值给Object类型变量
        Object anonymousObj = new B() {
            @Override
            public void doProcess(){
                System.out.println("Process from Anonymous class");
            }
        };
        
        // 获取匿名类的Class对象
        Class<?> anonymousClazz = anonymousObj.getClass();
        
        // 打印验证信息
        System.out.println("匿名类的全限定类名:" + anonymousClazz.getName());
        System.out.println("匿名类的直接父类:" + anonymousClazz.getSuperclass().getName());
        System.out.println("匿名类是否等于B类:" + anonymousClazz.equals(B.class));
    }
}

运行结果分析

运行这段代码后,你会看到类似这样的输出:

匿名类的全限定类名:TestAnonymousClass$1
匿名类的直接父类:B
匿名类是否等于B类:false
  • 匿名类的类名是TestAnonymousClass$1:这是Java编译器自动给无名类生成的名字,格式是外部类名$数字,数字表示这个外部类里的第几个匿名类。
  • 父类是B:直接证明这个匿名类是B的子类。
  • 和B类不相等:说明它确实不是B类本身,而是一个独立的子类。

补充:为什么能赋值给A或B?

因为这个匿名子类继承自B,而B又继承自A,根据Java的多态规则,子类实例可以向上转型为父类类型,所以你可以把它赋值给A或者B类型的变量,这完全不影响它本身是B子类的事实。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:58:50