2013-09-28 3 views
5

Java가 복사 생성자를 지원하는 방법과 C++과 다른 점이 궁금합니다. 컴파일러 측에서 3 가지 규칙 (복사 생성자, 소멸자, 대입 연산자)을 실행하는 논리에 해당하는 Java에 대해 이해하고 싶습니다.Java와 C++ 복사 생성자의 차이점

+3

아니요, java는 클래스에 대한 참조 만 지원하며 C++은 값 및 참조를 지원하므로 java는 복사기, dtors 또는 ops를 지정할 수 없습니다. – Kal

+2

@Kal Wrong. Java는 복사 생성자를 잘 지원하며, 대부분의 Collections 클래스가이를 제공합니다. – chrylis

+1

@chrylis : 자동 복사 생성자? 나는 그렇게 생각하지 않는다. –

답변

8

Java에는 복사 생성자에 대한 특정 언어 지원이 없습니다. 오히려 생성자에서 손으로 상태 복사를 코딩하면됩니다. 예 :

public class Person { 
    private String firstName; 
    private String lastName; 

    public Person(Person other) { 
     this.firstName = other.firstName; 
     this.lastName = other.lastName; 
    } 
    ... 
} 

나는 이야기의 컴파일러 측면에서 세 가지 (복사 생성자, 소멸자, 대입 연산자)의 규칙을 실행하는 논리에 대한 자바를 이해하고자

.

복사 생성자는 위와 같습니다. 실제로는 (단순한) 디자인 패턴입니다.

Java는 C++ 지정 연산자 로딩과 동일한 기능을 제공하지 않습니다. Java는 기본 유형 및 참조 유형의 할당을 지원하지만 C++와 동일한 방식으로 객체를 할당하는 것은 지원하지 않습니다. Java에서 값을 지정할 때 특별한 조치가 필요하지 않은 경우는 드뭅니다. 그리고이 작업을해야하는 경우 논리를 설정 메서드에 넣는 것이 일반적입니다.

Java는 finalize 메서드를 지원합니다. 일부는에서 C++ 소멸자와 유사한 메서드입니다. 가장 큰 차이점은 finalize 메서드는 참조 변수가 아닌 개체에 대한 작업이며, 일반적으로 개체의 마지막 참조가 범위를 벗어난 후 오랜 시간 호출됩니다.

그러나 거의 필요가 finalize 방법을 사용할 수 없습니다 :

  • 자바는 완전 쓰레기 수집 언어 및 메모리 관리를위한 최선의 전략은 GC가 알아서하도록하는 것입니다.

  • 기타 리소스는 "try/finally"또는 "resource with try"를 사용하여 관리하는 것이 가장 좋습니다. finalize 방법에 대한

AFAIK 유일한 소리 사용의 경우는 실수로 손실 된 자원을 청소하다; 예 : 누군가가 권장 메커니즘을 사용하여 "닫는"것을 잊었 기 때문입니다.

+0

복사는 일반적으로 MutableRectangle과 같은 변경 가능한 "값"개체에 대해 수행됩니다 (필요한 경우/그러한 클래스가 필요한 경우). 그것은 틀림없이 Person과 같은 "identity"객체/엔티티에 대해 실질적으로 합리적인/유용하지 않습니다. –

+0

이 코드 스 니펫은 올바른 생각이지만 손으로 ​​복사 된 복사본 생성자의 목적 인 진행중인 일부 세부적인 복사 작업을 수행하는 경우 더욱 분명합니다. 문자열과 기본 스칼라는 너무 쉽습니다. –

+1

@ThomasW - Java가 어떻게 작동하는지 보여주는 빠른 예입니다 ... 도메인 관점에서 의미가있는 것은 아닙니다. 답이 무엇을 말하려고하는지 집중하십시오. –

5

자바에는 객체에 대한 참조 만 있습니다. 인라인 (스택 또는 객체) 객체는 선언 할 수 없습니다.

복사 생성자

자바는 일이 없습니다. 글을 쓸 수는 있지만 거의 이루어지지 않습니다.

, 소멸자

자바는 일이 없습니다. 그것은 finalize()입니다. 그러나 이것은 매우 권장되지 않습니다.

할당 연산자

자바 객체에 대한 하나의 객체에 대한 참조 만이 없습니다.

+0

@ johnchen902 죄송합니다, finalize입니다() http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#finalize() –