【发布时间】:2011-02-25 23:29:03
【问题描述】:
前几天我正在查看一些代码,结果发现:
static {
...
}
来自 C++,我不知道为什么会出现这种情况。它不是错误,因为代码编译得很好。这个“静态”代码块是什么?
【问题讨论】:
前几天我正在查看一些代码,结果发现:
static {
...
}
来自 C++,我不知道为什么会出现这种情况。它不是错误,因为代码编译得很好。这个“静态”代码块是什么?
【问题讨论】:
这是一个static initializer。它在类加载(或初始化,准确地说,但您通常不会注意到差异)时执行。
可以认为是“类构造函数”。
请注意,还有instance initializers,它们看起来相同,只是它们没有static 关键字。当创建对象的新实例时,这些代码会在构造函数中的代码之外运行。
【讨论】:
这是一个代码块,当类被类加载器加载时执行。它旨在对类的静态成员进行初始化。
也可以编写非静态初始化器,看起来更奇怪:
public class Foo {
{
// This code will be executed before every constructor
// but after the call to super()
}
Foo() {
}
}
【讨论】:
它是一个静态初始化器。它在类加载时执行,是放置静态变量初始化的好地方。
来自http://java.sun.com/docs/books/tutorial/java/javaOO/initial.html
一个类可以有任意数量的静态初始化块,它们可以出现在类主体的任何地方。运行时系统保证静态初始化块按照它们在源代码中出现的顺序被调用。
如果你有一个带有静态查找图的类,它可能看起来像这样
class MyClass {
static Map<Double, String> labels;
static {
labels = new HashMap<Double, String>();
labels.put(5.5, "five and a half");
labels.put(7.1, "seven point 1");
}
//...
}
这很有用,因为上述静态字段无法使用labels = ... 进行初始化。它需要以某种方式调用 put-method。
【讨论】:
静态块用于初始化代码,将在 JVM 加载类时执行。请参阅下面的链接,其中给出了详细说明。 http://www.jusfortechies.com/java/core-java/static-blocks.php
【讨论】:
一个静态块在任何程序的生命周期中执行一次, 静态块的另一个特性是它在 main 方法之前执行。
【讨论】:
静态块也可以用来表明程序可以在没有主函数的情况下运行。
//static block
//static block is used to initlize static data member of the clas at the time of clas loading
//static block is exeuted before the main
class B
{
static
{
System.out.println("Welcome to Java");
System.exit(0);
}
}
【讨论】:
是的,静态块用于初始化代码,它将在 JVM 开始执行时加载。
在以前的java版本中使用了静态块,但在最新版本中它不起作用。
【讨论】: