On cloning mechanism in Java

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:

  1. We must implement the interface Cloneable
  2. 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 ();
        }



    }
}

 

Guess you like

Origin www.cnblogs.com/erinchen/p/11647967.html