zoukankan      html  css  js  c++  java
  • Java 深拷贝、浅拷贝及Cloneable接口

    Cloneable接口是一个空接口,仅用于标记对象,Cloneable接口里面是没有clone()方法,的clone()方法是Object类里面的方法!默认实现是一个Native方法

    protected native Object clone() throws CloneNotSupportedException;
    

    如果对象implement Cloneable接口的话,需要覆盖clone方法(因为Object类的clone方法是protected,需要覆盖为public)

    	public Object clone() throws CloneNotSupportedException{
    		return super.clone();
    	}
    

    Object类里的clone()方法仅仅用于浅拷贝(拷贝基本成员属性,对于引用类型仅返回指向改地址的引用)

    深拷贝需要重新覆盖Clone方法。

    public class testDeepClone implements Cloneable {
    	public int num = 0;
    	public String str = "default";
    	public A a;
    
    	public Object clone() throws CloneNotSupportedException {
    		testDeepClone o = (testDeepClone) super.clone();
    		o.str = new String(this.str);
    		o.a = (A) a.clone();
    		return o;
    	}
    }
    
    // 成员属性A必须为Cloneable的,否则无法Clone其组合的类
    class A implements Cloneable {
    	public Object clone() throws CloneNotSupportedException {
    		return super.clone();
    	}
    }
    

     利用Serializable来实现深层复制

    利用Serializable进行深拷贝的时候成员属性也必须是Serializable的,否则只返回一个引用,具体参考本人的博客:

    Java中的Serializable接口transient关键字,及对象IO

  • 相关阅读:
    php面向对象方法
    php数组中元素的操作
    PHP数组的排序
    [设计模式]抽象工厂模式
    [设计模式]建造者模式
    [设计模式]工厂方法模式
    [设计模式]简单工厂模式
    [设计模式]单例模式
    设计模式系列
    JAVA 设计模式 状态模式
  • 原文地址:https://www.cnblogs.com/tonyluis/p/5778266.html
Copyright © 2011-2022 走看看