java - 匿名内部类内部方法

标签 java anonymous-inner-class

请看下面的代码:

import java.util.ArrayList;
import java.util.List;

class Main{
     public static <T> List<T> modifiedList(final List<T> list){
         return new ArrayList<T>(){
            @Override
             public boolean add(T element){
                 super.add(element);
                 return list.add(element);
             }
         };
    }

     public static void main(String[] args) {
         List<String> originalList=new ArrayList<String>();
         List<String> 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);
     }

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

谁能解释一下 Java 在字节码级别是如何处理这些局部变量绑定(bind)的?我的意思是,Java 究竟如何跟踪作为参数传递给该方法的对象的引用?

如有任何帮助,我们将不胜感激!

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

最佳答案

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

class Main$1<T>
    extends ArrayList<T>
{
    private final List<T> list;

    Main$1(final List<T> a)
    {
        list = a;
    }

    @Override
    public boolean add(T element)
    {
        super.add(element);
        return list.add(element);
    }
}

class Main{
     public static <T> List<T> modifiedList(final List<T> list)
     {
         return new Main$1<T>(list);
     }

     public static void main(String[] args) 
     {
         List<String> originalList=new ArrayList<String>();
         List<String> 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 - 匿名内部类内部方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1950807/

相关文章:

java - 应用程序上下文中用于可缓存注释的类 bean

java - 如何在android中的Hashmap中传递网站的url

java - 当对象碰到边界时如何更改对象的大小?

java - new Test() 和 new Test() { } 的区别

java - 匿名内部类 - 表达式的非法开始

java - 单括号java正则表达式

3D 场景中具有背景的 JavaFX 2D 文本

java - 我如何获取这个参数?

java - 匿名类和父类之间的循环依赖是错误的吗?

java - 克服匿名类中的最终变量