Cloneable接口分析
2018-03-31 11:49
190 查看
Cloneable接口是一个标记接口,也就是没有任何内容,定义如下:
package java.lang;
pubilc interface Cloneable{
}
这里分析一下这个接口的用法
java种clone的含义(或者说是目标)
假设x是一个非空对象,应该有:
x.clone()!=x 为true,就是说他们不是同一个对象.
x.clone().getClass()==x.getClass() 为true,他们是同一个类型Class.
x.equals(x.clone()) 为true,逻辑上应该相当.clone方法是在Object种定义的,而且是protected型的,只有实现了这个接口,才可以在该类的实例上调用clone方法,否则会抛出CloneNotSupportException.
Object中默认的实现是一个浅拷贝,也就是表面拷贝,如果需要实现深层次拷贝的话,必须对类中可变域生成新的实例.
pubilc class Unsupported{
public Object clone(){
Object obj;
try {
obj=super.clone();
}
catch (CloneNotSupportedException ex) {
ex.printStackTrace(); //Exception was thrown
}
return obj;//返回的是null
}
}
加上 implements Cloneable 就可以了.
可不可以不实现这个接口,但是覆盖Clone方法.
pubilc class Unnormal{
public Object clone(){
return new Unnormal();
}
}
这样肯定没有问题的,不过已经和java中的clone机制没有关系了.
下面举一个例子说明浅拷贝和深拷贝:
public class ShallowCopy implements Cloneable{
private Date begin;
public Date getBegin(){return this.begin;}
public void setBegin(Date d){this.begin=d;}
public Object clone(){
Object obj=null;
try
{
obj=super.clone();
}
catch (CloneNotSupportedException ex) {
ex.printStackTrace();
}
return obj;
}
}
public class DeepCopy implements Cloneable{
private Date begin;
public Date getBegin(){return this.begin;}
public void setBegin(Date d){this.begin=d;}
public Object clone(){
DeepCopy obj=null;
try
{
obj=(DeepCopy)super.clone();
}
catch (CloneNotSupportedException ex) {
ex.printStackTrace();
}
obj.setBegin((Date)this.getBegin().clone());
return obj;
}
}
package java.lang;
pubilc interface Cloneable{
}
这里分析一下这个接口的用法
java种clone的含义(或者说是目标)
假设x是一个非空对象,应该有:
x.clone()!=x 为true,就是说他们不是同一个对象.
x.clone().getClass()==x.getClass() 为true,他们是同一个类型Class.
x.equals(x.clone()) 为true,逻辑上应该相当.clone方法是在Object种定义的,而且是protected型的,只有实现了这个接口,才可以在该类的实例上调用clone方法,否则会抛出CloneNotSupportException.
Object中默认的实现是一个浅拷贝,也就是表面拷贝,如果需要实现深层次拷贝的话,必须对类中可变域生成新的实例.
pubilc class Unsupported{
public Object clone(){
Object obj;
try {
obj=super.clone();
}
catch (CloneNotSupportedException ex) {
ex.printStackTrace(); //Exception was thrown
}
return obj;//返回的是null
}
}
加上 implements Cloneable 就可以了.
可不可以不实现这个接口,但是覆盖Clone方法.
pubilc class Unnormal{
public Object clone(){
return new Unnormal();
}
}
这样肯定没有问题的,不过已经和java中的clone机制没有关系了.
下面举一个例子说明浅拷贝和深拷贝:
public class ShallowCopy implements Cloneable{
private Date begin;
public Date getBegin(){return this.begin;}
public void setBegin(Date d){this.begin=d;}
public Object clone(){
Object obj=null;
try
{
obj=super.clone();
}
catch (CloneNotSupportedException ex) {
ex.printStackTrace();
}
return obj;
}
}
public class DeepCopy implements Cloneable{
private Date begin;
public Date getBegin(){return this.begin;}
public void setBegin(Date d){this.begin=d;}
public Object clone(){
DeepCopy obj=null;
try
{
obj=(DeepCopy)super.clone();
}
catch (CloneNotSupportedException ex) {
ex.printStackTrace();
}
obj.setBegin((Date)this.getBegin().clone());
return obj;
}
}
相关文章推荐
- Cloneable接口分析,学习了
- JavaSE学习随笔(一) Cloneable接口源码分析与技术细节
- Cloneable接口分析
- Cloneable接口分析
- Java对象克隆(Clone)及Cloneable接口、Serializable接口的深入探讨
- cloneable接口的一段代码
- Java编程中实现Cloneable接口,让类的对象可以复制
- Java中Cloneable接口
- 五星-原型模式常使用于以下场景--而JAVA中的任何类只要实现了Cloneable标识接口,就可以使用clone方法来进行对象的拷贝
- Cloneable接口和Object的clone()方法
- 结合实例详解clone()函数,Cloneable接口以及深拷贝与浅拷贝的问题
- Java对象克隆(Clone)及Cloneable接口、Serializable接口的深入探讨
- Cloneable接口和Object的clone()方法
- 浅谈Java的标识接口-cloneable
- java中的Cloneable接口
- java.lang.Cloneable接口
- java 重写接口Cloneable的Clone方法 拷贝对象
- Java中的深克隆和浅克隆——Cloneable接口
- Java中的Cloneable接口下的clone深拷贝,单纯的获取那个时刻的值
- Java 基础接口(Serializable、Cloneable、RandomAccess)