Java: Когда полезен статический блок инициализации? - PullRequest
61 голосов
/ 21 февраля 2012

В чем разница между инициализацией в блоке static:

public class staticTest {

    static String s;
    static int n;
    static double d;

    static {
        s = "I'm static";
        n = 500;
        d = 4000.0001;
    }
    ...

И индивидуальная статическая инициализация:

public class staticTest {

    static String s = "I'm static";
    static int n    = 500;
    static double d = 4000.0001;

    ....

Ответы [ 12 ]

0 голосов
/ 12 октября 2017

Статический блок инициализации полезен, если вы хотите инициализировать указанные классы статических типов перед первым использованием класса. Последующее использование не вызовет никаких статических блоков инициализации. Это прямая противоположность инициализаторам экземпляров, которые инициализируют члены экземпляров.

0 голосов
/ 21 февраля 2012

Статический кодовый блок позволяет инициализировать поля более чем на инстанцию, инициализировать поля в другом порядке объявлений, а также может использоваться для условной инициализации.

В частности,

static final String ab = a+b;
static final String a = "Hello,";
static final String b = ", world";

не будет работать, потому что a и b объявлены после ab.

Однако я мог бы использовать статический init.блок, чтобы преодолеть это.

static final String ab;
static final String a;
static final String b;

static {
  b = ", world";
  a = "Hello";
  ab = a + b;
}

static final String ab;
static final String a;
static final String b;

static {
  b = (...) ? ", world" : ", universe";
  a = "Hello";
  ab = a + b;
}
...