关于Java中的静态和非静态初始化块

时间:2009-10-15 20:41:26

标签: java

我原本以为静态块是静态变量,但是编译器允许A和B编译和运行,这给出了什么? 的 A

   private static final Map<String,String> m = new HashMap<String,String>();

        {
            m.put("why", "does");
            m.put("this","work");
        }

 private static final Map<String,String> m = new HashMap<String,String>();

        static{
               m.put("why", "does");
               m.put("this","work");
             }

A 打印

运行System.out.println(Main.m.toString());
  

{}

但在 B 中运行相同的内容会在Yoda-speak

中打印出来
  

{this = work,why = does}

2 个答案:

答案 0 :(得分:13)

创建类的“实例”时执行非静态块。

因此

System.out.println(Main.m.toString());

没有打印任何内容,因为您尚未创建实例。

首先尝试创建实例

 Main main = new Main();

,您会看到与 B

相同的消息

如您所知,使用实例块时,类变量(使用static声明)在范围内。

另见:

Anonymous Code Blocks In Java

答案 1 :(得分:6)

A中,您有一个实例初始值设定项。每次构造A的新实例时都会执行它。

如果多个线程正在构建A个实例,则此代码将中断。即使在单个线程中,您通常也不希望单个实例修改每个实例共享的状态。但如果你这样做,这是实现它的一种方法。