使用clone( )和Cloneable接口
来源:互联网 发布:人工智能和机器人 编辑:程序博客网 时间:2024/05/17 21:44
使用clone( )和Cloneable接口
(2012-06-28 15:31:39)杂谈
使用clone( )和Cloneable接口
由Object类定义的绝大部分方法在本书其他部分讨论。而一个特别值得关注的方法是clone( )。clone( )方法创建调用它的对象的一个复制副本。只有那些实现Cloneable接口的类能被复制。
Cloneable接口没有定义成员。它通常用于指明被创建的一个允许对对象进行位复制(也就是对象副本)的类。如果试图用一个不支持Cloneable接口的类调用clone( )方法,将引发一个CloneNotSupportedExcepti
复制是一个具有潜在危险的操作,因为它可能引起不是你所期望的副作用。例如,假如被复制的对象包含了一个称为obRef的引用变量,当副本创建时,副本中的obRef如同原对象中的obRef一样引用相同的对象。如果副本改变了被obRef引用的对象的内容,那么对应的原对象也将被改变。这里是另一个例子。如果一个对象打开一个I/O流并被复制,两个对象将可操作相同的流。而且,如果其中一个对象关闭了流,而另一个对象仍试图对I/O流进行写操作的话,将导致错误。
由于复制可能引起问题,因此在Object内,clone( )方法被说明为protected。这就意味着它必须或者被由实现Cloneable的类所定义的方法调用,或者必须被那些类显式重载以便它是公共的。让我们看关于下面每一种方法的例子。
下面的程序实现Cloneable接口并定义cloneTest( )方法,该方法在Object中调用clone( )方法:
// Demonstrate the clone() method.
class TestClone implements Cloneable {
int a;
double b;
// This method calls Object's clone().
TestClone cloneTest() {
try {
// call clone in Object.
return (TestClone) super.clone();
} catch(CloneNotSupportedExcepti
System.out.println("Cloning not allowed.");
return this;
}
}
}
class CloneDemo {
public static void main(String args[]) {
TestClone x1 = new TestClone();
TestClone x2;
x1.a = 10;
x1.b = 20.98;
x2 = x1.cloneTest(); // clone x1
System.out.println("x1: " + x1.a + " " + x1.b);
System.out.println("x2: " + x2.a + " " + x2.b);
}
}
这里,方法cloneTest( )在Object中调用clone( )方法并且返回结果。注意由clone( )方法返回的对象必须被强制转换成它的适当类型(TestClone)。
下面的例子重载clone( )方法以便它能被其类外的程序所调用。为了完成这项功能,它的存取说明符必须是public,如下所示:
// Override the clone() method.
class TestClone implements Cloneable {
int a;
double b;
// clone() is now overridden and is public.
public Object clone() {
try {
// call clone in Object.
return super.clone();
} catch(CloneNotSupportedExcepti
System.out.println("Cloning not allowed.");
return this;
}
}
}
class CloneDemo2 {
public static void main(String args[]) {
TestClone x1 = new TestClone();
TestClone x2;
x1.a = 10;
x1.b = 20.98;
// here, clone() is called directly.
x2 = (TestClone) x1.clone();
System.out.println("x1: " + x1.a + " " + x1.b);
System.out.println("x2: " + x2.a + " " + x2.b);
}
}
由复制带来的副作用最初一般是比较难发现的。通常很容易想到的是类在复制时是很安全的,而实际却不是这样。一般在没有一个必须的原因的情况下,对任何类都不应该执行Cloneable。
- 使用clone( )和Cloneable接口
- 使用clone( )和Cloneable接口
- 使用clone( )和Cloneable接口
- 使用clone( )和Cloneable接口
- Objcet.clone() 和Cloneable 接口
- Cloneable接口和Object的clone()方法
- Java中的clone()和Cloneable接口
- Cloneable 和 clone()的总结和使用
- Cloneable 和 clone()的总结和使用
- Cloneable接口和Object的clone()方法
- Cloneable接口与Clone方法
- Java中Cloneable 和 clone()的总结和使用
- 实现Cloneable接口,重写clone方法
- Cloneable接口使用
- java.lang.Cloneable 实现深clone和浅clone
- Cloneable和clone的使用,以及深复制与浅复制的区别
- java 重写接口Cloneable的Clone方法 拷贝对象
- 不实现Cloneable接口,实现clone()方法功能
- android录音功能的实现
- Python 中的除法运算 // 和 /
- 【09类和模块】——6:javascript中的面向对象技术(集合类)
- Linux字符驱动学习之LED
- 针对一个文件夹压缩成zip文件
- 使用clone( )和Cloneable接口
- Centos7 平台中对于scikit安装教程的学习
- BO 要换个HOST-地址
- c++中void指针和const指针浅析
- npoi2.0版本word中插入图片
- 反射在连接数据库的作用
- 杭州--10
- G
- 71. Simplify Path