[java] Java로 객체를 만드는 다른 방법은 무엇입니까?

다른 날 동료와 대화를 나 Ha습니다.

생성자를 사용하는 것이 명백하지만 다른 방법은 무엇입니까?



답변

자바에서 객체를 생성하는 방법은 4 가지가 있습니다 :

. new키워드 사용
이것은 자바에서 객체를 생성하는 가장 일반적인 방법입니다. 이런 방식으로 객체의 거의 99 %가 생성됩니다.

 MyObject object = new MyObject();

B . 사용 Class.forName()
클래스 이름을 알고 있고 공개 기본 생성자가 있으면 이런 식으로 객체를 만들 수 있습니다.

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

C . 사용 clone()
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( 생성자를 호출하지 않습니다 ).
  • JNI를 통해 (생성자를 호출해야 함)
  • 를 호출하는 다른 방법을 통해 new.
  • 클래스로드를 새 객체 (예 : interned String) 를 만드는 것으로 설명 할 수 있다고 생각합니다 .
  • 선언 초기화의 일부인 리터럴 배열 (배열 생성자 없음)
  • “varargs”( ...) 메소드 호출 의 배열 (배열에 대한 생성자 없음).
  • 비 컴파일 시간 상수 문자열 연결 (일반적인 구현에서 4 개 이상의 객체를 생성해야 함).
  • 런타임에서 예외를 작성하여 발생시킵니다. 예를 들어 throw null;또는 "".toCharArray()[0].
  • 물론 프리미티브 복싱 (캐시되지 않은 경우).
  • JDK8에는 람다 (본질적으로 간결한 익명 내부 클래스)가 있어야하며 이는 암시 적으로 객체로 변환됩니다.
  • 완성도 (및 Paŭlo Ebermann)를 위해 new키워드에 대한 구문 도 있습니다.

답변

Java 언어 내에서 객체를 생성하는 유일한 방법은 명시 적 또는 암시 적으로 생성자를 호출하는 것입니다. 리플렉션 결과를 사용하여 생성자 메서드를 호출하면 deserialization은 리플렉션을 사용하여 생성자를 호출하고 팩토리 메서드는 생성자를 호출하여 래핑하여 실제 생성을 추상화하며 복제는 래핑 된 생성자 호출과 비슷합니다.


답변

예, 리플렉션을 사용하여 객체를 만들 수 있습니다. 예를 들어 String.class.newInstance()비어있는 새로운 String 객체를 제공합니다.


답변

Java로 객체를 생성하는 방법에는 5 가지가 있습니다.

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<Employee> constructor = Employee.class.getConstructor();
Employee emp3 = constructor.newInstance();

4. clone()메소드 사용 → 생성자 호출 없음

Employee emp4 = (Employee) emp3.clone();

deserialization 사용 → 생성자 호출 없음

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();