2010-07-02 6 views

ответ

11

Если вы устанавливаете только переменные, обе формы эквивалентны (и вы должны использовать прежний, поскольку это более читаемым и лаконичным).

Форма static {} существует для случаев, когда вам также необходимо выполнять инструкции, отличные от присваивания переменных. (Несколько надуманный пример):

private static final int i; 
static { 
    establishDatabaseConnection(); 
    i = readIntFromDatabase; 
    closeDatabaseConnection(); 
} 
1

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

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

Greetz, GHAD

1

Для примитивной переменной ничего. Разница может быть в том случае, если инициализация не является тривиальной, или метод/конструктор init генерирует проверенное исключение - тогда вам нужен блок static, чтобы иметь возможность обрабатывать исключение.

2

Основная причина для статических блоков заключается в том, чтобы добавить некоторую логику к инициализации, которую вы не можете сделать в инициализации 1 строки, например инициализации массива или чего-то еще.

1

Это то же самое, за исключением того, что вы можете написать несколько строк в статическом блоке кода.

См. Java's official turorial.

1

Вы также можете использовать Forward Reference инициализацию

public class ForwardReference { 
private static final int i = getValue(); 
private static final int j = 2; 
public static void main(String[] args) { 
    System.out.println(i); 
} 

private static int getValue() { 
    return j*2; 
} 

}

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

Это напечатает правильное значение '4'

+0

Это потрясающе. Однако я изменил «j = 2» на «j = j()» и добавил «static int j() {return 2;}». С этими изменениями ForwardReference печатает '0'. Таким образом, есть некоторые ограничения для Forward Reference. – emory