Cloneable接口的作用

1.Cloneable接口

Cloneable接口是标记型接口,它是内部没有方法和属性,实现Cloneable 接口来表示该类可以被克隆,才可以调用Object.clone() 方法对该类的实例进行按字段复制。如果在没有实现Cloneable 接口的实例上调用Object.clone() 方法,则会抛出CloneNotSupportedException(克隆不被支持)的异常。

2.克隆的分类

 克隆分为深克隆和浅克隆。

浅克隆(shallow clone):浅克隆是指拷贝对象时仅仅copy对象本身和对象中的基本变量,而不拷贝对象包含的引用指向的对象。

深克隆(deep clone):不仅仅copy对象本身,而且copy对象包含的引用指向的所有对象。

 浅克隆:只需要调用Object中的clone() 方法。

public class Equalis implements Cloneable{
	public String name;
	public int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "Equalis [name=" + name + ", age=" + age + "]";
	}

	protected Objec clone() throws CloneNotSupportedException {
		return (Equalis) super.clone();
		
	}
		
	}

 测试

public class EqualsTest {
	public static void main(String[] args) throws CloneNotSupportedException {
		
		
		Equalis e  = new Equalis();
		e.setName("张三");
		e.setAge(10);
		System.out.println(e.hashCode());
		Equalis e1 = e.clone();
		System.out.println(e1.hashCode());
	}

}

运行结果:118352462
                  1550089733

两者的hashcode值不同,说明clone() 方法并不是直接把e的引用直接赋给e1 ,而是在堆中重新开辟了一块空间,将e 复制过去,把新的地址返回给了e1。 

 深克隆:如果要进行深克隆则要进行重写Object 中的clone() 方法。

public Object clone() throws CloneNotSupportedException {  
        Test          test = new Test(this.test.userData);    
        double      data1 = this.data1;  
        String        data2 = new String(this.data2);  
        StringBuffer data3 = new StringBuffer(this.data3.toString());  
          
        CloneableClass copy = new CloneableClass(test, data1, data2, data3);  
        return copy;  
}

 

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值