繁体   English   中英

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

[英]On static and non-static initializing blocks in Java

我最初认为静态块是静态变量,但编译器允许A和B编译和运行,是什么给出的?
一个

   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");
             }

运行System.out.println(Main.m.toString()); 对于A打印

{}

但在Yoda-speak中为B打印出同样的效果

{this = work,why = does}

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

从而

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

没有打印,因为你还没有创建实例。

首先尝试创建实例

 Main main = new Main();

你会看到与B相同的信息

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

也可以看看:

Java中的匿名代码块

A ,您有一个实例初始化程序。 每次构造A的新实例时都会执行它。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM