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 방법 - 원형 모드
직렬 화 실현 대상 의 복사 사용
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
GitHub 웹 사이트에서 폴더 이름 바꾸기최근 Mac에서 작업하는 동안 git 저장소를 시작하고 물음표(?)가 있는 폴더를 만든 문제가 발생했습니다. 그것은 Mac에서는 유효한 폴더 이름이지만 Windows에서는 아닙니다. 그래서 나중에 Windows PC...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.