Относительно статических членов в классе [дубликаты]

1

Может ли кто-нибудь предложить мне, в чем разница между строкой 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");

}
}

благодаря

  • 0
    « ... в чем разница между строкой 1 и строкой 2 » Обе строки делают совершенно разные вещи, можете ли вы описать, что вас смущает? « Какой предпочтительный способ » делать что?
  • 2
    один печатает что-то, другой назначает переменную.
Теги:

5 ответов

0

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

0

Первый - это статический анонимный блок, который его вызывает один раз загрузчиком класса. Когда Foo сначала ссылается.

Вторая - статическая переменная, один экземпляр панели разделяется между всеми foos.

0

В вашем примере разница между двумя строками невелика. Вы создали статический экземпляр, но что делать, если вам нужно сделать больше с вашим статическим экземпляром, например, загрузить свою Bar с некоторой функциональностью?

static {
    bar = new Bar();

    bar.doSomeStuff("This", "Is", "An", "Argument", "List");
}

Такова цель static блока. Что касается того, когда они выполняются, они запускаются, когда класс загружается JVM, так же, как и static поля.

0

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

Теперь, создавая объект, создание объекта не имеет отношения к статическому блоку. Возьмем сценарий, иногда вам нужен код, который должен быть выполнен до создания фактического экземпляра. Например

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 и т.д.

Любые вопросы/споры? пожалуйста, дай мне знать?

0

Класс может иметь любое количество статических блоков инициализации, и они могут появляться в любом месте тела класса. Система времени выполнения гарантирует, что статические блоки инициализации вызываются в порядке их появления в исходном коде. И не забывайте, что этот код будет выполнен, когда 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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню