종이로 읽고 나니 세세하게 해야겠다는 생각이 든다.
--Lu You 운하가 얼마나 맑은지 물어보세요. 생명수의 원천이 있습니다. - Zhu Xi
복제 및 복사: 객체Person p1=new가 있는 경우 Person("이름", 나이 ; 상대방에게 영향을 미칩니다. 함수의 매개변수가 객체인 경우 참조 유형이 전달되며 객체 함수 내부의 작업이 외부 객체에 영향을 미칩니다. 객체의 복사본을 전송하려면 객체의 clone() 메서드를 사용해야 합니다. ) 복사 개체는 참조가 아닌 새 개체를 반환합니다. 복사 개체와 new 연산자에 의해 반환된 새 개체의 차이점은 이 복사 개체에 이미 다음의 일부 정보가 포함되어 있다는 것입니다. 객체의 초기 정보가 아닌 원래 객체. shallow 사용 시기 Clone(shallow copy, Shadow copy), deep Clone(deep copy) 사용 시기 : 주로 특정 도메인 객체의 성격에 따라 기본 타입이라면, 참조인 경우 얕은 클론 을 사용하세요. 변수(참조변수)는 deep Clone을 사용합니다. 복제 구현 단계: (1) Cloneable
인터페이스를 구현합니다. Cloneable에는 플래그 인터페이스라고 하는 추상 메서드가 없습니다.
(2) 기본 클래스의 clone 메서드를 재정의하고 이를 공개로 선언합니다. (3) 파생 클래스의 clone 메서드를 재정의하고
super.clone을 호출합니다. ( )
클론에서는 얕은 복사(shallow copy)와 깊은 복사(deep copy)로 나누어지는데, 이는 매개변수가 기본형이든 참조형이든 상관없다는 뜻이다. , super.clone()이 직접 호출되면 결과 참조 유형은 여전히 동일한 메모리를 가리킵니다. 즉, super.clone()을 호출한 후 복사하려면 참조 매개변수의 clone() 함수도 호출해야 합니다. , 깊은 복사를 달성합니다.
얕은 사본:
(1) 기본 데이터 유형
(문자열 ) 새로운 객체가 복사되나요? (2) 참조 객체는 여전히 동일한 객체를 참조합니다.
얕은 복사 샘플 코드: public class Info {
public int idnumber;
public int getIdnumber() {
return idnumber;
}
public void setIdnumber(int idnumber) {
this.idnumber = idnumber;
}
}
public class Person implements Cloneable{
private int age;
private String nameString;
public Info info;
public Info getInfo() {
return info;
}
public void setInfo(Info info) {
this.info = info;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getNameString() {
return nameString;
}
public void setNameString(String nameString) {
this.nameString = nameString;
}
public String toString()
{
return "name:"+nameString+",age:"+age+",idnumber"+info.idnumber;
}
public Object clone()
{
Person person=null;
try {
person=(Person)super.clone(); //浅拷贝
//person.info=(Info)info.clone();
} catch (CloneNotSupportedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
return person;
}
}
public class Hello {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Info info=new Info();
info.setIdnumber(100);
Person person1=new Person();
person1.setAge(10);
person1.setNameString("tiantian");
person1.info=info;
Person person2=(Person)person1.clone();
person2.setNameString("hello");
person2.setAge(20);
person2.info.setIdnumber(200);
System.out.println("person2"+person2);
System.out.println("person1"+person1);
}
}
최종 결과는
person2name:hello,age:20,idnumber200 person1name:tiantian,age:10,idnumber200
person1과 person2의 기본 유형 이름과 나이가 변경되었지만 참조 유형은 idnumber의 값은 변경되지 않았습니다.
딥 카피:
(1)对存在的引用类型也进行拷贝,浅拷贝与深拷贝的代码还是有不同点的。
深拷贝代码示例:
public class Info implements Cloneable {//Info也进行拷贝 public int idnumber; public int getIdnumber() { return idnumber; } public void setIdnumber(int idnumber) { this.idnumber = idnumber; } public Object clone() { Info info=null; try { info=(Info)super.clone(); } catch (CloneNotSupportedException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } return info; } } public class Person implements Cloneable{ private int age; private String nameString; public Info info; public Info getInfo() { return info; } public void setInfo(Info info) { this.info = info; } public Person() { // TODO 自动生成的构造函数存根 } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getNameString() { return nameString; } public void setNameString(String nameString) { this.nameString = nameString; } public String toString() { return "name:"+nameString+",age:"+age+",idnumber"+info.idnumber; } public Object clone() { Person person=null; try { person=(Person)super.clone(); //浅拷贝 person.info=(Info)info.clone();//加上这一句就变成了深拷贝,对对象引用也进行一次拷贝 } catch (CloneNotSupportedException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } return person; } }
结果:
person2name:hello,age:20,idnumber200 person1name:tiantian,age:10,idnumber100
所有的值都进行了改变。
위 내용은 Java 클론 코드 예제 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!