Object 클래스의 clone () 방법은 깊이 복사입니까? 얕은 복사입니까?

1778 단어
오늘 어떤 사람이 나에게 clone()이 깊은 복사인지 얕은 복사인지 두 눈이 흐리멍덩하다는 문제를 보냈다.기왕 모르는 바에는 코드를 써서 기록합시다.
우선 심층 복사와 얕은 복사의 개념을 알아보자.대상이 복사될 때 복사된 대상 내부의 인용 대상과 원 대상 내부의 인용 대상 주소가 같으며 이것은 얕은 복사입니다.반대로 심층 복사다.
객체를 복제하려면 다음 두 조건이 필요합니다.
  • 구현 Cloneable 인터페이스.이 인터페이스는 빈 인터페이스로 복사만 합법적으로 할 뿐, 그렇지 않으면 이상을 던질 수 있다.
  • 복사java.lang.CloneNotSupportedException방법.

  • 다음은 코드로 확인합니다.
    public class Animal implements Cloneable {
    
        public Cat cat;
    
        @Override
        protected Object clone() throws CloneNotSupportedException {
            return super.clone();
        }
    }
    
    public class Cat {
    
    }
    

    테스트 클래스:
    public class CloneTest {
    
        public static void main(String[] args) throws CloneNotSupportedException {
            Animal a = new Animal();
            a.cat = new Cat();
            Animal clone = (Animal) a.clone();
            System.out.println("Animal: " + (a == clone));
            System.out.println("cat:" + (a.cat == clone.cat));
        }
    }
    

    인쇄 결과:
    Animal: false
    cat:true
    

    처음 질문에 답이 나왔습니다. clone () 방법은 얕은 복사입니다. 두 대상 중의cat는 더미 속의 같은 대상을 가리킵니다.
    딥 카피를 원한다면?이럴 때는 클론 방법을 개조하고 인용 대상에서도 인터페이스와 복사 방법을 실현해야 한다.위 코드:
    public class Animal implements Cloneable {
    
        public Cat cat;
    
        @Override
        protected Object clone() throws CloneNotSupportedException {
            Animal clone = (Animal) super.clone();
            //  
            clone.cat = (Cat) cat.clone();
            return clone;
        }
    }
    
    public class Cat implements Cloneable {
    
        @Override
        protected Object clone() throws CloneNotSupportedException {
            return super.clone();
        }
    }
    

    여전히 위의 테스트 코드입니다. 인쇄 결과는 다음과 같습니다.
    Animal: false
    cat:false
    

    이상.

    좋은 웹페이지 즐겨찾기