Инициализация что это 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
Перед использованием классы и объекты в Java должны быть инициализированы. Ранее вы узнали, что поля класса инициализируются значениями по умолчанию при загрузке классов и что объекты инициализируются с помощью конструкторов, но это еще не все. В этой статье представлены все возможности Java для инициализации классов и объектов.
загрузить Получить код Загрузите исходный код для примеров приложений из этого руководства. Создано Джеффом Фризеном для JavaWorld.
Как инициализировать Java-класс
Прежде чем мы исследуем поддержку Java для инициализации классов, давайте вспомним шаги инициализации Java-класса. Рассмотрим листинг 1.
Листинг 1. Инициализация полей класса значениями по умолчанию
Предыдущие поля класса были неявно инициализированы нулем. Однако вы также можете явно инициализировать поля класса, напрямую присвоив им значения, как показано в листинге 2.
Листинг 2. Инициализация полей класса явными значениями
Ссылка на поля класса
Листинг 3. Ссылка на ранее объявленное поле
Однако обратное недопустимо: вы не можете инициализировать поле класса значением поля класса, объявленного впоследствии. Компилятор Java выводит данные illegal forward reference при обнаружении этого сценария. Рассмотрим листинг 4.
Листинг 4. Попытка сослаться на объявленное впоследствии поле
Блоки инициализации класса
В некоторых случаях вы можете захотеть выполнить сложную инициализацию на основе классов. Вы сделаете это после загрузки класса и до того, как из этого класса будут созданы какие-либо объекты (при условии, что класс не является служебным). Для этой задачи можно использовать блок инициализации класса.
Листинг 5. Инициализация массивов значений синуса и косинуса.
Уловка производительности
Поскольку производительность важна для графических приложений и поскольку получить доступ к элементу массива быстрее, чем вызвать метод, разработчики прибегают к уловкам производительности, таким как создание и инициализация массивов синусов и косинусов.
Объединение инициализаторов полей класса и блоков инициализации класса
Вы можете комбинировать несколько инициализаторов полей класса и блоков инициализации класса в приложении. В листинге 6 приведен пример.
Листинг 6. Выполнение инициализации класса сверху вниз.
В листинге 6 объявляется и инициализируется пара полей класса ( x и y ), а также объявляется пара static инициализаторов. Составьте этот список, как показано:
Затем запустите получившееся приложение:
Вы должны увидеть следующий результат:
Эти выходные данные показывают, что инициализация класса выполняется сверху вниз.
() методы
After loading a class, the JVM calls this method before calling main() (when main() is present).
The following partial disassembly reveals the bytecode instruction sequence for the () method. Each line starts with a decimal number that identifies the zero-based offset address of the subsequent instruction:
The instruction sequence from offset 0 through offset 2 is equivalent to the following class field initializer:
The instruction sequence from offset 5 through offset 8 is equivalent to the following class field initializer:
The instruction sequence from offset 11 through offset 80 is equivalent to the following class initialization block:
The instruction sequence from offset 83 through offset 88 is equivalent to the following class field initializer:
The instruction sequence from offset 91 through offset 115 is equivalent to the following class initialization block:
Finally, the return instruction at offset 118 returns execution from () to that part of the JVM that called this method.
Don’t worry about what the bytecode means
The takeaway from this exercise is to see that all code in Listing 6’s class field initializers and class initialization blocks is located in the () method, and is executed in top-down order.
How to initialize objects
After a class has been loaded and initialized, you’ll often want to create objects from the class. As you learned in my recent introduction to programming with classes and objects, you initialize an object via the code that you place in a class’s constructor. Consider Listing 7.
Listing 7. Using the constructor to initialize an object
Listing 7 declares a City class with name and population fields. When a City object is created, the City(String name, int population) constructor is called to initialize these fields to the called constructor’s arguments. (I’ve also overridden Object ‘s public String toString() method to conveniently return the city name and population value as a string. System.out.println() ultimately calls this method to return the object’s string representation, which it outputs.)
Инициализация
1. Инициализация переменных
Как вы уже знаете, в вашем классе можно объявить несколько переменных класса, и не просто объявить, а сразу инициализировать их стартовыми значениями.
Однако эти же переменные можно инициализировать и в конструкторе. Поэтому теоретически возможна ситуация, когда одним и тем же переменным класса значения присваиваются дважды. Пример
Переменной age присваивается стартовое значение
Стартовое значение перетирается
Для age используется стартовое значение
Вот что будет происходить при выполнении кода Cat cat = new Cat(«Васька», 2); :
Т.е. переменные класса сначала инициализируются своими значениями, а уже затем выполняется код конструкторов.
2. Порядок инициализации переменных класса
Переменные не просто инициализируются до работы конструктора: они еще и инициализируются в четко заданном порядке — порядке объявления в классе.
Давайте рассмотрим такой интересный код:
Примечание: но вы же помните, что ваш код должен быть прозрачен для других разработчиков, так что такие приемы лучше не использовать — это ухудшает читаемость кода.
Тут нужно помнить, что все переменные класса до того, как им присвоили какое-либо значение, имеют значение по умолчанию. Для типа int это ноль.
Если вы создали переменную внутри метода, вы не можете ее использовать, если прежде не присвоили ей какое-нибудь значение. А с переменными класса это не так. Если переменной класса не присвоено стартовое значение, значит ей присваивается значение по умолчанию.
3. Константы
Но вот чего вы не знаете, так это того, что стартовое значение можно сразу не присваивать, если присвоить его в конструкторе. И это отлично будет работать для final-переменной. Единственное требование — если конструкторов несколько, final переменной должно быть присвоено значение во всех конструкторах.
BestProg
Инициализация переменных в методах класса. Инициализация полей (членов данных) класса. Способы инициализации членов данных класса
Данная тема демонстрирует способы инициализации внутренних членов данных класса в языке программирования Java.
Содержание
Поиск на других ресурсах:
1. Понятие инициализации переменных в методах в Java
Инициализация переменной означает явное (или неявное) установление некоторого значения переменной.
В языке программирования Java переменные, объявленные в методе, обязательно должны быть инициализированы перед их использованием.
Если в теле некоторого метода класса, попробовать использовать объявленную, но не инициализированную переменную, то компилятор выдаст ошибку.
В этом случае выдается сообщение об ошибке:
Чтобы исправить ситуацию, нужно переменной t присвоить какое-то значение перед ее использованием.
2. Какие существуют способы инициализации членов данных класса?
В Java можно инициализировать переменную, если она является членом класса. Существует четыре способа инициализации членов данных класса:
3. Инициализация полей данных класса. Что такое инициализация полей данных класса по умолчанию?
Если переменная есть членом данных класса, то эта переменная инициализируется значением по умолчанию при ее объявлении.
То есть, если есть класс в котором объявлены внутренние переменные (поля класса)
4. Какие значения по умолчанию присваиваются полям класса для разных типов?
При объявлении переменной в некотором классе, этой переменной присваиваются значения по умолчанию. Ниже приведены значения по умолчанию, которые присваиваются переменным разных типов
Символьной переменной типа char присваивается нуль-символ, который отображается в виде символа «пробел».
5. Каким значением инициализируется переменная-ссылка на объект класса?
Нижеследующий фрагмент кода демонстрирует это.
6. Явная инициализация. Каким образом осуществляется явная инициализация членов данных класса начальными значениями?
Явная инициализация означает установление начального (нужного) значения переменной при ее объявлении в классе.
Например. В классе MyClass реализована инициализация начальными значениями переменных разных типов.
7. Каким образом осуществляется явная инициализация членов данных класса, которые есть переменными-ссылками на класс
Если членом данных класса есть переменная-ссылка на некоторый класс (объект класса), то она инициализируется стандартным способом с помощью оператора new:
8. Явная инициализация с помощью вызова методов. Каким образом инициализируется значение члена данных класса с помощью вызова метода?
При объявлении, члены данных класса могут быть инициализированы вызовом некоторого метода.
9. Какой порядок инициализации при объявлении переменных? Какое значение имеет порядок инициализации при объявлении переменных? Примеры
В классе переменные инициализируются в первую очередь. Инициализация переменных происходит даже перед вызовом конструктора класса. Порядок инициализации переменных определяется порядком их объявления в классе (см. пример 1). После инициализации переменных вызывается конструктор. При этом, объявление и инициализация переменных могут быть реализованы в любом месте класса (см. пример 2).
Как видно из программного кода в пункте 8, переменные объявляются в строго определенной последовательности, в которой значение инициализирующих переменных и методов (справа от операции присваивания) было определено на момент инициализации.
Если в классе изменить порядок объявления и инициализации, то может возникнуть ошибка. Например, если объявление переменной t4 поместить на самый верх объявлений членов данных класса:
то возникнет ошибка компиляции
Пример 2. Данный пример демонстрирует правило, в котором любая внутренняя переменная класса (член данных класса) инициализируется первой, даже перед вызовом конструктора.
В результате выполнения такого кода будет выведен следующий результат:
10. Каким образом осуществляется инициализация с помощью конструктора?
Инициализация членов данных класса с помощью конструктора более подробно описывается в теме:
11. Каким образом можно инициализировать члены данных класса с помощью секции инициализации < >? Пример
Члены данных класса можно инициализировать в одной секции, как показано в примере.
12. Что выполняется первым: секция инициализации или конструктор?
Первым выполняется секция инициализации а потом уже конструктор класса.
Связанные темы
Программирование: теория и практика
Рубрики
Свежие записи
При использовании материалов сайта, ссылка на сайт обязательна.
Инициализация объектов, метод Initialize
— Хочу рассказать тебе об инициализации объектов. Когда объект создаётся – его переменным нужно присвоить стартовые данные. Чтобы не было ситуаций, когда ты обращаешься к объекту, а внутри у него нет нужной ему информации для правильной работы.
— Рассмотрим для примера объект типа File (файл). Минимальной необходимой информацией для файла является его имя. Создать файл без имени – это бессмыслица.
— Допустим, мы пишем свой класс для работы с файлами — MyFile, какая информация нужна каждому объекту этого класса?
— Имя файла, с которым этот объект будет работать?
— Правильно. Для этого добавим в наш класс метод initialize(). Это будет выглядеть примерно так:
— Мы добавили метод initialize, чтобы с объектом можно было работать – вызывать его методы. Это можно делать сразу после вызова метода initialize. Если с объектом работать нельзя, его называют невалидным (invalid), если можно – валидным (valid). Основная задача метода initialize – передать в объект все необходимые данные, чтобы сделать его валидным.
— Теперь усложним задачу. Вернее упростим. Как посмотреть. Представим, что другому программисту, который будет использовать наш класс, удобнее передавать в него не полное имя файла, а директорию и короткое имя файла. Мы бы смогли реализовать эту функциональность с помощью ещё одного метода initialize ( Java позволяет создавать несколько методов с одинаковыми именами ). Тогда наш класс стал бы выглядеть так:
— А ещё, часто нужно создать временную копию файла рядом с текущим.
— Мы можем сделать метод для этого случая?
— Конечно, вот смотри:
— И что, я могу сделать таких методов сколько угодно?
— Разумные пределы, конечно, есть. Но, в принципе, да, сколько угодно.
— А когда надо вызывать метод initialize?
— Сразу после создания объекта, чтобы перевести его в валидное состояние:
— А что ещё за метод getFolder()?
— По логике этот метод должен возвращать строку с именем папки, в которой находится наш файл. Но мы его тут не писали, он чисто для фона.