직렬 화 액세스 기반 자바 대상 깊이 복제 방법 상세 설명
public class DeepCloneTest {
private class CloneTest {
private Long myLong = new Long(1);
}
public static void main(String args[]) {
new DeepCloneTest().Test();
}
public void Test() {
CloneTest ct1 = new CloneTest();
CloneTest ct2 = ct1;
// to see if ct1 and ct2 are one same reference.
System.out.println("ct1: " + ct1);
System.out.println("ct2: " + ct2);
// if ct1 and ct2 point to one same object, then ct1.myLong == ct2.myLong.
System.out.println("ct1.myLong: " + ct1.myLong);
System.out.println("ct2.myLong: " + ct2.myLong);
// we change ct2's myLong
ct2.myLong = 2L;
// to see whether ct1's myLong was changed.
System.out.println("ct1.myLong: " + ct1.myLong);
System.out.println("ct2.myLong: " + ct2.myLong);
}
}
out put:ct1:DeepClone Test$CloneTest@c17164ct2: [email protected]:1ct1.myLong:2ct 2.myLong:2 이거 쉬 워 요.아마 자 바 를 배 우 는 사람 은 다 알 고 있 을 거 예요.메모리 에 대상 의 인용 은 창고 에 저장 되 고 대상 의 데 이 터 는 더미 에 저장 되 며 창고 의 인용 은 더미 속 의 대상 을 가리킨다.여기 가 바로 두 스 택 의 인용 으로 쌓 여 있 는 같은 대상 을 가리 키 기 때문에 ct2 의 my Long 을 바 꾸 면 ct1 의 my Long 값 도 이에 따라 바 뀌 는 것 을 볼 수 있 습 니 다.그림 으로 표시 하면 쉽게 이해 할 수 있 습 니 다.4.567916.왼쪽 은 스 택 구역 입 니 다.이 구역 에는 두 개의 인용 이 있 고 값 이 같 습 니 다.그들 은 오른쪽 에 있 는 같은 대상 을 가리 키 고 있 습 니 다.대부분 우 리 는 자바 언어의 이러한 특성 으로 우리 가 하고 싶 은 일 을 합 니 다.예 를 들 어 대상 의 인용 을 하나의 방법 에 포함 시 키 고 방법 에서 가리 키 는 대상 을 인용 하여 해당 하 는 수정 을 합 니 다.그러나 때때로 우 리 는 이미 존재 하 는 대상 과 똑 같은 내용 을 가지 고 있 지만 서로 다른 대상 을 인용 하여 이 를 위해이렇게 할 수 있 습 니 다.CloneTest@c17164ct2: [email protected] [email protected] java.lang.Object@61de33출력 을 통 해 알 수 있 듯 이 ct1 과 ct2 는 확실히 두 개의 서로 다른 인용 이다.그래서 우 리 는 당연히 ct1.o 와 ct2.o 도 두 개의 서로 다른 대상 이 라 고 생각한다.하지만 수출 에서 보 듯 이 그렇지 않다!ct1.o 와 ct2.o 는 같은 대상 입 니 다!왜냐하면 복 제 를 사 용 했 지만 위 에는 얕 은 복제 일 뿐 이 고 도형 으로 표시 했다위의 o 를 보 았 습 니까?사실은 두 대상 이 공유 한 것 이다.이것 은 바로 당신 이 원래 양우리 1 이 있 었 고 그 안에 양 한 마리 가 있 었 다 는 것 과 같 습 니 다.그리고 당신 은 또 양우리 2 를 만 들 었 습 니 다.양 을 양우리 1 에서 끌 어 내지 않 은 상태 에서 양 도 양우리 2 에 가 두 었 습 니 다.당신 은 양 이 두 마리 있다 고 생각 합 니까?사실은 요?다 들 아시 다시 피이것 이 바로 얕 은 복제 의 결과 이다.만약 두 대상 이 독립 적 인 o 를 가지 게 하려 면 반드시 o 에 대해 복제 작업 을 해 야 한다.어떤 사람들 은 이것 이 아무것도 아니 라 고 생각 할 수도 있 습 니 다.하면 하 는 것 이지 만,생각해 본 적 이 있 습 니 다.만약 에 o 뿐만 아니 라 o 와 비슷 한 것 도 많 습 니 다.당신 은 하나씩 복 제 를 합 니까?분명히 그다지 현실 적 이지 않다.하나의 해결 방법 은 대상 을 먼저 흐름 에 직렬 화 한 다음 에 남 겨 진 대상 을 읽 는 것 이다.그러면 읽 은 데이터 가 이전의 대상 과 똑 같 고 마치 완전한 복사 와 같다 는 것 을 보증 할 수 있다
public class DeepCloneTest{
// must implements Cloneable.
private class CloneTest implements Cloneable{
private Object o = new Object();
public CloneTest clone() {
CloneTest ct = null;
try {
ct = (CloneTest)super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return ct;
}
}
public static void main(String args[]) {
new DeepCloneTest().Test();
}
public void Test() {
CloneTest ct1 = new CloneTest();
CloneTest ct2 = ct1.clone();
// to see if ct1 and ct2 are one same reference.
System.out.println("ct1: " + ct1);
System.out.println("ct2: " + ct2);
// whether ct1.o == ct2.o ? yes
System.out.println("ct1.o " + ct1.o);
System.out.println("ct1.o " + ct1.o);
}
}
이때 메모리 의 데 이 터 는 바로 이 렇 습 니 다.클론 작업 완료.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
AccessVBA에서 Access 링크 테이블의 원본 파일 업데이트 시간 확인Access에서 링크 테이블을 사용하고, 그 링크 원 파일을 다른 사람이 정기적으로 갱신해 운용하는 경우, 링크 원 파일을 보러 가지 않으면, 원 파일이 갱신 끝났는지 어떤지는 모르겠다고 생각합니다(그렇네요…?) 원...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.