了解Java中的可克隆接口

什么是对象克隆?

对象克隆是生成具有不同名称的对象的精确字段到字段副本的过程。 克隆的对象在内存中有自己的空间,可在其中复制原始对象的内容。 这就是为什么在克隆后更改原始对象的内容时,所做的更改不会反映在克隆对象中的原因。

我们可以在Java中克隆任何对象吗?

不,我们不能。 当我们尝试直接克隆未实现名为'Cloneable'的标记接口的对象实例时,将导致一个名为CloneNotSupportedException的异常。 因此,为了允许克隆对象实例,相应的对象类必须实现Cloneable接口。 例如 -

public class Employee {
 
   private String name;
 
   public Employee(String name) {
	this.name = name;
   }
 
   public String getName() {
    return name;
   }
	
   public static void main(String[] args) {
	Employee emp = new Employee("Abhi");
	try {
	    Employee emp2 = (Employee) emp.clone();
		System.out.println(emp2.getName());
	} catch (CloneNotSupportedException e) {
		e.printStackTrace();
	}
   }
}

上面的代码在执行时会引发异常,例如–

java.lang.CloneNotSupportedException: Employee
	at java.base/java.lang.Object.clone(Native Method)
	at Employee.main(Employee.java:16)

请注意,Cloneable是标记接口 ,这意味着它没有任何克隆方法规范。 在上面的代码片段中,实现Cloneable只是向JVM指示可以克隆Employee类实例,并且Object类的clone方法对于Employee类而言是合法的。

下面是如何正确克隆Employee类实例以及如何在Employee类中覆盖Object的clone方法的方法。

public class Employee implements Cloneable {
 
	private String name;
 
	public Employee(String name) {
		this.name = name;
	}
 
	public String getName() {
		return name;
	}
 
	public Object clone()throws CloneNotSupportedException{  
		return (Employee)super.clone();  
	}
	
	public static void main(String[] args) {
		Employee emp = new Employee("Abhi");
		try {
			Employee emp2 = (Employee) emp.clone();
			System.out.println(emp2.getName());
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
	}
}

其他标记接口是SerializableCloneableRemote接口。

翻译自: https://www.javacodegeeks.com/2018/03/understanding-cloneable-interface-in-java.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值