List<String> list = new ArrayList<String>(){ { add("hello"); remove(0); } };
map = new HashMap<String, Object>(){ { put("name","123"); } };
请问这个语法是来自 Java 几?他的原理又是什么?一个大括号我知道是匿名内部类,但是里面的大括号不知道是什么意思??
光阴似箭催人老,日月如移越少年。
这种语法叫做Java的动态初始化块。
它是包含在某个类里面一个大括号中的代码片段,在类实例化时自动调用。
例如:
class Person { {System.out.print(123);} }
那么在调用new Person()时就会打印出123。
new Person()
123
至于你问题中的代码,只不过那个动态初始化块放到了一个匿名类中,所以看起来有点奇怪、不太好理解。但是,毕竟匿名类也是类啊,所以是合法的。结果就是在那个匿名类被实例化的时候,那段代码执行了,集合中放进去了几个元素,相当于初始化了集合。
至于从Java哪个版本开始支持的,我没有查记不清了,但是估计很早就支持了,只是从Java 5就应该支持了。
最后说一句,用这种方式初始化集合,看起来像黑魔法。
另外,还可以去查一下静态初始化块,比较一下它们的区别。
里面的大括号是初始化块,会在new时构造器调用之间执行
大括号里不是匿名内部类,而是构造代码块,貌似在构造方法之前执行的(记得不是很清楚了),我把它看成和构造方法一样的东东。
这种语法叫做Java的动态初始化块。
它是包含在某个类里面一个大括号中的代码片段,在类实例化时自动调用。
例如:
那么在调用
new Person()
时就会打印出123
。至于你问题中的代码,只不过那个动态初始化块放到了一个匿名类中,所以看起来有点奇怪、不太好理解。但是,毕竟匿名类也是类啊,所以是合法的。结果就是在那个匿名类被实例化的时候,那段代码执行了,集合中放进去了几个元素,相当于初始化了集合。
至于从Java哪个版本开始支持的,我没有查记不清了,但是估计很早就支持了,只是从Java 5就应该支持了。
最后说一句,用这种方式初始化集合,看起来像黑魔法。
另外,还可以去查一下静态初始化块,比较一下它们的区别。
里面的大括号是初始化块,会在new时构造器调用之间执行
大括号里不是匿名内部类,而是构造代码块,貌似在构造方法之前执行的(记得不是很清楚了),我把它看成和构造方法一样的东东。