一、克隆的两种方式。java
a、浅度克隆。让须要你须要克隆的类实现Cloneable这个接口。在调用super.clone这个方法完成克隆。代码以下this
public class User implements Cloneable{ private String name; private String address; private Dog dog; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public Dog getDog() { return dog; } public void setDog(Dog dog) { this.dog = dog; } public Object getObject(){ Object obj=null; try { obj=super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return obj; } } public class Dog { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
b、深度克隆。让你须要克隆的类以及该类设计的全部类都要实现Serializable这个标记性接口。让后进行流操做,完成克隆。代码以下:设计
public class User implements Serializable{ private String name; private String address; private Dog dog; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public Dog getDog() { return dog; } public void setDog(Dog dog) { this.dog = dog; } public Object deepClone(){ Object obj=null; try { ByteArrayOutputStream bos=new ByteArrayOutputStream(); ObjectOutputStream oos=new ObjectOutputStream(bos); oos.writeObject(this); ByteArrayInputStream bis=new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois=new ObjectInputStream(bis); obj=ois.readObject(); } catch (Exception e) { e.printStackTrace(); } return obj; } } public class Dog implements Serializable { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
综上所述,咱们不难发现,浅度克隆其实就是把你须要克隆的类彻底的复制一份。而深度克隆则是把该类的属性和方法进行复制,引用的其余类则是新的对象。code