2025-05-23

在JAVA克隆對象不能簡單的使用clone方法,clone方法隻是進行淺克隆。請看下方:
 
深度克隆類:
Java代碼 
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);//源對象 
            ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray()); 
            ObjectInputStream oi= new ObjectInputStream(bi); 
            newObj = oi.readObject();//目標對象 
        } catch (IOException e) { 
            e.printStackTrace(); 
        }catch (ClassNotFoundException e) { 
            e.printStackTrace(); 
        } 
         
        return newObj; 
    } 

 
淺度克隆類:
Java代碼 
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; 
    } 

 
 克隆對象:
Java代碼 
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; 
    } 
     

 
克隆測試:
Java代碼 
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); 
         
        /* 如果是淺克隆, simpleClone1中的cloneObject會隨著simpleClone2的cloneObject改變面改變*/ 
        simpleClone2.cloneObject.setName("cloneThree"); 
         
        System.out.println(simpleClone1.cloneObject.getName()); 
        System.out.println(simpleClone2.cloneObject.getName()); 
    } 
     

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *