>  기사  >  Java  >  자바에서 객체를 생성하는 방법

자바에서 객체를 생성하는 방법

青灯夜游
青灯夜游원래의
2021-04-25 14:44:0926514검색

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는 생성자를 호출하지 않는 것을 확인할 수 있습니다. .

1. 새로운 키워드

를 사용하세요. 이는 개체를 만드는 가장 일반적이고 간단한 방법입니다. 이런 방식으로 우리는 어떤 생성자(매개변수가 없거나 매개변수화된)를 호출할 수 있습니다.

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

2. Class 클래스의 newInstance 메소드를 사용하세요

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;

3. Constructor 클래스의 newInstance 메소드를 사용합니다.

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을 통해 객체 만들기 문서를 읽어보세요.

4. 복제 메소드 사용

객체의 복제 메소드를 호출할 때마다 jvm이 객체를 생성합니다. 새 개체의 경우 이전 개체의 모든 내용을 복사합니다. clone 메소드를 사용하여 객체를 생성해도 생성자는 호출되지 않습니다.

clone 메소드를 사용하려면 먼저 Cloneable 인터페이스를 구현하고 정의된 clone 메소드를 구현해야 합니다.

Employee emp4 = (Employee) emp3.clone();
162: invokevirtual #87  // Method org/programming/mitra/exercises/Employee.clone ()Ljava/lang/Object;

5. 역직렬화 사용

객체를 직렬화 및 역직렬화하면 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(생성자 호출)이라는 두 가지 호출로 전환됩니다.

Example

다음 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&#39;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&#39;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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.