Java匿名内部类构造原理分析

发表于:2010-4-26 10:30

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

  很明显,我们的匿名内部类有了名字 InnerTest$1,而且是继承自 Test

class InnerTest$1 extends Test

  这个类中有一个成员final InnerTest this$0;我想这应该是该内部类所在的外部类InnerTest的引用

  这个匿名内部类的构造方法是:

InnerTest$1(InnerTest, int);

  一个是InnerTest类型,也就是该类外部类的引用,调用的时候应该是把外部类对象的this指针传给它,这样就内部类就可以直接访问外部类的成员了。

  另一个就是int类型的,应该是对i进行初始化用的。

  看到下面这行:

7: invokespecial #2; //Method Test."<init>":(I)V

  现在应该清楚了,这是调用了父类Test的构造方法。

  下面再看InnerTest是如何实现的:

  Java code

Compiled from "Main.java"
class InnerTest extends java.lang.Object{
  InnerTest();

  Code:
  0:    aload_0
  1:    invokespecial    #1; //Method java/lang/Object."<init>":()V
  4:    return

  public Test get(int);
  Code:
  0:    new    #2; //class InnerTest$1
  3:    dup
  4:    aload_0
  5:    iload_1
  6:    invokespecial    #3; //Method InnerTest$1."<init>":(LInnerTest;I)V
  9:    areturn
}

  InnerTest的get方法是关键。

  这里首先new InnerTest$1,后面调用了InnerTest$1的构造方法,并把两个参数传了进去。

  这样一切都清楚了。

  结论:其实匿名内部类也没有什么特别的地方,编译之后它有了名字,有了构造方法,就是一个正常的类了。

  有理解不对的地方,请大家指正。

22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号