>  기사  >  Java  >  Java 클론 코드 예제 요약

Java 클론 코드 예제 요약

黄舟
黄舟원래의
2017-03-15 11:44:151483검색

종이로 읽고 나니 세세하게 해야겠다는 생각이 든다. --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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.