Java语言的克隆与深层次克隆技术入门与精通
2007-11-13 17:44Update
本文介绍Java语言的对象克隆与对象的深层次克隆技术。
我们知道,Java是纯面向对象的程序设计语言。Java里,所有的类的顶级父类都是java.lang.Object类,也就是说,如果一个类没有显示申明继承关系,它的父类默认就是java.lang.Object。
有一个很简单的方法可以证明这一点,我们写一个Test类,如下:
public class Test {
public void someMethod() {
super.clone();
}
}
里面调用了super.clone(),编译时并不报错。其实clone()方法为java.lang.Object类提供的一个protected型方法。
对象克隆
本文通过介绍java.lang.Object#clone()方法来说明Java语言的对象克隆特性。java.lang.Object#clone()方法由java.lang.Object加以实现,主要对对象本身加以克隆。
首先我们看看下面的例子:
public class TestClone {
public static void main(String[] args) {
MyClone myClone1 = new MyClone("clone1");
MyClone myClone2 = (MyClone)myClone1.clone();
if (myClone2 != null) {
System.out.println(myClone2.getName());
System.out.println("myClone2 equals myClone1: " + myClone2.equals(myClone1));
} else {
System.out.println("Clone Not Supported");
}
}
}
class MyClone {
private String name;
public MyClone(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Object clone() {
try {
return super.clone();
} catch (CloneNotSupportedException e) {
return null;
}
}
}
编译执行TestClone,打印出:
C:\clone>javac *.java
C:\clone>java TestClone
Clone Not Supported
C:\clone>
说明MyClone#clone()方法调用super.clone()时抛出了CloneNotSupportedException异常,不支持克隆。C:\clone>java TestClone
Clone Not Supported
C:\clone>
为什么父类java.lang.Object里提供了clone()方法,却不能调用呢?
原来,Java语言虽然提供了这个方法,但考虑到安全问题,
一方面将clone()访问级别设置为protected型,以限制外部类访问;
另一方面,强制需要提供clone功能的子类实现java.lang.Cloneable接口,在运行期,JVM会检查调用clone()方法的类,如果该类未实现java.lang.Cloneable接口,则抛出CloneNotSupportedException异常。
java.lang.Cloneable接口是一个空的接口,没有申明任何属性与方法。该接口只是告诉JVM,该接口的实现类需要开放“克隆”功能。
我们再将MyClone类稍作改变,让其实现Cloneable接口:
class MyClone implements Cloneable {
...//其余不做改变
}
编译执行TestClone,打印出:
C:\clone>javac *.java
C:\clone>java TestClone
clone1
myClone2 equals myClone1: false
C:\clone>
根据结果,我们可以发现:C:\clone>java TestClone
clone1
myClone2 equals myClone1: false
C:\clone>
1,myClone1.clone()克隆了跟myClone1具有相同属性值的对象
2,但克隆出的对象myClone2跟myClone1不是同一个对象(具有不同的内存空间)
小结:
如果要让一个类A提供克隆功能,该类必须实现java.lang.Cloneable接口,并重载java.lang.Object#clone()方法。
public class A extends Cloneable {
public Object clone() {
try {
return super.clone();
} catch (CloneNotSupportedException e) {
//throw (new InternalError(e.getMessage()));
return null;
}
}
}
下一页:对象的深层次克隆
- Relative Articles
- Java String处理入门 - null或空值的判断处理 - (2008-03-04 15:44)
- Java static - 静态(全局)方法与静态变量 - (2008-03-02 00:12)
- Java面向对象入门之 类与对象的概念区别 - (2008-03-01 21:05)
- 初识Java语言的 assert关键字 - (2008-02-05 00:31)
- Java语言对properties资源文件的处理 - ResourceBundle类的用法 - (2008-02-05 00:05)
- 怎么向一个命令行Java程序传递参数 - Java入门之命令行参数传递 - (2008-01-31 20:59)
- Java语言的参数传递和处理方法 - 全面掌握Java参数传递与参数 - (2008-01-31 20:57)
- Java日期.时间处理之Date类 - 全面掌握Java里的日期处理 - (2008-01-31 20:53)
- Java基础之 Java注释 - (2008-01-26 15:35)
- Java基础之屏幕打印语句:print()/println() - (2008-01-26 14:46)
- Java的历史和发展 - (2007-11-13 00:29)
- Java语言里的包,类,接口 - (2007-11-13 00:27)
- 环境篇 - 构造Java开发环境 - (2007-11-13 00:24)
- Java语言的操作符 - (2007-10-23 11:36)
- Java语言里的数据类型,变量 - (2007-10-22 15:55)