Java에서 객체를 생성하는 방법: 1. new 키워드를 사용합니다. 2. 매개변수 없는 생성자를 호출하여 객체를 생성할 수 있는 newInstance 메서드를 사용합니다. 3. 생성자 클래스의 newInstance 메서드를 사용합니다. 4. 복제 방법을 사용하십시오. 5, 역직렬화를 사용하십시오.
이 튜토리얼의 운영 환경: windows7 시스템, java8 버전, DELL G3 컴퓨터.
Java 개발자로서 우리는 매일 많은 객체를 생성하지만 일반적으로 Spring과 같은 종속성 관리 시스템을 사용하여 객체를 생성합니다. 그러나 객체를 생성하는 방법에는 여러 가지가 있으며, 이 기사에서는 이에 대해 알아볼 것입니다.
Java에서 객체를 생성하는 방법에는 5가지가 있습니다. 해당 예제와 바이트코드는 다음과 같습니다
Using the new 키워드 | } → 생성자가 호출됩니다 |
Class 클래스 newInstance 메소드 사용 | } → 생성자가 호출되었습니다 |
생성자 클래스의 newInstance 메소드를 사용하여 | } → 생성자가 호출되었습니다 |
clone 메소드를 사용하여 | } → 생성자가 호출되지 않았습니다 |
역직렬화 변경을 사용하여 | } → 생성자가 호출되지 않음 |
프로그램을 마지막에 실행해 보면 메소드 1, 2, 3은 생성자를 사용하여 객체를 생성하고, 메소드 4, 5는 생성자를 호출하지 않는 것을 확인할 수 있습니다. .
를 사용하세요. 이는 개체를 만드는 가장 일반적이고 간단한 방법입니다. 이런 방식으로 우리는 어떤 생성자(매개변수가 없거나 매개변수화된)를 호출할 수 있습니다.
Employee emp1 = new Employee(); 0: new #19 // class org/programming/mitra/exercises/Employee 3: dup 4: invokespecial #21 // Method org/programming/mitra/exercises/Employee."":()V
Class 클래스의 newInstance 메소드를 사용하여 객체를 생성할 수도 있습니다. 이 newInstance 메소드는 매개변수가 없는 생성자를 호출하여 객체를 생성합니다.
다음과 같은 방법으로 newInstance 메소드를 호출하여 객체를 생성할 수 있습니다.
Employee emp2 = (Employee) Class.forName("org.programming.mitra.exercises.Employee").newInstance(); 或者 Employee emp2 = Employee.class.newInstance(); 51: invokevirtual #70 // Method java/lang/Class.newInstance:()Ljava/lang/Object;
Class 클래스의 newInstance 메소드와 매우 유사합니다. java.lang.reflect.Constructor 클래스의 newInstance 메소드 객체를 생성할 수 있습니다. 이 newInstance 메소드를 통해 매개변수화된 생성자와 전용 생성자를 호출할 수 있습니다.
Constructor<Employee> constructor = Employee.class.getConstructor(); Employee emp3 = constructor.newInstance(); 111: invokevirtual #80 // Method java/lang/reflect/Constructor.newInstance:([Ljava/lang/Object;)Ljava/lang/Object;
이 두 가지 newInstance 메소드는 모두가 리플렉션이라고 부르는 것입니다. 실제로 Class의 newInstance 메소드는 Constructor의 newInstance 메소드를 내부적으로 호출합니다. 이는 Spring, Hibernate, Struts 등과 같은 많은 프레임워크가 후자를 사용하는 이유이기도 합니다. 두 가지 newInstance 메소드의 차이점을 이해하려면 예제를 사용하여 Java에서 Reflection을 통해 객체 만들기 문서를 읽어보세요.
객체의 복제 메소드를 호출할 때마다 jvm이 객체를 생성합니다. 새 개체의 경우 이전 개체의 모든 내용을 복사합니다. clone 메소드를 사용하여 객체를 생성해도 생성자는 호출되지 않습니다.
clone 메소드를 사용하려면 먼저 Cloneable 인터페이스를 구현하고 정의된 clone 메소드를 구현해야 합니다.
Employee emp4 = (Employee) emp3.clone(); 162: invokevirtual #87 // Method org/programming/mitra/exercises/Employee.clone ()Ljava/lang/Object;
객체를 직렬화 및 역직렬화하면 jvm이 별도의 객체를 생성합니다. 역직렬화 중에 jvm은 객체를 생성하고 생성자를 호출하지 않습니다.
객체를 역직렬화하려면 클래스가 직렬화 가능 인터페이스를 구현하도록 해야 합니다
ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj")); Employee emp5 = (Employee) in.readObject(); 261: invokevirtual #118 // Method java/io/ObjectInputStream.readObject:()Ljava/lang/Object;
위의 바이트코드 스니펫에서 첫 번째 메소드를 제외하고 나머지 4개 메소드가 모두 Invokevirtual로 변환된다는 것을 알 수 있습니다(객체 직접 메소드 생성) ), 첫 번째 메서드는 new 및 Invokespecial(생성자 호출)이라는 두 가지 호출로 전환됩니다.
다음 Employee 클래스에 대한 객체 생성을 살펴보겠습니다.
class Employee implements Cloneable, Serializable { private static final long serialVersionUID = 1L; private String name; public Employee() { System.out.println("Employee Constructor Called..."); } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Employee other = (Employee) obj; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } @Override public String toString() { return "Employee [name=" + name + "]"; } @Override public Object clone() { Object obj = null; try { obj = super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return obj; } }
다음 Java 프로그램에서는 5가지 방법으로 Employee 객체를 생성합니다. GitHub에서 코드를 찾을 수 있습니다.
public class ObjectCreation { public static void main(String... args) throws Exception { // By using new keyword Employee emp1 = new Employee(); emp1.setName("Naresh"); System.out.println(emp1 + ", hashcode : " + emp1.hashCode()); // By using Class class's newInstance() method Employee emp2 = (Employee) Class.forName("org.programming.mitra.exercises.Employee") .newInstance(); // Or we can simply do this // Employee emp2 = Employee.class.newInstance(); emp2.setName("Rishi"); System.out.println(emp2 + ", hashcode : " + emp2.hashCode()); // By using Constructor class's newInstance() method Constructor<Employee> constructor = Employee.class.getConstructor(); Employee emp3 = constructor.newInstance(); emp3.setName("Yogesh"); System.out.println(emp3 + ", hashcode : " + emp3.hashCode()); // By using clone() method Employee emp4 = (Employee) emp3.clone(); emp4.setName("Atul"); System.out.println(emp4 + ", hashcode : " + emp4.hashCode()); // By using Deserialization // Serialization ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("data.obj")); out.writeObject(emp4); out.close(); //Deserialization ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj")); Employee emp5 = (Employee) in.readObject(); in.close(); emp5.setName("Akash"); System.out.println(emp5 + ", hashcode : " + emp5.hashCode()); } }
프로그램 출력:
Employee Constructor Called... Employee [name=Naresh], hashcode : -1968815046 Employee Constructor Called... Employee [name=Rishi], hashcode : 78970652 Employee Constructor Called... Employee [name=Yogesh], hashcode : -1641292792 Employee [name=Atul], hashcode : 2051657 Employee [name=Akash], hashcode : 63313419
권장 관련 비디오 튜토리얼: Java 비디오 튜토리얼
위 내용은 자바에서 객체를 생성하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!