Был разговор с коллегой на днях об этом.
Там очевидно, что нужно использовать конструктор, но какие существуют другие способы?
Был разговор с коллегой на днях об этом.
Там очевидно, что нужно использовать конструктор, но какие существуют другие способы?
Существует четыре разных способа создания объектов в 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();
Вы можете читать здесь
Существуют различные способы:
Class.newInstance
.Constructor.newInstance
.Object.clone
(не вызывает конструктор).new
для вас.String
s)....
) (нет конструктора для массивов).throw null;
или "".toCharArray()[0]
.new
.В языке Java единственным способом создания объекта является вызов его конструктора, будь то явно или неявно. Использование отражения приводит к вызову метода конструктора, десериализация использует отражение для вызова конструктора, методы factory обертывают вызов конструктору для абстрагирования фактической конструкции, а клонирование - это вызов завершенного конструктора.
Да, вы можете создавать объекты с использованием отражения. Например, String.class.newInstance()
предоставит вам новый пустой объект String.
Есть пять разных способов создания объекта в 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 способов.
Также вы можете использовать
Object myObj = Class.forName("your.cClass").newInstance();
Это следует заметить, если вы новичок в java, каждый объект унаследовал от Object
protected native Object clone() выдает CloneNotSupportedException;
Кроме того, вы можете де-сериализовать данные в объект. Это не проходит через класс Constructor!
ОБНОВЛЕНО: Спасибо, Том, указав это в комментариях! И Майкл также экспериментировал.
Он проходит через конструктор самого производного несериализуемого суперкласса.
И когда этот класс не имеет конструктора no-args, исключение InvalidClassException вызывается при де-сериализации.
Пожалуйста, см. ответ Том для полного лечения всех случаев;-)
существует ли другой способ создания объекта без использования" new " ключевое слово в java
Существует тип объекта, который не может быть создан с помощью механизмов создания обычных экземпляров (вызывающих конструкторов): Массивы. Массивы создаются с помощью
A[] array = new A[len];
или
A[] array = new A[] { value0, value1, value2 };
Как сказал Шон в комментарии, это синтаксически похоже на вызов конструктора и внутренне это не намного больше, чем распределение и нуль-инициализация (или инициализация с явным содержимым во втором случае) блоком памяти с некоторым заголовком для указания типа и длины.
При передаче аргументов в varargs-метод массив также создается (и заполняется) неявно.
Четвертым способом будет
A[] array = (A[]) Array.newInstance(A.class, len);
Конечно, здесь работает клонирование и десериализация.
В стандартном API есть много методов, которые создают массивы, но все они фактически используют один или несколько из этих способов.
Другие способы, если мы являемся исчерпывающими.
anewarray
, multianewarray
, newarray
или new
. Они могут быть добавлены с использованием библиотек, таких как ASM или BCEL. Версия bcel поставляется с Oracle Java. Опять же это не вызывает конструктор, но вы можете вызвать конструктор как отдельный вызов.Отражение:
someClass.newInstance();
Отражение также выполнит эту работу для вас.
SomeClass anObj = SomeClass.class.newInstance();
- это еще один способ создать новый экземпляр класса. В этом случае вам также придется обрабатывать исключения, которые могут быть сброшены.
new
(тем самым вызывая конструктор)clazz.newInstance()
(которое снова вызывает конструктор). Или через clazz.getConstructor(..).newInstance(..)
(снова используя конструктор, но вы можете, таким образом, выбрать, какой)Подводя итог ответу - один из основных способов - путем вызова конструктора класса объекта.
Обновление: в другом ответе перечислены два пути, которые не связаны с использованием конструктора - десарализация и клонирование.
Вы также можете клонировать существующий объект (если он реализует Cloneable).
Foo fooClone = fooOriginal.clone ();
Существует пять способов создания объектов в Java:
Это самый распространенный способ создания объекта в Java. Таким образом создаются почти 99% объектов.
MyObject object = new MyObject();//normal way
ClassName ObgRef=ClassName.FactoryMethod();
Пример:
RunTime rt=Runtime.getRunTime();//Static Factory Method
Используя clone()
, clone()
можно использовать для создания копии существующего объекта.
MyObjectName anotherObject = new MyObjectName();
MyObjectName object = anotherObjectName.clone();//cloning Object
Если мы знаем имя класса и если у него есть общедоступный конструктор по умолчанию, мы можем создать объект таким образом.
MyObjectName object = (MyObjectNmae) Class.forName("PackageName.ClassName").newInstance();
Пример:
String st=(String)Class.forName("java.lang.String").newInstance();
десериализация объектов - это не что иное, как создание объекта из его сериализованной формы.
ObjectInputStreamName inStream = new ObjectInputStreamName(anInputStream );
MyObjectName object = (MyObjectNmae) inStream.readObject();
Способ 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();
С точки зрения пользователя API другой альтернативой конструкторам являются статические методы factory (например, BigInteger.valueOf()), хотя для автора API (и технически "для реального" ) объекты все еще создаются с использованием конструктора.
В зависимости от того, что вы подразумеваете под созданием, но некоторые другие:
существует также ClassLoader.loadClass(строка), но это не часто используется.
и если вы хотите быть полным юристом, массивы являются технически объектами из-за свойства массива .length. поэтому инициализация массива создает объект.
Мы можем создавать объекты по 5 способами:
Мы также можем создать объект таким образом: -
String s ="Hello";
Никто не обсуждает это.