java clone

浅克隆:自定义的类型不能够克隆

package com.quincy.clone;
/**
 * 思念是种痛,
 * 倚楼听风雨,
 * 淡看江湖路,
 * 但见泪痕湿,
 * 不知心恨谁
 * @author Quincy
 *
 */
public class MyClone {
 public static void main(String[] args) {
  User user = new User();
  user.setName("quincy");
  user.setAge(25);
  
  User cloneUser= null;
  try {
   cloneUser = (User)user.clone();
   
   System.out.println(cloneUser.getName());
   System.out.println(cloneUser.getAge());
   System.out.println("================");
   cloneUser.setName("miao");
   cloneUser.setAge(24);
   
   System.out.println(cloneUser.getName());
   System.out.println(cloneUser.getAge());
   System.out.println(cloneUser == user);
   
   //不相同的原因是对User类的equals方法没有重写
   System.out.println(cloneUser.equals(user));
   
  } catch (CloneNotSupportedException e) {
   e.printStackTrace();
  }
 }
}
class User implements Cloneable{
 private String name;
 private int age;
 
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public int getAge() {
  return age;
 }
 public void setAge(int age) {
  this.age = age;
 }
 @Override
 //一定要设置为public 
 public Object clone() throws CloneNotSupportedException {
  //一定要调用super.clone()
  return super.clone();
 }
} 

深克隆:自定义的类型也可以克隆
package com.quincy.clone;
/**
 * 深度克隆
 * @author Quincy
 *
 */
public class DepClone {
 
    public static void main(String[] args) {
       People p = new People();
       p.setAge(30);
       p.setName("people");
       
       User2 user2 = new User2();
       user2.setAge(12);
       user2.setName("user2");
       user2.setPeople(p);
       
       
       try {
    User2 u2 = (User2)user2.clone();
    System.out.println(u2.getAge());
    System.out.println(u2.getName());
    
    p.setName("clone ");
    System.out.println(u2.getPeople() == p);
    System.out.println(u2.getPeople().getName());
    System.out.println(u2.getPeople().getAge());
   } catch (CloneNotSupportedException e) {
    
    e.printStackTrace();
   }
 }
}
class User2 implements Cloneable{
 private int age;
 private String name;
 private People people;
 
 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 People getPeople() {
  return people;
 }
 public void setPeople(People people) {
  this.people = people;
 }
    //重写clone()方法
 @Override
 public Object clone() throws CloneNotSupportedException {
  User2 user2 = (User2)super.clone();
  user2.setPeople((People)user2.getPeople().clone());
  return user2;
 }
}
class People 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;
 }
 
 @Override
 public Object clone() throws CloneNotSupportedException {
  // TODO Auto-generated method stub
  return super.clone();
 }
 
}

你可能感兴趣的:(java clone)