据我所知,"静态初始化块"用于设置静态字段的值,如果不能在一行中完成的话.
但我不明白为什么我们需要一个特殊的块.例如,我们将一个字段声明为静态(没有值赋值).然后编写几行代码,生成并为上面声明的静态字段赋值.
为什么我们需要在一个特殊的块这样的行这样的:static {...}
?
java static initialization static-block initialization-block
所以我最近一直在研究我的Java技能,并且发现了一些我之前不知道的功能.静态和实例初始化器是两种这样的技术.
我的问题是什么时候会使用初始化程序而不是在构造函数中包含代码?我想到了几个明显的可能性:
static/instance initializers可用于设置"final"静态/实例变量的值,而构造函数则不能
静态初始化程序可用于设置类中任何静态变量的值,这应该比在每个构造函数的开头具有"if(someStaticVar == null)// do stuff"代码块更有效
这两种情况都假设设置这些变量所需的代码比简单的"var = value"更复杂,否则似乎没有任何理由使用初始化器而不是在声明变量时简单地设置值.
然而,虽然这些并非微不足道的收益(特别是设置最终变量的能力),但似乎应该使用初始化程序的情况相当有限.
当然可以在构造函数中使用初始化器来完成很多工作,但我真的没有看到这样做的原因.即使一个类的所有构造函数共享大量代码,使用私有initialize()函数似乎比使用初始化程序更有意义,因为它不会阻止您在编写新代码时运行该代码构造函数.
我错过了什么吗?是否还有许多其他情况需要使用初始化程序?或者它是否真的只是在非常具体的情况下使用的相当有限的工具?
java constructor initializer static-initializer initialization-block
我们可以将代码放在构造函数或方法或初始化块中.初始化块有什么用?每个java程序都必须拥有它吗?
可能重复:
静态初始化块
请考虑以下代码:
public class Test {
{
System.out.println("Empty block");
}
static {
System.out.println("Static block");
}
public static void main(String[] args) {
Test t = new Test();
}
}
Run Code Online (Sandbox Code Playgroud)
我们知道首先执行静态块,然后执行空块.但问题是我从来没有能够理解空块的实际效用.任何人都可以展示一个真实的例子 -
在我之前的问题Java 类和静态块的上下文中,如果我将代码从静态块和变量更改为正常的实例初始化块和实例变量会怎样。现在代码将如何执行?
class extra3 {
public static void main(String string[]) {
Hello123 h = new Hello123();
System.out.println(h.a);
}
}
class Hello123 {
{
a=20;
}
int a=158;
}
Run Code Online (Sandbox Code Playgroud)
这里我得到的输出为 158。我无法理解这里的原因。其他代码是这样的:
class extra3 {
public static void main(String string[]) {
Hello123 h = new Hello123();
System.out.println(h.a);
}
}
class Hello123 {
int a=158;
{
a=20;
}
}
Run Code Online (Sandbox Code Playgroud)
这里的输出是 20,这是可以接受的,因为创建对象时首先执行实例块。但是为什么第一个代码的输出是 158 呢?
我对实时初始化块应该运行的时间感到困惑.根据凯西塞拉的书:
每次创建类实例时都会运行实例初始化块
因此,根据这个问题和java的文档,考虑有两个类:父母和孩子:
实例化子类对象只创建子类类型的1个对象,但调用其所有超类的构造函数.
根据以上所述: 为什么每次实例化子类的对象时都会调用位于超类中的实例初始化块?它不像是超实例的新对象被实例化.