Java中的静态和非静态初始化块
为什么此代码打印的是Java中的静态和非静态初始化块,java,Java,为什么此代码打印的是11,而不是10。显然,执行静态初始化块中的i++。 但是,为什么不执行非静态块中的i--。 这里发生了什么事 一类 { 静态积分i=10; { 我--; } } 公共类Main扩展了ClassOne { 静止的 { i++; } 公共静态void main(字符串[]args) { 系统输出打印LN(i); } } 创建实例时将调用非静态初始化块 您从不创建新实例,因此不会执行块。这与实例初始值设定项块和静态初始值设定项块特别相关。在上面的示例中,带有i--的块是实例初始值
11
,而不是10
。显然,执行静态初始化块中的i++
。但是,为什么不执行非静态块中的
i--
。这里发生了什么事
一类
{
静态积分i=10;
{
我--;
}
}
公共类Main扩展了ClassOne
{
静止的
{
i++;
}
公共静态void main(字符串[]args)
{
系统输出打印LN(i);
}
}
创建实例时将调用非静态初始化块
您从不创建新实例,因此不会执行块。这与实例初始值设定项块和静态初始值设定项块特别相关。在上面的示例中,带有
i--
的块是实例初始值设定项块,每次创建Main或ClassOne的新实例时都将执行该块
静态初始化程序块在类加载时执行。所以,当主类被加载到内存中时,它的父类首先被加载,然后变量也被加载到内存中。此后,将执行Main中的静态块,从而在控制台上打印11。无论如何,请不要使用实例初始化块。许多人甚至不知道它们的存在,在代码中找到它们是非常令人困惑的。只需使用常规构造函数或字段初始化即可。永远不要说“永不”。它们有合法(但很少)的用途。