자바 복제
다시 한 번 요약:
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.