Explains the difference between deep and shallow JAVA clones

  • 2020-04-01 01:58:39
  • OfStack

Clone objects in JAVA can not simply use the clone method, clone method is only shallow cloning. See below:
Deep cloning:
Java code

import java.io.ByteArrayInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
public class DepthClone { 
    public  final static Object objectCopy(Object oldObj) { 
        Object newObj = null; 
        try { 
            ByteArrayOutputStream bo = new ByteArrayOutputStream(); 
            ObjectOutputStream oo = new ObjectOutputStream(bo); 
            oo.writeObject(oldObj);//The source object
            ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray()); 
            ObjectInputStream oi= new ObjectInputStream(bi); 
            newObj = oi.readObject();//The target object
        } catch (IOException e) { 
            e.printStackTrace(); 
        }catch (ClassNotFoundException e) { 
            e.printStackTrace(); 
        } 
        return newObj; 
    } 
} 

Shallow clone class:
Java code

import java.io.Serializable; 
public class SimpleClone implements Cloneable ,Serializable { 
    private static final long serialVersionUID = -7552721152118950502L; 

    public    String s = null; 
    public Object o = null; 
    public CloneObject cloneObject = null; 

     
    public SimpleClone(CloneObject cloneObject) { 
        this.cloneObject = cloneObject; 
    } 
    public Object clone() { 
        SimpleClone newSimpleClone =  null; 
        try { 
             
            newSimpleClone = (SimpleClone)super.clone(); 
        } catch (CloneNotSupportedException e) { 
            e.printStackTrace(); 
        } 
        return newSimpleClone; 
    } 
} 

Clone object:
Java code

import java.io.Serializable; 

public class CloneObject implements Serializable{ 

    private static final long serialVersionUID = 4332788486669750696L; 

    private String name ; 

    public String getName() { 
        return name; 
    } 

    public void setName(String name) { 
        this.name = name; 
    } 

} 

Cloning test:
Java code

public class TestClone { 

    public static void main(String[] arg) { 
        CloneObject obj1 = new CloneObject(); 
        obj1.setName("cloneOne"); 
        CloneObject obj2 = new CloneObject(); 
        obj2.setName("cloneTwo"); 

        SimpleClone simpleClone1 = new SimpleClone(obj1); 
        SimpleClone simpleClone2 = new SimpleClone(obj2); 

        simpleClone1.s = "simpleClone1"; 
        simpleClone1.o = "simpleClone1Object"; 

        //simpleClone2 = (SimpleClone)simpleClone1.clone(); 

        simpleClone2 = (SimpleClone)DepthClone.objectCopy(simpleClone1); 

         
        simpleClone2.cloneObject.setName("cloneThree"); 

        System.out.println(simpleClone1.cloneObject.getName()); 
        System.out.println(simpleClone2.cloneObject.getName()); 
    } 

} 


Related articles: