Каковы различные способы создания объекта в Java? - PullRequest
167 голосов
/ 18 сентября 2008

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

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

Ответы [ 22 ]

274 голосов
/ 24 февраля 2011

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

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

 MyObject object = new MyObject();

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

MyObject object = (MyObject) Class.forName("subin.rnd.MyObject").newInstance();

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

MyObject anotherObject = new MyObject();
MyObject object = (MyObject) anotherObject.clone();

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

ObjectInputStream inStream = new ObjectInputStream(anInputStream );
MyObject object = (MyObject) inStream.readObject();

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

66 голосов
/ 20 января 2010

Существуют различные способы:

  • Через Class.newInstance.
  • Через Constructor.newInstance.
  • Посредством десериализации (используется конструктор без аргументов наиболее производного несериализуемого базового класса).
  • Через Object.clone ( не вызывает конструктор ).
  • Через JNI (должен вызывать конструктор).
  • С помощью любого другого метода, который вызывает для вас new.
  • Полагаю, вы можете описать загрузку классов как создание новых объектов (например, интернированных String с).
  • Литеральный массив как часть инициализации в объявлении (без конструктора для массивов).
  • Массив в вызове метода "varargs" (...) (без конструктора для массивов).
  • Некомпиляция конкатенации строк с постоянной времени (в типичной реализации получается не менее четырех объектов).
  • Вызывает исключение, которое будет создано и выдано средой выполнения. Например throw null; или "".toCharArray()[0].
  • Да, и бокс примитивов (если не кешируется), конечно.
  • JDK8 должен иметь лямбды (по сути, краткие анонимные внутренние классы), которые неявно преобразуются в объекты.
  • Для полноты (и для Paŭlo Ebermann) есть синтаксис с ключевым словом new.
25 голосов
/ 18 сентября 2008

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

13 голосов
/ 20 января 2010

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

10 голосов
/ 19 ноября 2016

Существует пять различных способов создания объекта в Java,

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

Employee emp1 = new Employee();

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

Employee emp2 = (Employee) Class.forName("org.programming.mitra.exercises.Employee")
                                .newInstance();

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

Employee emp2 = Employee.class.newInstance();

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

Constructor<Employee> constructor = Employee.class.getConstructor();
Employee emp3 = constructor.newInstance();

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

Employee emp4 = (Employee) emp3.clone();

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

ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj"));
Employee emp5 = (Employee) in.readObject();

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

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

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

9 голосов
/ 18 сентября 2008
6 голосов
/ 24 февраля 2011

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

 A[] array = new A[len];

или

 A[] array = new A[] { value0, value1, value2 };

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

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

Четвертый путь будет

 A[] array = (A[]) Array.newInstance(A.class, len);

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

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

6 голосов
/ 20 января 2010

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


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

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

Пожалуйста, смотрите ответ Тома для полного лечения всех случаев; -)
есть ли другой способ создания объекта без использования ключевого слова "new" в java

6 голосов
/ 20 января 2010

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

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

6 голосов
/ 20 января 2010

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

 Object myObj = Class.forName("your.cClass").newInstance();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...