다른 날 동료와 대화를 나 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 가지 방법을 사용하여 모든 클래스의 객체를 만들 수 있습니다.