Java中的静态块

时间:2010-05-31 12:38:31

标签: java static

前几天我正在查看一些代码而且我遇到了:

static {
    ...
}

来自C ++,我不知道为什么会这样。它不是一个错误,因为代码编译得很好。什么是“静态”代码块?

7 个答案:

答案 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中使用,但在最新版本中它不起作用。