직렬 화 액세스 기반 자바 대상 깊이 복제 방법 상세 설명

자바 에서 비 원형 유형의 대상 을 참조 하고 다른 대상 에 게 값 을 부여 한 후 이 두 인용 은 같은 대상 을 가리 키 는 것 을 알 고 있 습 니 다.예 를 들 어

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);
 }
}
이때 메모리 의 데 이 터 는 바로 이 렇 습 니 다.

클론 작업 완료.

좋은 웹페이지 즐겨찾기