先写一个正常的写法
Map<String, String> map = new HashMap<String, String>();
map.put("name", "张三");
map.put("age", "21");
下面写一个优雅的写法
Map<String, String> map = new HashMap<String, String>() {
{
put("name", "张三");
put("age", "21");
}
};
这个时候打印map输出的结果是一样的都是
{age=21, name=张三}
此时我们将优雅写法的代码做一下反编译,得到两个class文件
Test$1.class
Test.class
分别看一下这两个文件里的代码
1、首先为Test.class
public class Test
{
public static void main(String[] args)
{
Map map = new HashMap()
{
};
}
}
2、再看Test$1.class
class Test$1 extends HashMap<String, String>
{
Test$1()
{
put("name", "张三");
put("age", "21");
}
}
至此我们发现,其实JAVA的编译器,将所谓的优雅的写法编译成了一个新的类,此类在构造函数初始化的时候调用了put方法,但是好像上面的编译结果两个class文件并没有任何的联系
那么我们将自己的代码做如下修改,便于更好的理解代码内容
public class Test {
public static void main(String[] args) {
Map<String, String> map = new Test$1();
System.out.println(map);
}
}
class Test$1 extends HashMap<String, String> {
Test$1() {
put("name", "张三");
put("age", "21");
}
}
此时你再反编译一下,你就会发现得到的class文件里的内容是一模一样的(这里就不做反编译了!)
其实就是创建一个新的类,继承HashMap,然后调用该类构造函数的时候调用put方法就可以了
还记得当初看这个问题的时候,那位博主讲到了代码块的执行顺序,此时发现和代码块的执行顺序没有任何的关系。