Java中的内部类实例初始化匿名函数(JLS7 8.6:Instance Initializers)

放肆的年华 提交于 2020-03-02 15:24:25

偶尔发现了一段好玩的java代码,关于Java内部类的,觉得很有意思,但是想不明白这段代码是java语法的特性哪?还是别的什么。最后发现还是对java了解的不够深啊。先上代码:

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

public class Main {

	public static void main(String[] args) {
		List<String> lst = new ArrayList<String>() {
			@Override
			public boolean add(String paramE) {
				return super.add("LST-" + paramE);
			}

			{
				add("a");
				add("45");
				add("a");
				add("asdfs");
			}
		};
		
		for (String str : lst) {
			System.out.println(str);
		}
	}
}


最后多谢@brayden的解答,查看了JLS定义中的Instance Initializers,了解到这个是Java语法标准。顺便我反编译了一下,生成的代码,下面这段匿名方法最终会编译到这个内部类的构造函数中。

{
    add("a");
    add("45");
    add("a");
    add("asdfs");
}


其实看看反编译后的代码就都明白了:

Main.class

import java.io.PrintStream;
import java.util.ArrayList;


public class Main
{
  public static void main(String[] paramArrayOfString)
  {
    ArrayList local1 = new ArrayList()
    {
      public boolean add(String paramAnonymousString) {
        return super.add("LST-" + paramAnonymousString);
      }
    };
    for (String str : local1)
      System.out.println(str);
  }
}
Main$1内部类
import java.util.ArrayList;


final class Main$1 extends ArrayList<String>
{
  Main$1()
  {
    add("a");
    add("45");
    add("a");
    add("asdfs");
  }

  public boolean add(String paramString)
  {
    return super.add("LST-" + paramString);
  }
}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!