Может ли кто-нибудь предложить мне, в чем разница между строкой 1 и линией 2. Какой из них предпочтительнее? Если мы сможем создать объект, то почему мы используем статический блок? каков порядок выполнения статических членов в классе?
class Foo {
static {
// bar = new Bar();
System.out.println("IN Block");//LINE 1
}
public static Bar bar = new Bar();//LINE 2
public void doStuff() {
System.out.println("I am in Foo");
}
}
благодаря
Статический блок будет выполняться, когда класс загружается JVM. Там нет причин использовать его для инициализации статических полей, за исключением, возможно, определенных случаев краев.
Первый - это статический анонимный блок, который его вызывает один раз загрузчиком класса. Когда Foo сначала ссылается.
Вторая - статическая переменная, один экземпляр панели разделяется между всеми foos.
В вашем примере разница между двумя строками невелика. Вы создали статический экземпляр, но что делать, если вам нужно сделать больше с вашим статическим экземпляром, например, загрузить свою Bar
с некоторой функциональностью?
static {
bar = new Bar();
bar.doSomeStuff("This", "Is", "An", "Argument", "List");
}
Такова цель static
блока. Что касается того, когда они выполняются, они запускаются, когда класс загружается JVM, так же, как и static
поля.
Как уже многие из нас уже ответили, статический блок выполняется, когда класс загружен.
Теперь, создавая объект, создание объекта не имеет отношения к статическому блоку. Возьмем сценарий, иногда вам нужен код, который должен быть выполнен до создания фактического экземпляра. Например
public class Test{
static{
//Load Library
System.loadLibrary("hello");
}
void aMethod(){
//some code
}
public static void main(String str[]){
//some code for main
}
}
когда вы используете:
>java Test
Таким образом, основная цель здесь - до вызова любого метода или даже инициализации класса, он должен загрузить библиотеку в системную среду. Эта библиотека может использоваться в любое время в любом месте программы. Это хороший пример использования статического блока. Он не используется только для таких утверждений, как System.out и т.д.
Любые вопросы/споры? пожалуйста, дай мне знать?
Класс может иметь любое количество статических блоков инициализации, и они могут появляться в любом месте тела класса. Система времени выполнения гарантирует, что статические блоки инициализации вызываются в порядке их появления в исходном коде. И не забывайте, что этот код будет выполнен, когда JVM загрузит класс. JVM объединяет все эти блоки в один статический блок и затем выполняет. Вот несколько моментов, которые я хотел бы упомянуть:
If you have executable statements in the static block, JVM will automatically execute these statements when the class is loaded into JVM.
If youre referring some static variables/methods from the static blocks, these statements will be executed after the class is loaded into JVM
i.e., now the static variables/methods referred and the static block both will be executed.