Java中静态和非静态初始化块的研究

Java中静态和非静态初始化块的研究,java,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 m=ne

我原本以为静态块是用于静态变量的,但编译器允许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 m=new HashMap();
{
m、 放置(“为什么”、“做”);
m、 把(“这”、“工作”);
}
B

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

        static{
               m.put("why", "does");
               m.put("this","work");
             }
private static final Map m=new HashMap();
静止的{
m、 放置(“为什么”、“做”);
m、 把(“这”、“工作”);
}
运行
System.out.println(Main.m.toString())用于A打印

{}

但是对B运行相同的命令会在Yoda speak中打印出来

{这=工作,为什么=做}


A
中,有一个实例初始值设定项。每次构造
a
的新实例时,都将执行该命令


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

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

因此

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

首先尝试创建一个实例

 Main main = new Main();
您将看到与B

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

        static{
               m.put("why", "does");
               m.put("this","work");
             }
正如您所知,当使用实例块时,类变量(使用static声明)在范围内

另见:


Erickson是正确的-创建一个新实例,它们将是等效的。如果你改变这些键的值,然后创建另一个新的实例,它们将再次被原始值替换。这是完美的逻辑意义有静态和非静态块的替代品吗?