我最初认为静态块是静态变量,但编译器允许A和B编译和运行,是什么给出的?
一个
private static final Map<String,String> m = new HashMap<String,String>();
{
m.put("why", "does");
m.put("this","work");
}
Run Code Online (Sandbox Code Playgroud)
乙
private static final Map<String,String> m = new HashMap<String,String>();
static{
m.put("why", "does");
m.put("this","work");
}
Run Code Online (Sandbox Code Playgroud)
运行System.out.println(Main.m.toString());了一个打印
{}
但在Yoda-speak中为B打印出同样的效果
{this = work,why = does}
Osc*_*Ryz 13
当创建类的"实例"时,执行非静态块.
从而
System.out.println(Main.m.toString());
Run Code Online (Sandbox Code Playgroud)
没有打印,因为你还没有创建实例.
首先尝试创建实例
Main main = new Main();
Run Code Online (Sandbox Code Playgroud)
你会看到与B相同的信息
如您所知,使用实例块时,类变量(使用static声明)在范围内.
也可以看看:
在A,您有一个实例初始化程序.它将在每次构造新实例时执行A.
如果多个线程正在构造A实例,则此代码将中断.即使在单个线程中,您通常也不希望单个实例修改每个实例共享的状态.但如果你这样做,这是实现它的一种方法.
| 归档时间: |
|
| 查看次数: |
3107 次 |
| 最近记录: |