前几天我正在查看一些代码而且我遇到了:
static {
...
}
来自C ++,我不知道为什么会这样。它不是一个错误,因为代码编译得很好。什么是“静态”代码块?
答案 0 :(得分:330)
这是一个static initializer。它是在加载类时执行的(或者是初始化的,确切地说,但是你通常不会注意到它的差异)。
可以将其视为“类构造函数”。
请注意,还有instance initializers,它们看起来相同,只是它们没有static
关键字。当创建对象的新实例时,除构造函数中的代码外,还会运行。
答案 1 :(得分: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");
}
//...
}
这很有用,因为上面的静态字段无法使用labels = ...
进行初始化。它需要以某种方式调用put方法。
答案 2 :(得分:70)
这是一个代码块,当类被类加载器加载时执行。它用于初始化类的静态成员。
也可以编写看起来更奇怪的非静态初始化器:
public class Foo {
{
// This code will be executed before every constructor
// but after the call to super()
}
Foo() {
}
}
答案 3 :(得分:15)
静态块可用于显示程序无需主函数即可运行。
//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);
}
}
答案 4 :(得分:6)
静态块在任何程序的生命周期中执行一次, 静态块的另一个属性是它在main方法之前执行。
答案 5 :(得分:3)
静态块用于初始化代码,并在JVM加载类时执行。请参阅下面的链接,其中给出了详细说明。 http://www.jusfortechies.com/java/core-java/static-blocks.php
答案 6 :(得分:-2)
是的,静态块用于初始化代码,它将在JVM开始执行时加载。
静态块在以前版本的java中使用,但在最新版本中它不起作用。