для чего в java используются статические блоки инициализации

BestProg

Инициализация статических членов данных. Статический блок. Инициализация массивов

Содержание

Поиск на других ресурсах:

1. Инициализация статических членов данных. Каким образом инициализируются статические члены данных?

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

Ниже приведены значения по умолчанию, которые присваиваются статическим членам данных в случае отсутствия явной инициализации

Если нужно осуществить явную инициализацию статического члена данных в месте его объявления, тогда это осуществляется точно так же как и для нестатического члена данных:

Более подробно работа со статическими членами данных в Java освещается в теме:

2. Пример инициализации статических членов данных класса. Инициализация статического члена данных с помощью метода
3. Какой порядок инициализации, если в классе объявляются статические и нестатические члены данных класса?

Если в классе объявляются статические и нестатические члены данных класса, то первыми инициализируются статические члены данных класса. После этого инициализируются нестатические члены данных класса.

После объявления объекта класса CDataInit выводятся следующие строки:

Как видно из приведенного выше результата, первыми инициализируются статические члены данных.

4. Что такое статический блок? Общая форма

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

Общая форма статического блока:

В классе статический блок выглядит приблизительно следующим образом:

5. Пример использования статического блока
6. Сколько раз вызывается статический блок? В каких случаях вызывается статический блок?

Статический блок вызывается только один раз в одном из двух случаев:

В результате выполнения этого кода, будет выведен результат:

Как видно, в функции main() создается два объекта, а инициализированные данные выводятся только один раз. Это подтверждает правило, которое гласит: статические члены данных инициализируются в классе только один раз.

Если в функции main() вместо строки

ввести код обращения к статической переменной, например

то также будет вызван статический блок инициализации, но только один раз.

7. Инициализация массивов в классе. Как в классе инициализировать массив значениями?

В языке Java массив в классе может быть инициализирован одним из двух способов:

8. Пример инициализации одномерных массивов в классе
9. Пример инициализации двумерного массива в классе

Инициализация двумерного массива осуществляется точно также как и одномерного.

Источник

Собеседование по Java — ООП (вопросы и ответы). Часть 2

Вторая часть ответов и вопросов для собеседования по ООП в Java.

Вопросы. Часть 2

21. Зачем нужен оператор instanceof?
22. Зачем нужны и какие бывают блоки инициализации?
23. Каков порядок вызова конструкторов и блоков инициализации двух классов: потомка и его предка?
24. Где и для чего используется модификатор abstract?
25. Можно ли объявить метод абстрактным и статическим одновременно?
26. Что означает ключевое слово static?
27. К каким конструкциям Java применим модификатор static?
28. Что будет, если в static блоке кода возникнет исключительная ситуация?
29. Можно ли перегрузить static метод?
30. Что такое статический класс, какие особенности его использования?
31. Какие особенности инициализации final static переменных?
32. Как влияет модификатор static на класс/метод/поле?
33. О чем говорит ключевое слово final?
34. Дайте определение понятию “интерфейс”.
35. Какие модификаторы по умолчанию имеют поля и методы интерфейсов?
36. Почему нельзя объявить метод интерфейса с модификатором final или static?
37. Какие типы классов бывают в java (вложенные… и.т.д.)
38. Какие особенности создания вложенных классов: простых и статических.
39. Что вы знаете о вложенных классах, зачем они используются? Классификация, варианты использования, о нарушении инкапсуляции.
40. В чем разница вложенных и внутренних классов?
41. Какие классы называются анонимными?
42. Каким образом из вложенного класса получить доступ к полю внешнего класса?

Ответы. Часть 2

21. Зачем нужен оператор instanceof?

Оператор instanceof возвращает true, если объект является экземпляром класса или его потомком.

Источник

Инициализация полей в Java (Java fields initialization)

Введение

Типы инициализации полей объектов и классов

Существуют следующие методы инициализации полей:

НазваниеПрименимостьОписание
Инициализация в месте объявления поляПоля класса, поля объектаПрименяется, если инициализация может быть произведена коротким выражением и доступен контекст, необходимый для ее проведения
Инициализационный блокПоля класса, поля объектаПрименяется, если инициализационный код неудобно записывать одним выражением или же, например, нужна обработка проверяемых исключений. В случае объектов может применяться для инициализации полей объектов анонимных классов.
Конструктор классаПоля объектаПрименяется, если для инициализации нужны параметры конструктора

Далее мы рассмотрим каждый тип инициализации подробнее.

Инициализация статических полей в месте объявления

Здесь инициализируется статическое поле SIZE класса Integer. Сама инициализация произойдет во время загрузки класса. В этом легко убедиться выполнив следующий код:

