Какие способы создания объектов существуют

Bannikherafarm

Adrian Mitchell | Главный редактор | E-mail

Руководство по Android Studio для начинающих — 30 | Всплеск активности | Приветственное мероприятие (издание 2019 г.)

На днях разговаривал об этом с коллегой.

Использование конструктора очевидно, но каковы другие способы?

  • 2 Если сомневаетесь, посмотрите спецификацию языка. 12.5 Создание новых экземпляров класса java.sun.com/docs/books/jls/third_edition/html/… 15.9 Выражения создания экземпляра класса java.sun.com/docs/books/jls/third_edition/html/…
  • 9 только 3: нормальный c-tor (новое ключевое слово), clone () и Unsafe.allocateInstance(Class) . Остальные называют одним из таких. Отражение компилируется в вызов c-tor, десериализация — в Unsafe.allocateInstance (Class). Вы можете создать свой собственный API, и в конечном итоге вы вызовете один из них.
  • 2 @ bestsss- Unsafe является деталью Java, зависящей от реализации, и нигде в спецификации не упоминается. Вполне возможно создать совместимую реализацию Java, которая не использует отражение компиляции, вплоть до кода, который использует new , clone , или же Unsafe.allocateInstance .
  • 2 вы можете проверить ссылку ,codeandlogics.com/2017/01/ways-to-create-objects-in-java.html
  • javabench.in/2015/04/how-many-ways-we-can-create-object-in.html

Есть четыре разных способа создания объектов в java:

А. С помощью new ключевое слово
Это наиболее распространенный способ создания объекта в java. Таким образом создается почти 99% объектов.

B. С помощью Class.forName()
Если мы знаем имя класса и у него есть общедоступный конструктор по умолчанию, мы можем создать объект таким образом.

C. С помощью clone()
Clone () можно использовать для создания копии существующего объекта.

D. С помощью object deserialization
Десериализация объекта — это не что иное, как создание объекта из его сериализованной формы.

Вы можете прочитать их здесь.

  • 10 Итак, на самом деле существует только два способа: вызов конструктора (с использованием new, clone () или отражения) и десериализация, которая не вызывает конструктор.
  • 13 @AlexR: Object.clone() тоже не вызывает конструктор.
  • 1 Поскольку это кажется ответом вверху, не могли бы вы добавить создание массивов в качестве подвариантов к A и B? (Подробнее см. Мой ответ).
  • Десериализация действительно вызывает конструктор, но не самого производного типа.
  • 2 Также следует упомянуть Constructor класс, который обобщает Class.newInstance .

