Каковы все различные способы создания объекта в Java?

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

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

Ответ 1

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

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

 MyObject object = new MyObject();

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

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

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

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

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

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

Вы можете читать здесь

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

Ответ 6

Есть пять разных способов создания объекта в 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, вызывается

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 способов.

Ответ 7

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

 Object myObj = Class.forName("your.cClass").newInstance();

Ответ 8

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

protected native Object clone() выдает CloneNotSupportedException;

Ответ 9

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


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

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

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

Ответ 10

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

 A[] array = new A[len];

или

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

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

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

Четвертым способом будет

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

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

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

Ответ 11

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

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

Ответ 12

Отражение:

someClass.newInstance();

Ответ 13

Отражение также выполнит эту работу для вас.

SomeClass anObj = SomeClass.class.newInstance();

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

Ответ 14

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

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

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

Ответ 15

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

Foo fooClone = fooOriginal.clone (); 

Ответ 16

Существует пять способов создания объектов в Java:

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

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

MyObject object = new MyObject();//normal way

2. Используя метод Factory:

ClassName ObgRef=ClassName.FactoryMethod();

Пример:

RunTime rt=Runtime.getRunTime();//Static Factory Method

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

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

MyObjectName anotherObject = new MyObjectName();
MyObjectName object = anotherObjectName.clone();//cloning Object

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

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

MyObjectName object = (MyObjectNmae) Class.forName("PackageName.ClassName").newInstance();

Пример:

String st=(String)Class.forName("java.lang.String").newInstance();

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

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

ObjectInputStreamName inStream = new ObjectInputStreamName(anInputStream );
MyObjectName object = (MyObjectNmae) inStream.readObject();

Ответ 17

Способ 1

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

Employee object = new Employee();

Способ 2

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

Employee object2 = (Employee) Class.forName(NewEmployee).newInstance();

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

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

Java: представление состояния потока с примером Простой пример Java Enum

Способ 3

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

Employee secondObject = new Employee();
Employee object3 = (Employee) secondObject.clone();

Метод 4

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

Object object4 = Employee.class.getClassLoader().loadClass(NewEmployee).newInstance();

Метод 5

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

// Create Object5
// create a new file with an ObjectOutputStream
FileOutputStream out = new FileOutputStream("");
ObjectOutputStream oout = new ObjectOutputStream(out);

// write something in the file
oout.writeObject(object3);
oout.flush();

// create an ObjectInputStream for the file we created before
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("crunchify.txt"));
Employee object5 = (Employee) ois.readObject();

Ответ 18

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

Ответ 19

В зависимости от того, что вы подразумеваете под созданием, но некоторые другие:

  • Метод клонирования
  • Десериализация
  • Отражение (Class.newInstance())
  • Отражение (объект конструктора)

Ответ 20

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

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

Ответ 21

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

  • новым оператором
  • путем отражения (например, Class.forName(), за которым следует Class.newInstance())
  • методом factory
  • путем клонирования
  • отражением api

Ответ 22

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

String s ="Hello";

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