Java中的静态块

Moh*_*nde 304 java static

前几天我查看了一些代码,我遇到了:

static {
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

Joa*_*uer 339

这是一个静态初始化器.它是在类加载时执行的(或者是初始化的,确切地说,但是你通常不会注意到它的区别).

它可以被认为是"类构造函数".

请注意,还有一些实例初始值设定项,它们看起来相同,只是它们没有static关键字.当创建对象的新实例时,除了构造函数中的代码之外,还会运行这些代码.

  • @Jori:一个常见的原因是如果你有多个单独的构造函数(*不*只是"重定向"到一个规范的构造函数)并且你希望所有这些构造函数都有一些共同的初始化. (55认同)
  • 执行顺序是:静态初始化程序,实例初始化程序,构造函数 (50认同)
  • 那么为什么要使用非静态实例初始化器而不是简单地使用类构造函数(我可以认为这在匿名类中很有用)? (9认同)
  • 使代码更清晰,重复性更低.制定Java规范的人有时会使事情变得更加混乱,但几乎总是有一个潜在的原因,他们为什么这样做.流操纵,任何人? (3认同)
  • @SomeoneSomewhere 虽然“实例初始化程序、构造函数”相互跟随,但“静态初始化程序”可能很久以前就已执行过。但你是对的,顺序是,最初。事实上,它是“SI,II,C,II,C,II,C,......”。 (2认同)

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)

  • @DerGolem我认为他指的是正常构造函数之上的大括号. (12认同)
  • 甚至没有注意到......;)是的,很奇怪! (3认同)

小智 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)

  • 这只适用于版本7,如果您想运行代码,则有义务编写main. (6认同)

小智 6

静态块在任何程序的生命周期中执行一次,静态块的另一个属性是它在main方法之前执行.