内部方法中的匿名内部类

请看下面的代码:

import java.util.ArrayList; import java.util.List; class Main{ public static  List modifiedList(final List list){ return new ArrayList(){ @Override public boolean add(T element){ super.add(element); return list.add(element); } }; } public static void main(String[] args) { List originalList=new ArrayList(); List duplicateList=modifiedList(originalList); originalList.add("1"); originalList.add("2"); originalList.add("3"); System.out.println(originalList+" "+duplicateList); duplicateList.add("4"); duplicateList.add("5"); duplicateList.add("6"); System.out.println(originalList+" "+duplicateList); } 

在上面的代码中,在modifyList()方法中声明的匿名内部类的实例能够访问传递给该方法的参数。 AFAIK Java为内部类创建单独的字节码文件。

任何人都可以解释Java在字节码级别如何处理这些局部变量绑定? 我的意思是,Java如何跟踪作为参数传递给该方法的对象的引用?

任何帮助将不胜感激!

[抱歉我的英语不好! 如果您理解我的问题,请编辑此帖并删除语法错误。 谢谢!]

基本上代码由编译器重写(注意我没有尝试编译它……,可能有错误):

 class Main$1 extends ArrayList { private final List list; Main$1(final List a) { list = a; } @Override public boolean add(T element) { super.add(element); return list.add(element); } } 

 class Main{ public static  List modifiedList(final List list) { return new Main$1(list); } public static void main(String[] args) { List originalList=new ArrayList(); List duplicateList=modifiedList(originalList); originalList.add("1"); originalList.add("2"); originalList.add("3"); System.out.println(originalList+" "+duplicateList); duplicateList.add("4"); duplicateList.add("5"); duplicateList.add("6"); System.out.println(originalList+" "+duplicateList); } 
 import java.util.ArrayList; import java.util.List; class Main{ public static  List modifiedList(final List list){ return new ArrayList(){ private List originalList=list; @Override public boolean add(T element){ super.add(element); return originalList.add(element); } }; } public static void main(String[] args) { List originalList=new ArrayList(); List duplicateList=modifiedList(originalList); originalList.add("1"); originalList.add("2"); originalList.add("3"); System.out.println(originalList+" "+duplicateList); duplicateList.add("4"); duplicateList.add("5"); duplicateList.add("6"); System.out.println(originalList+" "+duplicateList); } } 

Java允许这样一个奇怪的事情,以便让程序员更容易。 两个代码在语义上都相同,并归结为相同的字节码。