内部类引用局部变量与外部类成员变量的问题思考

发表于:2011-11-28 09:21

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

 作者:上善若水    来源:51Testing软件测试网采编

  • // Compiled from Printer.java (version 1.6 : 50.0, super bit) 
  •  class levin.test.anonymous.MyApplication { 
  •     
  •    // Field descriptor #6 I 
  •    private int field;    
  •    // Method descriptor #8 ()V 
  •    // Stack: 2, Locals: 1 
  •    MyApplication(); 
  •       0  aload_0 [this
  •       1  invokespecial java.lang.Object() [10
  •       4  aload_0 [this
  •       5  bipush 10 
  •       7  putfield levin.test.anonymous.MyApplication.field : int [12
  •      10  return 
  •        Line numbers: 
  •          [pc: 0, line: 7
  •          [pc: 4, line: 8
  •          [pc: 10, line: 7
  •        Local variable table: 
  •          [pc: 0, pc: 11] local: this index: 0 type: levin.test.anonymous.MyApplication 
  •     
  •    // Method descriptor #19 (Ljava/lang/Integer;)V 
  •    // Stack: 6, Locals: 7 
  •    public void print(java.lang.Integer param); 
  •       0  ldc2_w <Long 100> [20
  •       3  lstore_2 [local] 
  •       4  aload_1 [param] 
  •       5  invokevirtual java.lang.Integer.longValue() : long [22
  •       8  ldc2_w <Long 100> [20
  •      11  ladd 
  •      12  lstore 4 [local2] 
  •      14  new levin.test.anonymous.MyApplication$1 [28
  •      17  dup 
  •      18  aload_0 [this
  •      19  lload 4 [local2] 
  •      21  aload_1 [param] 
  •      22  invokespecial levin.test.anonymous.MyApplication$1(levin.test.anonymous.MyApplication, long, java.lang.Integer) [30
  •      25  astore 6 [printer] 
  •      27  aload 6 [printer] 
  •      29  invokeinterface levin.test.anonymous.Printer.print() : void [33] [nargs: 1
  •      34  return 
  •        Line numbers: 
  •          [pc: 0, line: 11
  •          [pc: 4, line: 12
  •          [pc: 14, line: 13
  •          [pc: 27, line: 22
  •          [pc: 34, line: 23
  •        Local variable table: 
  •          [pc: 0, pc: 35] local: this index: 0 type: levin.test.anonymous.MyApplication 
  •          [pc: 0, pc: 35] local: param index: 1 type: java.lang.Integer 
  •          [pc: 4, pc: 35] local: local index: 2 type: long 
  •          [pc: 14, pc: 35] local: local2 index: 4 type: long 
  •          [pc: 27, pc: 35] local: printer index: 6 type: levin.test.anonymous.Printer 
  •    // Method descriptor #45 (Llevin/test/anonymous/MyApplication;)I 
  •    // Stack: 1, Locals: 1 
  •    static synthetic int access$0(levin.test.anonymous.MyApplication arg0); 
  •      0  aload_0 [arg0] 
  •      1  getfield levin.test.anonymous.MyApplication.field : int [12
  •      4  ireturn 
  •        Line numbers: 
  •          [pc: 0, line: 8
  •   
  •    Inner classes: 
  •      [inner class info: #28 levin/test/anonymous/MyApplication$1, outer class info: #0 
  •       inner name: #0, accessflags: 0 default
  •  }
  •   从这两段字节码中可以看出,编译器为我们的匿名类起了一个叫MyApplication$1的名字,它包含了三个final字段(这里synthetic修饰符是指这些字段是由编译器生成的,它们并不存在于源代码中):

      MyApplication的应用this$0

      long值val$local2

      Integer引用val$param

    32/3<123>
    《2023软件测试行业现状调查报告》独家发布~

    关注51Testing

    联系我们

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

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

    沪ICP备05003035号

    沪公网安备 31010102002173号