Turn https://blog.csdn.net/zhaoheng314/article/details/81985880
Java language clones are instances of classes
/Library/Java/JavaVirtualMachines/jdk1.8.0_221.jdk/Contents/Home/jre/lib/rt.jar!/java/lang/Cloneable.class
According to comments Cloneable interface, cloning need to follow these rules:
- We must implement the interface Cloneable
- The implement Cloneable should override clone (), which modifier is overridden to public.
/Library/Java/JavaVirtualMachines/jdk1.8.0_221.jdk/Contents/Home/jre/lib/rt.jar!/java/lang/Object.class
protected Native Object clone () throws CloneNotSupportedException;
Age attribute is of type int values just pass the basic type clone, there is no reference to pass
String class immutable characteristics of the final keyword, modifying the clone name attribute references
a deep clone
public class Student implements Cloneable{ Private String name; // reference type keyword final one is immutable, and second, prohibit instruction reordering Private int Age; // basic types Private the Classes classes; // reference type public void setName(String name){ this.name = name; } public void setAge(int age){ this.age = age; } public void setClasses(Classes classes){ this.classes = classes; } public String getName(){ return name; } public Classes getClasses(){ return classes; } @Override public String toString() { return "Student [name=" + name + ", age=" + age + ", classes=" + classes + "]"; } @Override protected Object clone() throws CloneNotSupportedException { Student stu = (Student)super.clone(); // called when the attribute classes clones clone Classes class (); Classes cla = (Classes)classes.clone(); stu.setClasses(cla); return stu; } }
public class Classes implements Cloneable{ Private int classId; // basic types Private String className; // reference type public void setClassId(int classId){ this.classId = classId; } public void setClassName(String className){ this.className = className; } @Override public String toString() { return "Classes [classId=" + classId + ", className=" + className + "]"; } @Override protected Object clone() throws CloneNotSupportedException{ return super.clone(); } }
public class TestClone { public static void main(String[] args) { Student stu = new Student(); stu.setName ( "Joe Smith" ); stu.setAge ( 10 ); Classes classes = new Classes(); classes.setClassId(101); classes.setClassName("一班"); stu.setClasses(classes); try{ System.out.println ( "deep clone ----- Test" ); // clone Student STU2 = (Student) stu.clone (); System.out.println ( "two objects are the same:" + (STU == STU2)); System.out.println ( "name attribute is the same two objects:" + (stu.getName () == stu2.getName ())); System.out.println ( "two objects are the same classes:" + (stu.getClasses () == stu2.getClasses ())); System.out.println ( "deep clone, Stu" + STU); System.out.println ( "deep clone, STU2" + STU2); System.out.println ( "Modify Object Properties Cloning" ); stu2.setName ( "John Doe"); // public class String Final immutable one, two rearrangements are disallowed instructions modify attribute name refers stu2.setAge (20 is ); stu2.getClasses().setClassId(102); stu2.getClasses().setClassName("二班"); System.out.println ( "modified cloning object properties, Stu" + STU); System.out.println ( "modified cloning object properties, STU2" + STU2); }catch (CloneNotSupportedException e){ e.printStackTrace (); } } }