代码之家  ›  专栏  ›  技术社区  ›  non sequitor

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

  •  8
  • non sequitor  · 技术社区  · 16 年前

    我原本以为静态块是用于静态变量的,但编译器允许A和B编译和运行,这会带来什么?
    A.

       private static final Map<String,String> m = new HashMap<String,String>();
    
            {
                m.put("why", "does");
                m.put("this","work");
            }
    

    B

     private static final Map<String,String> m = new HashMap<String,String>();
    
            static{
                   m.put("why", "does");
                   m.put("this","work");
                 }
    

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

    {}

    B

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

    2 回复  |  直到 16 年前
        1
  •  13
  •   Community Mohan Dere    9 年前

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

    因此

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

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

    首先尝试创建一个实例

     Main main = new Main();
    

    您将看到与 B

    另见:

    Anonymous Code Blocks In Java

        2
  •  6
  •   erickson    16 年前

    在里面 A ,您有一个实例初始值设定项。它将在每次构造的新实例时执行 A. .

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