В результате будет выведено:

Как видно из вывода переменная i инициализируется в результате загрузки класса. Попробуйте выполнить код, закомментировав строку, содержащую Class.forName(. ).

Инициализация в статическом блоке

Переменная alphabet инициализируется в статическом блоке. Инициализация происходит во время загрузки класса аналогично как и в предыдущем примере.

Инициализация статических полей в месте объявления и статические блоки выполняются в порядке их объявления в классе. Давайте выполним следующий код:

На консоль будет выведено:

Инициализация полей объекта

В отличии от полей класса, поля объекта инициализируются во время конструирования экземпляра класса. В Java существует 3 типа такой инициализации:

Инициализация полей объекта в месте объявления

Покажем на примере:

Инициализация поля posts будет произведена во время конструирования объекта Blog.

Инициализация полей объекта в нестатическом блоке

Использование инициализационных блоков является альтернативой предыдущему способу инициализации. Данный тип инициализации может использоваться, если:

Пример обработки проверяемого исключения:

Инициализация полей объекта в конструкторе

Часто инициализацию полей объекта имеет смысл проводить только с учетом значений параметров конструктора. В таких случаях ее производят в самом конструкторе. Пример:

Инициализация в конструкторе и наследование

Выполним следующий код:

В out будет выведено:

Вывод свидетельствует о том, что инициализация выполнялась следующим образом:

Порядок инициализации полей объекта

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

В результате выполнения получим:

Вывод свидельствует о том что:

Результат декомипляции предыдущего примера

Ну и напоследок давайте декомпилируем следующий код с помощью Jad:

Получился следующий листинг:

Интересно, что компилятор перенес всю нестатическую инициализацию объекта в конструктор класса. При этом статический инициализационный блок остался без изменений.

Выводы


Желаю удачи!
Дмитрий Пекар, июнь 2009

Если Вам понравилась статья, проголосуйте за нее

Голосов: 84 Голосовать для чего в java используются статические блоки инициализации. Смотреть фото для чего в java используются статические блоки инициализации. Смотреть картинку для чего в java используются статические блоки инициализации. Картинка про для чего в java используются статические блоки инициализации. Фото для чего в java используются статические блоки инициализации

Источник

Руководство по созданию объектов в Java

Взгляните на различные способы инициализации примитивов и объектов в Java.

1. Обзор

Проще говоря, прежде чем мы сможем работать с объектом в JVM, он должен быть инициализирован.

В следующих разделах мы рассмотрим различные способы инициализации примитивных типов и объектов.

2. Декларация против Инициализация

Давайте начнем с того, что убедимся, что мы на одной странице.

Объявление-это процесс определения переменной вместе с ее типом и именем.

Здесь мы объявляем переменную id :

Инициализация, с другой стороны, заключается в присвоении значения; например:

Чтобы продемонстрировать это, мы создадим класс User с именем и id свойствами:

Далее мы увидим, что инициализация работает по-разному в зависимости от типа поля, которое мы инициализируем.

3. Объекты против примитивов

Java предоставляет два типа представления данных: примитивные типы и ссылочные типы. В этом разделе мы обсудим различия между ними в отношении инициализации.

Java имеет восемь встроенных типов данных, называемых примитивными типами Java; переменные этого типа содержат свои значения напрямую.

Ссылочные типы содержат ссылки на объекты (экземпляры классов). В отличие от примитивных типов, которые хранят свои значения в памяти, где выделена переменная, ссылки не содержат значения объекта, на который они ссылаются.

Вместо этого ссылка указывает на объект, сохраняя адрес памяти, в котором находится объект.

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

Давайте рассмотрим пример, который объявляет и инициализирует ссылочный тип из нашего класса User :

Давайте продолжим изучать больше о создании объектов.

5. Создание объектов

Давайте обсудим конструкторы и ключевое слово new более подробно.

Ключевое слово new отвечает за выделение памяти для нового объекта с помощью конструктора.

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

Давайте добавим конструктор в наш класс User :

Теперь мы можем использовать наш конструктор для создания объекта User с начальными значениями его свойств:

6. Переменная Область действия

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

6.1. Переменные экземпляра и класса

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

Теперь давайте попробуем определить некоторые переменные, связанные с экземплярами и классами, и проверить, имеют ли они значение по умолчанию или нет:

6.2. Локальные переменные

Например, следующий код генерирует ошибку компилятора:

7. Последнее Ключевое Слово

Давайте добавим константу в наш класс User :

Константы должны быть инициализированы либо при их объявлении, либо в конструкторе.

8. Инициализаторы в Java

