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

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

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

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

#
java
#
Java

  学Java 虽然时间不算太长,但是对一些原理性的东西很感兴趣。今天分析了一下匿名内部类调用构造方法的原理,希望高手拍砖。

  因为匿名内部类没有名字这个特殊性质,所以我们无从给它指定构造方法,构造方法必须和类名同名,类名都没有,构造方法就无从谈起了。但是匿名内部类可以通过直接调用父类的构造方法实现初始化,当然要求父类构造方法对它父类中定义的成员变量进行初始化。这里用一个例子看创建匿名内部类的时候父类的构造方法到底是如何调用的。

  Java code

public class Main {
  public static void main(String[] args) {
    InnerTest inner = new InnerTest();
    Test t = inner.get(3);
    System.out.println(t.getI());
  }
}

class Test {  //超类
private int i;
  public Test(int i) {
    this.i = i;
  }
  public int getI() {
    return i;
  }
}

class InnerTest {  //用于内部类的测试
  public Test get(int x) {
    return new Test(x) {  //创建匿名内部类,调用父类的构造方法
    @Override
      public int getI() {
        return super.getI() * 10;
      }
    }
  }
}

  编译得到4个class文件,这里只需要关注InnerTest.class 和 InnerTest$1.class。这里InnerTest$1.class是匿名内部类的class文件,InnerTest.class是InnerTest类的class文件。我们先看InnerTest$1.class的内容:

javap -c InnerTest$1 > InnerTest$1.txt

  得到代码如下 :

  Java code

Compiled from "Main.java"
class InnerTest$1 extends Test{
  final InnerTest this$0;
  InnerTest$1(InnerTest, int);

  Code:
  0:    aload_0
  1:    aload_1
  2:    putfield    #1; //Field this$0:LInnerTest;
  5:    aload_0
  6:    iload_2
  7:    invokespecial    #2; //Method Test."<init>":(I)V
  10:    return

  public int getI();
  Code:
  0:    aload_0
  1:    invokespecial    #3; //Method Test.getI:()I
  4:    bipush    10
  6:    imul
  7:    ireturn
}

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号