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

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

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

Ответы [ 22 ]

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

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

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

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

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

4 голосов
/ 18 сентября 2008

Отражение:

someClass.newInstance();
4 голосов
/ 20 января 2010

Reflection также сделает всю работу за вас.

SomeClass anObj = SomeClass.class.newInstance();

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

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

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

Foo fooClone = fooOriginal.clone (); 
3 голосов
/ 14 мая 2011

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

1. Используя ключевое слово `new`:

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

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

2. Используя фабричный метод:

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();
2 голосов
/ 09 июля 2015

Метод 1

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

Employee object = new Employee();

Метод 2

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

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

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

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

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

Метод 3

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

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

Метод 4

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

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

Метод 5

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

// 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();
0 голосов
/ 24 июня 2014

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

String s ="Hello";

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

0 голосов
/ 26 августа 2011

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

  1. новым оператором
  2. отражением (например, Class.forName (), за которым следует Class.newInstance ())
  3. по заводскому методу
  4. путем клонирования
  5. по отражению api
0 голосов
/ 18 сентября 2008

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

  • Метод клонирования
  • Десериализация
  • Отражение (Class.newInstance ())
  • Отражение (объект-конструктор)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...