В Java инициализатор – это блок кода, который не имеет связанного имени или типа данных и помещается вне любого метода, конструктора или другого блока кода.

Java предлагает два типа инициализаторов: статические и инициализаторы экземпляров. Давайте посмотрим, как мы можем использовать каждый из них.

8.1. Инициализаторы экземпляров

Мы можем использовать их для инициализации переменных экземпляра.

Чтобы продемонстрировать, давайте предоставим значение для пользователя id с помощью инициализатора экземпляра в нашем классе User :

8.2. Блок Статической Инициализации

Статический инициализатор или статический блок – это блок кода, который используется для инициализации статических полей. Другими словами, это простой инициализатор, отмеченный ключевым словом static:

9. Порядок инициализации

При написании кода, который инициализирует различные типы полей, конечно, мы должны следить за порядком инициализации.

В Java порядок операторов инициализации выглядит следующим образом:

10. Жизненный цикл объекта

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

В отличие от других языков, где нам приходится беспокоиться об уничтожении объектов, Java заботится об устаревших объектах через свой сборщик мусора.

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

Чтобы объект Java стал недоступным, он должен столкнуться с одной из следующих ситуаций:

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

Наконец, когда он больше не нужен, сборщик мусора уничтожает его.

11. Другие методы создания объектов

Отражение-это механизм, который мы можем использовать для проверки классов, полей и методов во время выполнения. Вот пример создания нашего Пользователя объекта с помощью отражения:

Следующий метод, клонирование, – это способ создания точной копии объекта. Для этого наш класс User должен реализовать интерфейс Cloneable :

Теперь мы можем использовать метод clone() для создания нового клонированного пользователя объекта, который имеет те же значения свойств, что и объект user :

Мы также можем использовать Мы также можем использовать класс для выделения памяти для объекта без вызова конструктора:

12. Заключение

В этом уроке мы рассмотрели инициализацию полей в Java. Мы обнаружили различные типы данных в Java и способы их использования. Мы также подробно рассмотрели несколько способов создания объектов в Java.

Источник

Необходимость статического блока в Java

11 ответов

если класс имеет статические члены, требующие сложной инициализации, a static блок является инструментом для использования. Предположим, вам нужна какая-то статическая карта (цель здесь не имеет значения). Вы можете объявить его в строку:

однако, если вы хотите заполнить его один раз, вы не можете сделать это с помощью встроенной декларации. Для этого вам нужно static блок:

если вы хотели быть еще более защитным, вы можете сделать это:

справедливости ради, это не полный ответ на ваш вопрос. The static блок все еще может быть устранен с помощью частной статическую функцию:

обратите внимание, что это не заменяет static блок кода в конструкторе, как вы предложили!

случай, когда static блок было бы неудобно заменить будет «мастер» класс, который должен инициализировать несколько других классов ровно один раз.

Примечание. что есть также нечто, называемое блок инициализатора экземпляра. Это анонимный блок кода, который выполняется при создании экземпляра. (Синтаксис похож на static блок, но без static ключевое слово.) Это особенно полезно для анонимных классов, потому что они не могут иметь именованные конструкторы. Вот реальный пример. С тех пор (непостижимо) GZIPOutputStream не имеет конструктора или вызова api, с помощью которого можно указать уровень сжатия, и уровень сжатия по умолчанию-none, вам нужно подкласс GZIPOutputStream чтобы получить любое сжатие. Вы всегда можете написать явный подкласс, но может быть удобнее написать анонимный класс:

конструктор вызывается при создании экземпляра класса.

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

статический инициализатор будет запущен, если мы инициализируем класс, это не требует создания экземпляра класса. Но конструктор запускается только тогда, когда мы делаем экземпляр класса.

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

если мы делаем экземпляр класса, статические initilizer и запуск конструктора. Никакие сюрпризы.

обратите внимание, что если мы бежим:

объявив переменную x не требуется MyClass для инициализации, поэтому статический инициализатор не запускается.

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

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

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

статический блок инициализируется при загрузке класса в память, это означает, что JVM читает байтовый код u’R. Инициализация не может быть ничем, это может быть инициализация переменной или любая другая вещь, которая должна быть разделена всеми объектами этого класса

статический блок reqly полезен, когда вам нужно выполнить какое-то действие, даже если экземпляры еще не созданы. Например, для инициализации статической переменной с нестатическим значением.

статический блок полезен, когда вы хотите инициализировать статические поля.

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

один из способов понять статический блок; Он действует как конструктор. однако, разница между двумя статический блок создает экземпляр класса или статических переменных, а конструктор используется для создания экземпляра переменных объекта

рассмотрим следующий класс

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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *