A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

如这篇文章:http://android.blog.51cto.com/268543/384809 所示,通过反编译内部类的class文件,可知局部内部类只能访问final修饰的局部变量的原因。

下面是我自己动手试验:
  1. package com.cn.itcast;

  2. public class OuterTest {
  3.         public static void main(String[] args) {
  4.                 new Outer().method(4);
  5.         }

  6. }
  7. class Outer{
  8.         private int i=3;
  9.                
  10.         public void method(final int y){
  11.                 final int beep=12;
  12.                 class Inner{
  13.                         public void function(){
  14.                                 System.out.println(i);
  15.                                 System.out.println(beep);
  16.                                 System.out.println(y);
  17.                         }
  18.                 }
  19.                 new Inner().function();
  20.         }
  21. }
复制代码
对于上述代码编译后产生的内部类字节码Outer$1Inner.class,进行反射,得到反编译代码如下:
  1. class com.cn.itcast.Outer$1Inner
  2. {
  3.     com.cn.itcast.Outer$1Inner(com.cn.itcast.Outer,int);

  4.    public void function();

  5.    final com.cn.itcast.Outer this$0;
  6.    private final int val$y;
  7. }
复制代码
我的疑问是:
为什么只有处于方法参数的局部变量y,内部类编译时产生了一个备份用的变量val$y;而处于方法内的局部变量beep却没有?



PS:反射的代码见参考文章的附件。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马