Java中的实例初始化块

该文章发布于 ,归类于 Java 0 条评论

如下代码示例

public class Hello {
    private static final Map<Integer, String> map = new HashMap<Integer, String>() {
        {
            put(0, "first");
            put(1, "second");
            put(2, "third");
        }
    };
}

这种初始化HashMap的方法怎么和平常不一样,双花括号是什么鬼?

如果你知道匿名内部类,那么你肯定知道new HashMap(){}这是匿名内部类的写法,那么第一层意思就明晰了,然后再看第二层,里面的花括号是什么意思?

再看一下如下的一段代码,可能就大概了解了。

public class Hello {
    static {
        System.out.println("静态代码块");
    }

    {
        System.out.println("初始化块");
    }
}

一个类里面可以添加静态代码块,还可以添加实例代码块,第一个static修饰的就是静态代码块,第二则为实例代码块。

再来看一下它们的执行顺序。

public class Hello {

    static {
        System.out.println("静态代码块");
    }

    {
        System.out.println("初始化块");
    }

    public Hello() {
        System.out.println("构造方法");
    }

    public static void main(String[] args) {
        new Hello();
        System.out.println("***************");
        new Hello();
    }
}

输出的结果为

静态代码块
初始化块
构造方法
***************
初始化块
构造方法

可以看到,static修饰的静态代码块只执行了一次,而实例代码块每次新建实例都会被执行一次,顾名思义,实例代码块肯定是与实例相关的嘛,所以才会每次实例化后都被执行。另外,不管是实例代码块,还是静态代码块,都是在构造函数执行之前得到执行的。

所以,再回到上面的第一段代码,就会发现,原来这就是用来初始化一个HashMap,并且在每次实例化之前,都向HashMap中的添加一些内容,大概就是这样子了。

相关文章