Есть разные способы:

  • Через Class.newInstance .
  • Через Constructor.newInstance .
  • Посредством десериализации (использует конструктор без аргументов самого производного несериализуемого базового класса).
  • Через Object.clone (не вызывает конструктор).
  • Через JNI (должен вызывать конструктор).
  • Любым другим методом, вызывающим new для вас.
  • Я думаю, вы могли бы описать загрузку класса как создание новых объектов (например, интернированных String с).
  • Литеральный массив как часть инициализации в объявлении (без конструктора для массивов).
  • Массив в «varargs» ( . ) вызов метода (нет конструктора для массивов).
  • Конкатенация строк с константой времени без компиляции (в типичной реализации получается как минимум четыре объекта).
  • Вызывает исключение, которое создается и генерируется средой выполнения. Например throw null; или же ».toCharArray()[0] .
  • Да, и бокс примитивов (если не кешировать), конечно.
  • JDK8 должен иметь лямбды (по сути, краткие анонимные внутренние классы), которые неявно преобразуются в объекты.
  • Для полноты (и Pa lo Ebermann) есть некоторый синтаксис с new ключевое слово.
  • 6 Вам также следует добавить «нормальный способ» 🙂
  • @ Pa lo Ebermann Это такая старая школа и некрутая. (Я предположил, что вопрос имел в виду «использовать конструктор (хотя большинство, но не все, из вышеперечисленных действительно используют конструктор / a где-то вдоль линии).
  • на самом деле есть только 3 реальных способа сделать это, к которым я добавил комментарий
  • 3 Вы пропустили один: java.misc.Unsafe.allocateInstance() . Хотя это неприятно по ряду причин. И на самом деле десериализация не использует конструктор no-args. Под капотом он использует allocateInstance или эквивалент черной магии.
  • Лучший ответ, но JNI AllocObject(). не вызывает конструктор.
Читайте также:  Способы сохранения денег во время кризиса

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

  • 1 Неправильно. Deserializatio не вызывает конструктор класса явно или неявно.
  • 2 Мне следовало писать не «его конструктор» и «конструктор», а «конструктор» и «конструктор». В случае десериализации всегда вызывается первый применимый конструктор без аргументов.
  • 1 Реализация клона по умолчанию не вызывает никаких конструкторов.
  • если это моя реализация метода клонирования «return super.clone ();». Тогда он не будет вызывать конструктор.

Да, вы можете создавать объекты с помощью отражения. Например, String.class.newInstance() предоставит вам новый пустой объект String.

  • 1, если я использую это, меня просят заключить в блок try / catch.
  • 2 Да, есть много случаев, когда могут возникать исключения. См. JavaDoc для newInstance (), где приведены примеры того, что может пойти не так.

Есть пять различных способов создать объект в Java:

1. Использование new ключевое слово → вызывается конструктор

2. Использование newInstance() метод Class → вызывается конструктор

Его также можно записать как

3. Использование newInstance() метод Constructor → вызывается конструктор

4. Использование clone() метод → без вызова конструктора

5. Использование десериализации → без вызова конструктора

Первые три метода new ключевое слово и оба newInstance() включить вызов конструктора, но позже два метода клонирования и десериализации создают объекты без вызова конструктора.

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

Однако можно утверждать, что создание массива или строкового объекта также является способом создания объекта, но эти вещи более специфичны только для некоторых классов и обрабатываются напрямую JVM, в то время как мы можем создать объект любого класса, используя эти 5 способов.

  • Пожалуйста, сообщайте о любой аффилированности и не используйте сайт как способ продвижения вашего сайта посредством публикации. См. Как мне написать хороший ответ ?.

Клонирование и десериализация.

Также вы можете использовать

Это следует заметить, если вы новичок в java, каждый объект унаследован от Object

защищенный собственный объект Clone () выдает исключение CloneNotSupportedException;

  • @stacker: Не могли бы вы объяснить, как это связано с созданием нового объекта? Благодарю.
  • 4 @ryanprayogo clone () вернет новый объект (даже если объект является клоном объекта, для которого был вызван clone ()) и фактически является единственным способом создать новый объект без вызова конструктора.

Также вы можете десериализовать данные в объект. Это не проходит через конструктор классов!

ОБНОВЛЕНО : Спасибо, Том, что указал на это в своем комментарии! И Майкл тоже экспериментировал.

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

Пожалуйста, смотрите ответ Тома для полного описания всех случаев 😉
есть ли другой способ создания объекта без использования ключевого слова «новое» в java

  • 1 Он действительно проходит через конструктор (конструктор без аргументов самого производного несериализуемого суперкласса).
  • 1 @Tom Ого, я этого не знал и немного поэкспериментировал. Очевидно, когда самый производный несериализуемый суперкласс не имеет конструктор без аргументов, это приводит к InvalidClassException сериализуется в поток и выбрасывается при десериализации !! — Насколько это странно?
Читайте также:  Самые лучшие способы диеты

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

Как сказал Шон в комментарии, это синтаксически похоже на вызов конструктора, а внутренне это не что иное, как выделение и инициализация нуля (или инициализация с явным содержимым, во втором случае) блока памяти с некоторым заголовком, чтобы указать тип и длина.

При передаче аргументов в метод varargs массив также создается (и заполняется) неявно.

Четвертый способ был бы

Конечно, здесь тоже работают клонирование и десериализация.

В стандартном API есть много методов, которые создают массивы, но на самом деле все они используют один (или несколько) из этих способов.

  • Конечно, вы не можете определить конструкторы Array, но в остальном механизм тот же new ключевое слово. Array.newInstance — единственный новый механизм здесь
  • @Sean: Это то же самое ключевое слово, но, смею сказать, это совсем другой внутренний механизм.
  • Это правда, конечно. Но, с другой стороны, разные версии создания массива внутренне во многом одинаковы. Только что понял, что ваш ответ был из 2011 года. Извините за то, что взбудоражил старые вещи 🙂
  • @ Шон: Нет проблем, я воспользовался этим случаем, чтобы поправить грамматику.
  • хорошая работа, здесь никто не обсуждал массивы!

Другие способы, если мы исчерпываем.

  • В Oracle JVM используется Unsafe.allocateInstance (), который создает экземпляр без вызова конструктора.
  • Используя манипуляции с байтовым кодом, вы можете добавить код в anewarray , multianewarray , newarray или же new . Их можно добавить с помощью таких библиотек, как ASM или BCEL. Версия bcel поставляется с Oracle Java. Опять же, это не вызывает конструктор, но вы можете вызвать конструктор как отдельный вызов.

Отражение также сделает работу за вас.

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

  • используя new оператор (вызывая конструктор)
  • используя отражение clazz.newInstance() (который снова вызывает конструктор). Или по clazz.getConstructor(..).newInstance(..) (снова с помощью конструктора, но вы можете выбрать, какой именно)

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

Обновление: в другом ответе перечислены два способа, которые не связаны с использованием конструктора — десерализация и клонирование.

Существует ПЯТЬ различных способов создания объектов в Java:

1. Использование ключевого слова `new`:

Это наиболее распространенный способ создания объекта в Java. Таким образом создается почти 99% объектов.

2. Используя заводской метод:

3. Используя концепцию клонирования:

Используя clone() , то clone() может использоваться для создания копии существующего объекта.

4. Использование `Class.forName ()`:

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

5. Использование десериализации объекта:

Десериализация объекта — это не что иное, как создание объекта из его сериализованной формы.

  • (4) требуется только Class.forName() если у вас еще нет класса, что во всех остальных случаях есть. Он также не требует конструктора без аргументов: есть способы вызвать любой общедоступный конструктор, если вы знаете правильные аргументы. И вы упустили как минимум два других пути.
  • 2 (2) Заводской метод — это просто шаблон для получения объектов. Но внутри он использует ключевое слово «новое» для создания объектов.
  • чувак, почему так много людей говорят, что фабричный метод создает объекты, откуда вы, ребята, этому научились?

Вы также можете клонировать существующий объект (если он реализует Cloneable).

Используя новое ключевое слово. Это наиболее распространенный способ создания объекта в java. Таким образом создается почти 99% объектов.

Читайте также:  Как очистить организм от никотина если бросил курить способы

Использование Class.forName (). Class.forName () дает вам объект класса, который полезен для отражения. Методы, которые имеет этот объект, определяются Java, а не программистом, пишущим класс. Они одинаковы для всех классов. Вызов newInstance () для этого дает вам экземпляр этого класса (т.е. callClass.forName («ExampleClass»). NewInstance () это эквивалентно вызову new ExampleClass ()), для которого вы можете вызывать методы, которые определяет класс, доступ к видимым полям и т. д.

Class.forName () всегда будет использовать ClassLoader вызывающего, тогда как ClassLoader.loadClass () может указывать другой ClassLoader. Я считаю, что Class.forName также инициализирует загруженный класс, тогда как подход ClassLoader.loadClass () не делает этого сразу (он не инициализируется, пока не будет использован в первый раз) .

Другой должен прочитать:

Java: введение в состояние потока с примером простого примера перечисления Java

Использование clone (). Clone () можно использовать для создания копии существующего объекта.

Использование метода newInstance ()

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

  • Не используйте форматирование кода для текста, не являющегося кодом. Есть больше методов, чем эти. Прочтите другие ответы. «Почти 99%» — это просто догадки.
  • Привет, EJP, извините за эту ошибку . Я сказал, что это один из способов создания объектов, не говоря уже о том, что он правильный. Это просто модель . и извините, я новичок и новичок в stackoverflow

С точки зрения пользователя API, другой альтернативой конструкторам являются статические фабричные методы (например, BigInteger.valueOf ()), хотя для автора API (и технически «по-настоящему») объекты по-прежнему создаются с помощью конструктора.

Точно зависит от того, что вы подразумеваете под словом «создать», но есть и другие:

  • Метод клонирования
  • Десериализация
  • Отражение (Class.newInstance ())
  • Отражение (объект-конструктор)
  • 2 3 и 4 — разные псевдонимы для одного и того же механизма

есть также ClassLoader.loadClass (строка), но он не часто используется.

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

  • 1 loadClass (String name) возвращает результирующий объект Class, который является объектом yes Но не объектом этого класса. Если приведены примеры, то мы можем найти множество таких примеров в java-библиотеке, но они будут специфичными для класса. проверьте youtu.be/gGGCmrD6Qpw

Мы можем создавать объекты 5 способами:

  1. новым оператором
  2. путем отражения (например, Class.forName (), за которым следует Class.newInstance ())
  3. заводским способом
  4. путем клонирования
  5. по отражению api
  • 3 Class.forName () загружает класс, а не создает объект.
  • отражение? Вы, конечно, имеете в виду размышления.
  • как бы вы создали объект из фабричного метода, внутренняя реализация может снова использовать новое ключевое слово, верно? а почему у вас отражение дважды? Было бы лучше, если бы вы на самом деле дали несколько примеров

Мы также можем создать объект таким образом: —

Никто это не обсуждал.

  • Это способ создания примитивных типов данных, это просто гибкость, которую Java предоставляет за кулисами, чтобы не использовать ключевое слово «new». Это то же самое, что и ключевое слово new.
  • Мадхусудан, к сведению, с помощью оператора new объекты всегда должны храниться в куче, а в этом случае «Hello» — это объект, который следует хранить в пуле строк. А String — это класс, а не примитивный тип данных.
  • Это не создает объект. Он назначает ссылку на существующий объект. Объект уже был создан компилятором и загрузчиком классов.

Источник

Оцените статью
Разные способы