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
相关产品推荐
相关产品推荐

