代码之家  ›  专栏  ›  技术社区  ›  missingfaktor Kevin Wright

方法中的匿名内部类

  •  6
  • missingfaktor Kevin Wright  · 技术社区  · 15 年前

    请查看以下代码:

    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来处理?我的意思是,Java究竟是如何跟踪对作为该方法的参数传递的对象的引用的?

    任何帮助都将不胜感激!

    [为我糟糕的英语道歉!如果你理解我的问题,请编辑这篇文章并删除语法错误。谢谢!]

    2 回复  |  直到 15 年前
        1
  •  9
  •   TofuBeer    15 年前

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

    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);
         }
    
        2
  •  5
  •   Nikit Batale    15 年前
    import java.util.ArrayList;
    import java.util.List;
    
    class Main{
        public static <T> List<T> modifiedList(final List<T> list){
             return new ArrayList<T>(){
    
                 private List<T> originalList=list;
    
                 @Override
                 public boolean add(T element){
                     super.add(element);
                     return originalList.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);       
         }
     }
    

    Java允许这样一个奇怪的东西,只是为了让程序员更容易。 这两个代码在语义上是相同的,并归结为相同的字节码。

    推荐文章