Страницы

Поиск по вопросам

четверг, 28 ноября 2019 г.

Для чего нужен блок static?

#java


Где в реальной жизни может использоваться такой блок в программировании? Зачем тогда
конструктор? Да я понимаю, что конструктор будет вызываться при каждом новом создании
экземпляра класса, а статик блок единожды. Но в какой момент пройдет инициализация
статик блока и где реально он применяется? 
    


Ответы

Ответ 1



Статические блоки вызываются в момент инициализации класса (когда ClassLoader будет грузить его в MetaSpace, подробнее в JLS), и могут использоваться для иницализации статических переменных. Зачем вызывать каждый раз инициализацию статических переменных в конструкторе, если можно сделать это единожды, таким образом не тратить ресурсы на повторные инициализации?

Ответ 2



Мне кажется у вас небольшое недопонимание разницы между static и instance полями класса. Поля с модификатором static могут быть использованы даже если не было создано не одного экземпляра класса (ни одного объекта) - и они являются общими для всех экземпляров класса. static методы соответственно могут взаимодействовать только со static полями. В конструкторе вы можете задавать значения переменным инстанса(объекта). Под каждый инстанс выделяется отдельная память в которой и хранятся переменные инстанса, и они свои для каждого инстанса. Кроме static блока инициализации если еще не статик блок инициализации - он выполняется до конструктора, например: public class Test { static { System.out.println("Static"); } { System.out.println("Non-static block"); } public Test() { System.out.println("Constructor"); } }

Ответ 3



static блок выполняется при первом обращении к классу. А нужен он для инициализации статических полей, например: class Cls { static OtherCls someField; static String[] list = new String[3]; static { someField = new OtherCls(); for (int i = 0; i < list.length; i++) { list[i] = Integer.toString(i); } } } Таким образом, OtherCls будет интанц-ан, а массив будет заполнен перед самым первым обращением к классу Cls

Ответ 4



Интересно, я только вчера использовал static блок. Я его использую не часто, но вот упрощенный пример от моего кода его использования: public class MovieData { public static List titles = new ArrayList<>(), directors = new ArrayList<>(); static { add("Jurassic Park", "Steven Spielberg"); add("The Dark Night", "Christopher Nolan"); add("Titanic", "James Cameron"); } private static void add(String title, String director) { titles.add(title); directors.add(director); } } Как @zzashpaupat отметил в его ответе, блоки static вызываются при инициализации класса.

Ответ 5



Этот блок - блок, который выполнится единожды при инициализации класса (именно класса, а не инстанса). Собственно, для этого и нужен. Вот недавно отвечая на вопрос посоветовал сохранить набор методов в словаре. Это можно было бы сделать в статическом блоке, чтобы иметь единожды созданный заполненный словарь. Кстати, в C# это можно было бы сделать ещё и через инициализатор коллекции, но в джаве такого вроде нет.

Комментариев нет:

Отправить комментарий