>  기사  >  Java  >  Java 객체의 clone 방식에 대한 종합 분석

Java 객체의 clone 방식에 대한 종합 분석

高洛峰
高洛峰원래의
2017-01-17 16:52:301372검색

1개의 보호된 네이티브 객체 clone()이 CloneNotSupportedException을 발생시킵니다.

1. 이 메서드는 네이티브 키워드에 의해 수정됩니다.

Java의 네이티브 키워드는 이 메서드가 로컬 메서드임을 나타냅니다. 자바 네이티브 설명 】. 또한 네이티브 수정 메서드의 실행 효율성은 네이티브 수정 메서드가 아닌 메서드의 실행 효율성보다 높습니다.

2. 메서드는 protected로 수정됩니다.

클래스가 clone() 메서드를 재정의하는 경우 다른 모든 클래스가 이 클래스에 액세스할 수 있도록 공용 액세스 수정자로 수정해야 합니다. . 방법.

3. 메소드가 CloneNotSupportedException을 발생시킵니다.

clone() 메소드를 대체하려는 클래스는 java.lang.Cloneable 인터페이스 자체를 구현해야 합니다. 그렇지 않으면 CloneNotSupportedException이 발생합니다.

2. clone()의 역할

참고: 여기서 개체는 구체적으로 복합 유형을 나타냅니다.

1. 단순 = 연산

우리는 Java의 복합 유형 객체가 참조 유형이며 객체의 메모리 주소를 저장하는 경우가 많다는 것을 알고 있습니다. 따라서 = 연산자와 같은 간단한 할당 연산을 사용할 수는 없습니다. 객체 a를 다른 객체 b에 할당할 때 객체 a의 메모리 주소를 b에 할당하면 두 객체가 모두 동일한 메모리 주소를 가리키게 됩니다. 결과적으로 한 개체를 수정하면 다른 개체에도 영향을 미치게 됩니다. 아래 그림과 같이

Person p1 = new Person();
Person p2 = p1;

java object 之clone方法全面解析

2.clone()

clone() 메소드를 사용하여 빠르게 생성합니다. 개체는 복사본이며 두 개체는 서로 다른 메모리 주소를 가리킵니다. 아래 그림과 같이

Person p1 = new Person();
Person p2 = p1.clone();

java object 之clone方法全面解析

3. 얕은 클론과 깊은 클론1, 얕은 클론(얕은 복사본)

shallow clone은 객체의 필드가 아닌 객체 자체만 복제하는 것을 의미합니다. 그냥 얕은 복제인 super.clone()을 호출하세요. 복사된 객체가 다른 메모리 주소를 가리키더라도 객체의 필드는 여전히 이전 객체와 동일한 메모리 주소를 가리킵니다.

public class ShallowClone implements Cloneable {
 
  public String name;
  public int age;
  public Person person;
 
  public ShallowClone() {
  }
 
  public ShallowClone(String name, int age, Person person) {
    this.name = name;
    this.age = age;
    this.person = person;
  }
 
  @Override
  public ShallowClone clone() {
    ShallowClone c = null;
    try {
      c = (ShallowClone) super.clone();
      return c;
    } catch (CloneNotSupportedException e) {
      e.printStackTrace();
    }
    return c;
  }
 
  public static void main(String[] args) {
    Person p = new Person();
    p.name = "p";
    p.age = 10;
 
    ShallowClone c1 = new ShallowClone("Jim", 18, p);
    System.out.printf("before clone: c1 = %s, c1.person = %s\n", c1, c1.person);
    ShallowClone c2 = c1.clone();
    System.out.printf("after clone: c2 = %s, c2.person = %s\n", c2, c2.person);
  }
}

main() 출력 실행:

before clone: c1 = cre.sample.test.object.ShallowClone@558385e3, c1.person = cre.sample.test.Person@2dcb25f1
after clone: c2 = cre.sample.test.object.ShallowClone@742808b3, c2.person = cre.sample.test.Person@2dcb25f1

얕은 복사본에 대한 설명, ShallowClone 객체 메모리 주소가 변경되었지만 Person 필드 메모리는 개체 주소가 변경되지 않았습니다.

2. Deep clone(깊은 복사)

Deep clone은 개체 자체뿐만 아니라 개체의 필드도 복제하는 것을 말합니다.

/**
 * deep clone代码示例
 * Created by CreGu on 2016/6/9.
 */
public class DeepClone implements Cloneable {
  public String name;
  public int age;
  public Person person;
 
  public DeepClone() {
  }
 
  public DeepClone(String name, int age, Person person) {
    this.name = name;
    this.age = age;
    this.person = person;
  }
 
  @Override
  public DeepClone clone() {
    DeepClone c = null;
    try {
      c = (DeepClone) super.clone();
      c.person = person.clone();
      return c;
    } catch (CloneNotSupportedException e) {
      e.printStackTrace();
    }
    return c;
  }
 
  public static void main(String[] args) {
    Person p = new Person();
    p.name = "p";
    p.age = 10;
 
    DeepClone c1 = new DeepClone("Jim", 18, p);
    System.out.printf("before clone: c1 = %s, c1.person = %s\n", c1, c1.person);
    DeepClone c2 = c1.clone();
    System.out.printf("after clone: c2 = %s, c2.person = %s\n", c2, c2.person);
  }
}

main() 출력 실행:

before clone: c1 = cre.sample.test.object.DeepClone@558385e3, c1.person = cre.sample.test.Person@2dcb25f1
after clone: c2 = cre.sample.test.object.DeepClone@742808b3, c2.person = cre.sample.test.Person@70535b58

딥 카피에 대한 설명, DeepClone 개체 메모리 주소가 변경되었습니다. , 그러나 개체에 있는 Person 필드의 메모리 주소도 변경되었습니다.

Java 객체의 clone 메소드에 대한 위의 종합 분석은 모두 편집자가 공유한 내용이므로 참고가 되기를 바라며, PHP 중국어 사이트를 지원해 주시길 바랍니다.

자바 객체의 복제 방법에 대한 보다 종합적인 분석과 관련 글은 PHP 중국어 홈페이지를 주목해주세요!

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