자바 복제

자바 의 복 제 를 다시 한 번 배 웠 는데,원래 너무 천박 하 게 배 웠 고,많은 특성 을 이해 하지 못 한 것 같 습 니 다.
다시 한 번 요약:
1.자바 의 클론 대응 디자인 모드 의 prototype pattern.
2.대상 이 복제 되 려 면 자바.lang.Cloneable 인 터 페 이 스 를 실현 해 야 합 니 다.이 인 터 페 이 스 는 자바.io.Serializable 인터페이스 와 비슷 하 며 어떠한 방법 도 포함 되 지 않 은 인터페이스 로 표 지 를 합 니 다.
3.Cloneable 인 터 페 이 스 를 실현 한 후 Object 클래스 의 clone 방법 을 덮어 야 합 니 다.Object 의 native 방법 입 니 다.주의해 야 할 것 은 Object 자체 가 Cloneable 인 터 페 이 스 를 실현 하지 않 았 기 때문에 Object 대상 을 clone 할 수 없습니다.
4.복 제 는 shallow copy 와 deep copy 로 나 뉜 다.
1.얕 은 복사(얕 은 복제)
개념:복 제 된 대상 의 모든 변 수 는 원래 의 대상 과 같은 값 을 포함 하고 모든 다른 대상 에 대한 인용 은 원래 의 대상 을 가리킨다.얕 은 복 제 는 생각 하 는 대상 만 복사 하고 인용 한 대상 은 복사 하지 않 는 다 는 얘 기다.
방법:클래스 implements Cloneable,그리고 clone()방법 을 다시 쓰 고 clone()방법 에서 슈퍼.clone()을 호출 하면 됩 니 다.다른 동작 이 없습니다.
2.딥 복제(딥 복제)
개념:복 제 된 대상 의 모든 변 수 는 원래 의 대상 과 같은 값 을 포함 하고 다른 대상 을 참조 하 는 변 수 를 제거 합 니 다.다른 대상 을 인용 하 는 변 수 는 복 사 된 새로운 대상 을 가리 키 며,더 이상 인 용 된 대상 이 아 닙 니 다.복사 할 대상 이 인용 한 대상 을 복사 한 것 이다.
방법:
(1)클래스 implements Cloneable,그리고 clone()방법 을 다시 쓰 고 clone()방법 에서 슈퍼.clone()을 호출 한 다음 인용 형 변수 가 가리 키 는 대상 을 복제 합 니 다.
(2)직렬 화:이 대상 을 대상 의 출력 흐름 에 기록 하면 대상 의 입력 흐름 으로 읽 는 대상 은 원래 대상 의 깊이 있 는 복제 이다.
5.자바 문서 에서 추천 하 는 클론 의 실현 기준
The general intent is that, for any object x, the expression:
 x.clone() != x

will be true, and that the expression:
 x.clone().getClass() == x.getClass()

will be true, but these are not absolute requirements. While it is typically the case that:
 x.clone().equals(x)

will be true, this is not an absolute requirement.
1)복제 대상 이 새로 생 성 되 었 기 때문에 인용 이 다르다.
2)복 제 된 대상 은 원래 의 대상 과 같은 유형 이 므 로 getClass 는 같 아야 한다.
3)자바 의 규범 에 따라 한 대상 의 equals 방법 을 호출 하기 전에 이 대상 은 equals 방법 을 다시 썼 을 것 입 니 다.이렇게 비교 하 는 것 은 인용 뿐만 아니 라 두 대상 의 정보 가 같 는 지,복 제 된 대상 의 정 보 는 당연히 같 으 므 로 여 기 는 true 가 되 어야 합 니 다.
6.오늘 쓴 테스트 코드 를 적어 주세요.
Dog 클래스 의 equals 방법 을 다시 쓰 고 String 클래스 를 본 떠 서 쓴 것 입 니 다.
	@Override
	public boolean equals(Object obj) {
		if(this == obj){
			return true;
		}
		if(obj instanceof Dog){
			Dog anotherDog = (Dog)obj;
			if(this.getName() == anotherDog.getName()){
				return true;
			}
		}
		return false;
	}

Dog 클래스 를 다시 쓰 는 clone 방법
	@Override
	public Dog clone() {
		Dog dog = null;
		try {
			dog = (Dog) super.clone();
			dog.setClothes(getClothes().clone());//                  clone
		} catch (CloneNotSupportedException exception) {
			exception.printStackTrace();
		}
		return dog;
	}

PS:클론 의 진정한 용 무 를 알 고 싶 으 면 실제 적 으로 해 야 합 니 다.
Integer 의 toString 방법 을 다시 한 번 보 았 습 니 다.Dog 의 equals 방법 은 최적화 할 수 있 습 니 다.
	@Override
	public boolean equals(Object obj) {
		if(this == obj){
			return true;
		}
		if(obj instanceof Dog){
			return name == ((Dog)obj).getName();
		}
		return false;
	}

세 줄 과 한 줄 은 등가 이다.
쓰 고 보 니 이 글 은 두 가지 심각 한 오류 가 있 었 습 니 다.실수 로 졸렬 해 졌 습 니 다.마지막 테스트 결과 가 맞 았 습 니 다.글 에서 직접 고치 지 않 고 잘못 을 기억 하기 위해 서 였 습 니 다.
1.String name 은 인용 이기 때문에 얕 은 복 제 를 할 때 name 은 복 제 된 인용 일 뿐 입 니 다.
2.equals 방법 에서 두 개의 String 을 비교 하 는 것 은==비교 하 는 것 입 니 다.오 랜 만 에 이런 오류 가 발생 했 습 니 다.
마침 name 은 인용 을 복 사 했 기 때문에==또는 되 돌아 오 는 true 입 니 다.
수정:
	@Override
	public boolean equals(Object obj) {
		if(this == obj){
			return true;
		}
		if(obj instanceof Dog){
			return name.equals(((Dog)obj).getName());
		}
		return false;
	}

나중에 얕 은 복사 할 때 String 참조 가 원래 의 메모리 공간 을 가리 키 는 지 기억 하 세 요.
 
String 타 입 이 좀 달라 요.http://blog.csdn.net/naivesoft/article/details/6774550

좋은 웹페이지 즐겨찾기