package com.javase.cloneable; //http://blog.csdn.net/kenthong/article/details/5758884 //http://www.itzhai.com/java-based-notebook-the-object-of-deep-and-shallow-copy-copy-copy-implement-the-cloneable-interface-serializing-deep-deep-copy.html public class Test_Cloneable { public static void main(String[] args) throws CloneNotSupportedException { // testClone(); testCloneForSerializable(); } private static void testCloneForSerializable() { //實現了:Serializable AdminSeri src = new AdminSeri("admin", new Userseri("user", "20")); AdminSeri dist = BeanUtil.cloneTo(src); System.out.println(src == dist); // false System.out.println(src.equals(dist)); // true System.out.println(src.getUser() == dist.getUser()); //false ! Well done! System.out.println(src.getUser().equals(dist.getUser())); //true } private static void testClone() throws CloneNotSupportedException { User u1 = new User("jack", "20"); User u2 = u1; User u3 = (User) u1.clone(); System.out.println(u1 == u2); System.out.println(u1 == u3); System.out.println(u1.equals(u3)); System.out.println("=============================================="); Admin a1 = new Admin("ad", new User("u1", "20")); Admin a2 = a1; Admin a3 = (Admin) a1.clone(); System.out.println(a1 == a3); System.out.println(a1.equals(a3)); System.out.println(a1.getUser() == a3.getUser()); //咱們不但願這是相等的.這裏是淺拷貝 System.out.println(a1.getUser().equals(a3.getUser())) ; System.out.println(a1.getUser().getName() == a3.getUser().getName()) ; a1.getUser().setName("u2"); System.out.println(a1.getUser().getName() == a3.getUser().getName()) ; System.out.println(a3.getUser().getName()); } }
Admin.javahtml
package com.javase.cloneable; public class Admin implements Cloneable{ private String name; private User user; public Admin(String name, User user) { this.name = name; this.user = user; } public Admin() { } /** 淺拷貝 @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } */ /** * 深拷貝 */ @Override protected Object clone() throws CloneNotSupportedException { Admin admin = (Admin) super.clone(); admin.user = (User) admin.user.clone(); return admin; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((name == null) ? 0 : name.hashCode()); result = prime * result + ((user == null) ? 0 : user.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Admin other = (Admin) obj; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; if (user == null) { if (other.user != null) return false; } else if (!user.equals(other.user)) return false; return true; } public String getName() { return name; } public void setName(String name) { this.name = name; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
AdminSeri.javajava
package com.javase.cloneable; import java.io.Serializable; public class AdminSeri implements Serializable { private static final long serialVersionUID = 1L; private String name; private Userseri user; public AdminSeri(String name, Userseri user) { this.name = name; this.user = user; } public AdminSeri() { } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((name == null) ? 0 : name.hashCode()); result = prime * result + ((user == null) ? 0 : user.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; AdminSeri other = (AdminSeri) obj; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; if (user == null) { if (other.user != null) return false; } else if (!user.equals(other.user)) return false; return true; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Userseri getUser() { return user; } public void setUser(Userseri user) { this.user = user; } }
BeanUtil.javaide
package com.javase.cloneable; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public abstract class BeanUtil { @SuppressWarnings("unchecked") public static <T> T cloneTo(T src) throws RuntimeException { ByteArrayOutputStream memoryBuffer = new ByteArrayOutputStream(); ObjectOutputStream out = null; ObjectInputStream in = null; T dist = null; try { out = new ObjectOutputStream(memoryBuffer); out.writeObject(src); out.flush(); in = new ObjectInputStream(new ByteArrayInputStream(memoryBuffer.toByteArray())); dist = (T) in.readObject(); } catch (Exception e) { throw new RuntimeException(e); } finally { if (out != null) try { out.close(); out = null; } catch (IOException e) { throw new RuntimeException(e); } if (in != null) try { in.close(); in = null; } catch (IOException e) { throw new RuntimeException(e); } } return dist; } }
User.javathis
package com.javase.cloneable; public class User implements Cloneable{ private String name; private String age; public User(){}; public User(String name, String age) { this.name = name; this.age = age; } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((age == null) ? 0 : age.hashCode()); result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; User other = (User) obj; if (age == null) { if (other.age != null) return false; } else if (!age.equals(other.age)) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } }
Userseri.java.net
package com.javase.cloneable; import java.io.Serializable; public class Userseri implements Serializable{ private static final long serialVersionUID = 4546638476836460643L; private String name; private String age; public Userseri(){}; public Userseri(String name, String age) { this.name = name; this.age = age; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((age == null) ? 0 : age.hashCode()); result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Userseri other = (Userseri) obj; if (age == null) { if (other.age != null) return false; } else if (!age.equals(other.age)) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } }