Cloneable

7676 단어 clone
더 읽 기
clone
1. 응용 장면
  • 순환 해서 새 대상 만 들 기
  • 디자인 모델 - 원형 모델
  • 총화
    1. 얕 은 복사 와 깊 은 복사
    object. clone 방법, 즉 얕 은 복사 하기;
    얕 은 복사: 원래 대상 의 속성 과 복사 대상 의 띠 가 같은 대상 을 가리 키 고 있 습 니 다.
    object. clone 방법 을 다시 쓰 고 데이터 형식 을 참조 하여 표시 하 는 clone 성명 을 합 니 다.
    딥 복사: 대상 의 속성 값 도 해당 하 는 복사 가 진행 되 었 습 니 다.
    2. 카피 의 철저 성
    Class A 에서 Class B 를 참조 합 니 다.
    Class B 에서 Class C 를 참조 합 니 다.
    A 에서 깊이 복사 한 것 은 B 를 복사 한 것 일 뿐 C 를 처리 하지 않 았 다.그래서 C 는 여전히 얕 은 복사 입 니 다.
    3. clone 과 new 의 차이 점
    new 는 더미 에서 새로운 공간 을 열 고 구조 방법 을 초기 화하 여 주소 참조 로 되 돌려 줍 니 다.
    clone 역시 새로운 공간 을 열 었 습 니 다. 새로운 공간 에서 의 인용 데이터 형식 이 원래 의 대상 과 인용 주 소 를 공유 하 는 지 여부 와 차이 가 있 습 니 다.그래서 깊이 와 얕 은 복사 구분 이 있 는 거 예요.
    예 를 들 어 설명 하 다.
    1. 기본 데이터 형식 과 참조 데이터 형식 String
    
    package com.java.study.test.unit1;
    
    public class Person implements Cloneable {
    
    	private int age ;
    	private String name ;
    	public int getAge() {
    		return age;
    	}
    	public void setAge(int age) {
    		this.age = age;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public Person(int age, String name) {
    		super();
    		this.age = age;
    		this.name = name;
    	}
    	
    	@Override
    	protected Object clone() throws CloneNotSupportedException {
    		return super.clone();
    	}
    }
    
    public class PersonMain {
    
    	/**
    	 * @param args
    	 * @throws CloneNotSupportedException 
    	 */
    	public static void main(String[] args) throws CloneNotSupportedException {
    		
    		Person person = new Person(1,"1");
    		Person personClone = (Person) person.clone();
    		
    		//       :   ,        ,               
    		person.setAge(2);
    		System.out.println(personClone.getAge());
    		//       :  clone         ,     ,                
    		// String   :String        ,      personClone.name           ,          
    		//  :                         ;  String       
    		person.setName("2");
    		System.out.println(personClone.getName()); //    1
                    //   Stirng     ,          name          ,                   
    		System.out.println(person.getName() == personClone.getName());
    	}
    
    
    

    결론:
    기본 데이터 형식 은 딥 복사 입 니 다.
    인용 형식의 String 은 특례, 얕 은 복사, 최종 효 과 는 깊 은 복사 입 니 다. 원래 대상 과 복제 대상 은 속성 이 쌓 여 있 는 주 소 를 공유 하지 않 습 니 다.
    2. 데이터 형식 참조
    
    package com.java.study.test.unit1;
    
    public class Person implements Cloneable {
    
    	private int age ;
    	private String name ;
    	private Friend friend ;
    	
    	public int getAge() {
    		return age;
    	}
    	public void setAge(int age) {
    		this.age = age;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public Person(int age, String name) {
    		super();
    		this.age = age;
    		this.name = name;
    	}
    	
    	public Friend getFriend() {
    		return friend;
    	}
    	public void setFriend(Friend friend) {
    		this.friend = friend;
    	}
    	@Override
    	protected Object clone() throws CloneNotSupportedException {
    		return super.clone();
    	}
    }
    
    
    
    
    
    
    package com.java.study.test.unit1;
    
    public class Friend {
    
    	private String gender ;
    
    	public String getGender() {
    		return gender;
    	}
    
    	public void setGender(String gender) {
    		this.gender = gender;
    	}
    
    	public Friend(String gender) {
    		super();
    		this.gender = gender;
    	}
    	
    	
    }
    
    
    
    	public static void main(String[] args) throws CloneNotSupportedException {
    		
    		Person person = new Person(1,"1");
    		Friend friend = new Friend("male");
    		person.setFriend(friend);
    		Person personClone = (Person) person.clone();
                    //    male 
    		System.out.println(personClone.getFriend().getGender());
    		//    female 
                    //               ;           
    		person.getFriend().setGender("female");
    		System.out.println(personClone.getFriend().getGender());
          }
    

    결론: 인용 데이터 형식 은 기본적으로 얕 은 복사 입 니 다.
    3.
    
    package com.java.study.test.unit1;
    
    public class Person implements Cloneable {
    
    	private int age ;
    	private String name ;
    	private Friend friend ;
    	
    	public int getAge() {
    		return age;
    	}
    	public void setAge(int age) {
    		this.age = age;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public Person(int age, String name) {
    		super();
    		this.age = age;
    		this.name = name;
    	}
    	
    	public Friend getFriend() {
    		return friend;
    	}
    	public void setFriend(Friend friend) {
    		this.friend = friend;
    	}
    	@Override
    	protected Object clone() throws CloneNotSupportedException {
    		Person p = (Person) super.clone();
    		p.friend = (Friend) friend.clone();
    		return p;
    	}
    }
    
    
    
    
    
    
    
    package com.java.study.test.unit1;
    
    public class Friend implements Cloneable{
    
    	private String gender ;
    
    	public String getGender() {
    		return gender;
    	}
    
    	public void setGender(String gender) {
    		this.gender = gender;
    	}
    
    	public Friend(String gender) {
    		super();
    		this.gender = gender;
    	}
    	
    	@Override
    	protected Object clone() throws CloneNotSupportedException {
    		return super.clone();
    	}
    }
    

    결론: 딥 복사 란 클래스 의 모든 인용 데 이 터 를 하나씩 복제 하 는 것 이다.
    4. 범 형
    
    
    	public static void main(String[] args) throws CloneNotSupportedException {
    		
    		Person person = new Person(1,"1");
    		Person person1 = new Person(2,"2");
    		ArrayList list = new ArrayList(2);
    		list.add(person);
    		list.add(person1);
    		@SuppressWarnings("unchecked")
    		ArrayList copyList = (ArrayList) list.clone();
    		for(Person personCopy : copyList){
    			System.out.println("index:"+personCopy.getAge()+",name:"+personCopy.getName());
    		}
    		//    
    //		person.setName("5");
    //		person1.setName("6");
    //		for(Person personCopy : copyList){
    //			System.out.println("index:"+personCopy.getAge()+",name:"+personCopy.getName());
    //		}
    		//    :    ,                
    		ArrayList newCopyList = new ArrayList(2);
    		for(int index = 0 ; index < list.size() ; index ++){
    			newCopyList.add((Person) list.get(index).clone());
    		}
    		person.setName("5");
    		person1.setName("6");
    		for(Person personCopy : newCopyList){
    			System.out.println("index:"+personCopy.getAge()+",name:"+personCopy.getName());
    		}
    }
    
    

    결론: 범 형 중의 복 사 는 범 형 을 옮 겨 다 니 며 모든 대상 을 복제 해 야 한다.
    참고 블 로그
    자바 의 clone 방법 - 원형 모드
    직렬 화 실현 대상 의 복사 사용

    좋은 웹페이지 즐겨찾기