前几天我查看了一些代码,我遇到了:
static {
...
}
Run Code Online (Sandbox Code Playgroud)
来自C++,我不知道为什么会这样.它不是一个错误,因为代码编译得很好.什么是"静态"代码块?
Joa*_*uer 339
这是一个静态初始化器.它是在类加载时执行的(或者是初始化的,确切地说,但是你通常不会注意到它的区别).
它可以被认为是"类构造函数".
请注意,还有一些实例初始值设定项,它们看起来相同,只是它们没有static关键字.当创建对象的新实例时,除了构造函数中的代码之外,还会运行这些代码.
aio*_*obe 93
它是一个静态初始化器.它是在加载类时执行的,也是放置静态变量初始化的好地方.
来自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");
}
//...
}
Run Code Online (Sandbox Code Playgroud)
它很有用,因为上面的静态字段无法使用初始化labels = ....它需要以某种方式调用put方法.
Sim*_*ann 70
它是一个代码块,当类被类加载器加载时执行.它是为了初始化类的静态成员.
也可以编写非静态初始化器,看起来更奇怪:
public class Foo {
{
// This code will be executed before every constructor
// but after the call to super()
}
Foo() {
}
}
Run Code Online (Sandbox Code Playgroud)
小智 16
静态块可用于显示程序可以在没有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);
}
}
Run Code Online (Sandbox Code Playgroud)