我发现在Java语言中,有一个叫做static block
的特性,它包含了在第一次加载一个类时执行的代码(我不明白“加载”是什么意思,它是指初始化的吗?)有没有理由在静态块中而不是在构造函数中进行初始化?我的意思是,即使构造函数也做同样的事情,当一个类第一次被初始化时,做所有必要的事情。静态块有没有什么构造函数做不到的事情呢?
发布于 2012-12-22 01:58:52
在创建类的实例时调用构造函数。
静态块在类加载器加载这个类定义时被调用,这样我们就可以初始化这个类的静态成员。我们不应该从构造函数初始化静态成员,因为它们是类定义的一部分,而不是对象
发布于 2012-12-22 03:39:56
如果我们初始化一个类,静态初始化器就会运行,这不需要我们实例化一个类。但构造函数只有在我们创建类的实例时才会运行。
例如:
class MyClass
{
static
{
System.out.println("I am static initializer");
}
MyClass()
{
System.out.println("I am constructor");
}
static void staticMethod()
{
System.out.println("I am static method");
}
}
如果我们运行:
MyClass.staticMethod();
输出:
I am static initializer
I am static method
我们从未创建过实例,所以构造函数不会被调用,但会调用静态初始化器。
如果我们创建一个类的实例,静态初始化器和构造函数都会运行。没什么好惊讶的。
MyClass x = new MyClass();
输出:
I am static initializer
I am constructor
请注意,如果我们运行:
MyClass x;
输出:(空)
声明变量x
不需要初始化MyClass
,因此静态初始化器不会运行。
发布于 2012-12-22 01:58:42
这是两件不同的事情。使用构造函数初始化类的一个实例时,静态初始化块在加载该类时初始化静态成员。
https://stackoverflow.com/questions/13994950
复制相似问题