- Создание и удаление объектов Java — основы
- Способы создания объекта Java
- Динамическое создание объектов Java
- Способы создания объекта Java
- Динамическое создание объектов Java
- Каковы все различные способы создания объекта в Java?
- 22 ответов
- 1. С помощью ключевого слова new:
- 2. Используя Заводской Метод:
- 3. Используя Концепцию Клонирования:
- 4. С Помощью Класса.forName()`:
- 5. Использование десериализации объектов:
Создание и удаление объектов Java — основы
В объектно-ориентированном программировании при создании объекта вызывается конструктор. Это блок команд, который инициализирует объект: присваивает значения его параметрам и выполняет начальные действия для подготовки объекта к работе. Конструктор может принимать параметры явно или использовать прописанные в классе значения по умолчанию.
Способы создания объекта Java
Чтобы создать объект, используют ключевое слово new. Вы его наверняка помните по созданию массивов, которые в Java тоже являются объектами. После new указывают тип создаваемого объекта, т.е. класс. В Java, как и в других ООП-языках, можно использовать встроенные классы и определять пользовательские.
Класс — это шаблон, по которому создаётся экземпляр — объект. Класс определяет свойства и поведение будущего объекта. Команда «Изготовь шестигранную гайку» имеет смысл, только если исполнитель понимает, что такое гайка. Именно класс описывает свойства «гайки» и указывает, что с ней можно делать.
Допустим, у нас есть класс Item («предмет»), где прописано, что каждый предмет имеет габариты и свойство moveable, которое определяет, можно ли предмет двигать:
Чтобы создать экземпляр toolbox («ящик с инструментами») класса Item, заведём переменную для хранения ссылки на объект, а затем запустим конструктор:
При создании ящика мы переопределили его параметры. Если бы нас устраивали значения по умолчанию, мы создали бы ящик без параметров:
Динамическое создание объектов Java
Объекты создаются и исчезают во время работы приложений. Вы заказали новый юнит в игре — он появился, отправили его сражаться — он погиб. У каждого объекта свой жизненный цикл: от создания до уничтожения.
Память для хранения данных об объекте выделяется и высвобождается. Причем специально удалять неиспользуемый объект не нужно — для этого в Java есть сборщик мусора. Он автоматически запускается и стирает объекты, которые уже не планируется вызывать. Как он их находит? По отсутствию дальнейших обращений к этим объектам (ссылок на них).
В Джаве нет деструктора в привычном понимании. Есть метод finalize — он вызывается, когда за объектом приходит сборщик мусора. Но есть у этого метода особенности, из-за которых его редко используют на практике:
- неизвестно, в какой момент он будет вызван и будет ли вызван вообще — программа может завершиться раньше;
- он замедляет работу сборщика мусора с объектом более чем в 400 раз;
- объекты утилизируются не сразу, а попадают в очередь на финализацию и продолжают занимать память неопределённое время.
Зачем же этот метод существует в языке?
- Для составления «описи» объектов, которые не используются, но и не удалены — через поиск и логирование.
- Для высвобождения ресурсов при работе с нативным кодом: например, С.
Более толковый помощник в борьбе за свободные ресурсы — интерфейс AutoCloseable — позволяет закрывать потоки, файлы, соединения с БД и др. Чтобы воспользоваться интерфейсом, нужно реализовать его единственный метод, сlose(), в классе, объекты которого вы планируете закрывать:
Вызвать метод можно в конструкции try-с-ресурсами:
Открыли ресурс, запустили выполнение задачи, завершили выполнение, закрыли ресурс.
Также рекомендуем посмотреть вебинар по созданию консольных приложений на Java, где будут рассматриваться объекты и классы.
В объектно-ориентированном программировании при создании объекта вызывается конструктор. Это блок команд, который инициализирует объект: присваивает значения его параметрам и выполняет начальные действия для подготовки объекта к работе. Конструктор может принимать параметры явно или использовать прописанные в классе значения по умолчанию.
Способы создания объекта Java
Чтобы создать объект, используют ключевое слово new. Вы его наверняка помните по созданию массивов, которые в Java тоже являются объектами. После new указывают тип создаваемого объекта, т.е. класс. В Java, как и в других ООП-языках, можно использовать встроенные классы и определять пользовательские.
Класс — это шаблон, по которому создаётся экземпляр — объект. Класс определяет свойства и поведение будущего объекта. Команда «Изготовь шестигранную гайку» имеет смысл, только если исполнитель понимает, что такое гайка. Именно класс описывает свойства «гайки» и указывает, что с ней можно делать.
Допустим, у нас есть класс Item («предмет»), где прописано, что каждый предмет имеет габариты и свойство moveable, которое определяет, можно ли предмет двигать:
Чтобы создать экземпляр toolbox («ящик с инструментами») класса Item, заведём переменную для хранения ссылки на объект, а затем запустим конструктор:
При создании ящика мы переопределили его параметры. Если бы нас устраивали значения по умолчанию, мы создали бы ящик без параметров:
Динамическое создание объектов Java
Объекты создаются и исчезают во время работы приложений. Вы заказали новый юнит в игре — он появился, отправили его сражаться — он погиб. У каждого объекта свой жизненный цикл: от создания до уничтожения.
Память для хранения данных об объекте выделяется и высвобождается. Причем специально удалять неиспользуемый объект не нужно — для этого в Java есть сборщик мусора. Он автоматически запускается и стирает объекты, которые уже не планируется вызывать. Как он их находит? По отсутствию дальнейших обращений к этим объектам (ссылок на них).
В Джаве нет деструктора в привычном понимании. Есть метод finalize — он вызывается, когда за объектом приходит сборщик мусора. Но есть у этого метода особенности, из-за которых его редко используют на практике:
- неизвестно, в какой момент он будет вызван и будет ли вызван вообще — программа может завершиться раньше;
- он замедляет работу сборщика мусора с объектом более чем в 400 раз;
- объекты утилизируются не сразу, а попадают в очередь на финализацию и продолжают занимать память неопределённое время.
Зачем же этот метод существует в языке?
- Для составления «описи» объектов, которые не используются, но и не удалены — через поиск и логирование.
- Для высвобождения ресурсов при работе с нативным кодом: например, С.
Более толковый помощник в борьбе за свободные ресурсы — интерфейс AutoCloseable — позволяет закрывать потоки, файлы, соединения с БД и др. Чтобы воспользоваться интерфейсом, нужно реализовать его единственный метод, сlose(), в классе, объекты которого вы планируете закрывать:
Вызвать метод можно в конструкции try-с-ресурсами:
Открыли ресурс, запустили выполнение задачи, завершили выполнение, закрыли ресурс.
Также рекомендуем посмотреть вебинар по созданию консольных приложений на Java, где будут рассматриваться объекты и классы.
Источник
Каковы все различные способы создания объекта в Java?
на днях разговаривал об этом с коллегой.
есть очевидное, что нужно использовать конструктор, но какие еще способы есть?
22 ответов
существует четыре различных способа создания объектов в java:
A. Используя new ключевое слово
Это наиболее распространенный способ создания объекта в Java. Таким образом создается почти 99% объектов.
B. Используя Class.forName()
Если мы знаем имя класса, и если у него есть конструктор по умолчанию, мы можем создать объект таким образом.
C. С помощью clone()
Clone () можно использовать для создания копии существующего объекта.
D. Используя object deserialization
Десериализация объекта-это не что иное, как создание объекта из его сериализованной формы.
вы можете узнать из здесь
существуют различные способы:
- через Class.newInstance .
- через Constructor.newInstance .
- через десериализацию (использует конструктор no-args самого производного несериализуемого базового класса).
- через Object.clone (не вызывает конструктор).
- через JNI (должен вызвать конструктор).
- через любой другой метод, который называет new для вас.
- я думаю, вы могли бы опишите загрузку класса как создание новых объектов (например, interned String s).
- литеральный массив как часть инициализации в объявлении (без конструктора для массивов).
- массив в «varargs» ( . ) вызов метода (нет конструктора для массивов).
- конкатенация строк константы времени без компиляции (при типичной реализации создается не менее четырех объектов).
- вызывая исключение, которое будет создано и брошено во время выполнения. Например, throw null; или «».toCharArray()[0] .
- О, и бокс примитивов (если не кэшируется), конечно.
- JDK8 должен иметь лямбды (по существу сжатые анонимные внутренние классы), которые неявно преобразуются в объекты.
- для полноты (и Paŭlo Ebermann), есть некоторый синтаксис с new ключевое слово, а также.
в языке Java единственный способ создать объект-вызвать его конструктор, будь то явно или неявно. Использование отражения приводит к вызову метода конструктора, десериализация использует отражение для вызова конструктора, заводские методы обертывают вызов конструктора для абстракции фактической конструкции, а клонирование аналогично вызову обернутого конструктора.
Да, вы можете создавать объекты с помощью отражения. Например, String.class.newInstance() даст вам новый пустой объект String.
также вы можете использовать
Это следует заметить, если вы новичок в java, каждый объект унаследовал от Object
защищенный собственный объект clone () бросает CloneNotSupportedException;
кроме того, вы можете де-сериализовать данные в объект. Это не проходит через конструктор класса !
обновлено: спасибо тому, что указал на это в своем комментарии ! И Майкл тоже экспериментировал.
Он проходит через конструктор самого производного несериализуемого суперкласса.
И когда этот класс не имеет конструктора no-args, создается исключение InvalidClassException де-сериализации.
существует тип объекта, который не может быть построен обычными механизмами создания экземпляра (вызывающими конструкторами):массивы. Массивы создаются с помощью
как сказал Шон в комментарии, это синтаксически похоже на вызов конструктора, и внутренне это не намного больше, чем выделение и нулевая инициализация (или инициализация с явным содержимым, во втором случае) блока памяти с некоторым заголовком для указания типа и длина.
при передаче аргументов методу varargs массив создается (и заполняется) неявно.
четвертый способ был бы
конечно, клонирование и десериализация здесь тоже работает.
В стандартном API есть много методов, которые создают массивы, но все они фактически используют один (или несколько) из этих способов.
существует пять различных способов создания объекта в Java,
1. Используя new ключевое слово → конструктор вызывается
2. Используя newInstance() метод Class → конструктор вызывается
он также может быть записан как
3. Используя newInstance() метод Constructor → конструктор вызывается
4. Используя clone() метод → нет вызова конструктора
5. Использование десериализации → нет вызова конструктора
первые три метода new ключевое слово и как newInstance() включить вызов конструктора, но позже два метода клонирования и десериализации создают объекты без вызова конструктора.
все вышеуказанные методы имеют различный байт-код, связанный с ними, прочитайте различные способы создания объектов в Java с Пример для примеров и более подробного описания, например, преобразование байт-кода всех этих методов.
однако можно утверждать, что создание массива или строкового объекта также является способом создания объекта, но эти вещи более специфичны только для некоторых классов и обрабатываются непосредственно JVM, в то время как мы можем создать объект любого класса, используя эти 5 способов.
другие способы, если мы будем исчерпывающими.
- на Oracle JVM небезопасно.allocateInstance (), который создает экземпляр без вызова конструктора.
- используя манипуляцию байтовым кодом, вы можете добавить код в anewarray , multianewarray , newarray или new . Они могут быть добавлены с помощью библиотек, таких как ASM или BCEL. Версия bcel поставляется с Java Oracle. Опять же, это не вызывает конструктор, но вы можете вызвать конструктор как отдельный вызов.
Отражение также сделает работу за вас.
— это еще один способ создания нового экземпляра класса. В этом случае вам также потребуется обработать исключения, которые могут быть брошены.
- С помощью new оператор (таким образом, вызывая конструктор)
- С помощью отражения clazz.newInstance() (который снова вызывает конструктор). Или clazz.getConstructor(..).newInstance(..) (опять же с помощью конструктора, но вы можете выбрать, какой из них)
чтобы суммировать ответ-один из основных способов-путем вызова конструктора класса объекта.
Update: в другом ответе перечислены два способа, которые не связаны с использованием конструктора-десерализация и клонирование.
вы также можете клонировать существующий объект (если он реализует Cloneable).
существует пять различных способов создания объектов в Java:
1. С помощью ключевого слова new:
это наиболее распространенный способ создания объекта в Java. Таким образом создается почти 99% объектов.
2. Используя Заводской Метод:
3. Используя Концепцию Клонирования:
С помощью clone() на clone() можно использовать для создания копии существующего объект.
4. С Помощью Класса.forName()`:
если мы знаем имя класса, и если у него есть конструктор по умолчанию, мы можем создать объект таким образом.
5. Использование десериализации объектов:
десериализация объекта — это не что иное, как создание объекта из его сериализованной формы.
использование нового ключевого слова. Это наиболее распространенный способ создания объекта в Java. Таким образом создается почти 99% объектов.
Использование Класса.forName(). Класс.forName () дает вам объект класса, который полезен для отражения. Методы, которые имеет этот объект, определяются Java, а не программистом, пишущим класс. Они одинаковы для каждого класса. Вызов newInstance() на этом дает вам экземпляр этот класс (т. е. callingClass.forName («ExampleClass»).newInstance () это эквивалентно вызову new ExampleClass ()), на котором вы можете вызвать методы, которые определяет класс, получить доступ к видимым полям и т. д.
класса.forName () всегда будет использовать ClassLoader вызывающего, тогда как ClassLoader.loadClass () может указать другой загрузчик классов. Я верю этому классу.forName инициализирует также загруженный класс, тогда как ClassLoader.подход loadClass() не делает этого правильно прочь (он не инициализируется, пока не будет использоваться в первый раз).
другое читать надо:
Java: введение состояния потока с примером Простой Пример Перечисления Java
использование clone(). Clone () можно использовать для создания копии существующего объекта.
использование метода newInstance ()
Использование Десериализации Объектов. Объект десериализации ничего, кроме создания объекта из его сериализованной формы.
с точки зрения пользователя API другой альтернативой конструкторам являются статические заводские методы (например, BigInteger.valueOf ()), хотя для автора API (и технически «для реального») объекты по-прежнему создаются с помощью конструктора.
зависит именно от того, что вы подразумеваете под create, но некоторые другие:
- метод clone
- десериализации
- Отражение (Класс.newInstance ())
- отражение (объект) конструктор
есть также загрузчиком.loadClass (string), но это не часто используется.
и если вы хотите быть полным юристом об этом, массивы технически объекты из-за массива .свойство length. таким образом, инициализация массива создает объект.
мы можем создавать объекты 5 способами:
- новый оператор
- по отражению (например, класс.forName (), за которым следует Class.newInstance ())
- заводским методом
- клонированием
- по отражению api
мы также можем создать объект таким образом:-
Источник