Cloneable接口声明中没有指定要实现的方法,一个类要实现Cloneable,最好是覆盖Object类的clone()方法。
1.
如果类没有实现Cloneable接口,调用类对象的clone方法抛出CloneNotSupportedException。
- public class CloneableTest {
-
- public static void main(String[] args) throws CloneNotSupportedException {
- CloneableTest test = new CloneableTest();
- Object obj = test.clone();
- }
- }
结果是抛出CloneNotSupportedException异常
2.
我们无法定义一个类数组实现了Cloneable,
所以数组默认是实现了Cloneable接口。
-
- public class Person[] implements Cloneable
- int[] iMarks = new int[] { 4, 7, 1 , 8 };
- int[] copyofiMarks = iMarks.clone();
运行没问题。
3. Object提供的clone方法是浅度复制
(shallow copy)。
- public class Name {
- private String firstName;
- private String lastName;
-
- }
- public class Person implements Cloneable {
- private Name name;
- private int age;
-
-
- protected Object clone() throws CloneNotSupportedException {
- return super.clone();
- }
- }
- Name name = new Name("John", "Chen");
- Person person = new Person(name, 28);
- Person copyOfPerson = (Person)person.clone();
- name.setFirstName("Johnny");
- name.setLastName("Qin");
- person.setAge(29);
- System.out.println(copyOfPerson.getName().getFirstName() + " " +
- copyOfPerson.getName().getLastName() +
- " " + copyOfPerson.getAge());
结果是:Johnny Qin
28
对于原型类型(如int),clone是没问题的,被clone的对象改变了不会影响到复制品(age还是28)。
对于引用类型(如Name),clone方法只是复制了引用(浅度就体现在这),如果改变了引用的值,复制品也会受到影响(Johnny
Qin)。
4.
继承链上的祖先必须要有一个类声明实现Cloneable接口。
- public class Male extends Person implements Cloneable {
- protected Object clone() throws CloneNotSupportedException {
- return super.clone();
- }
- }
- public class ChineseMale extends Male {
- }
- Person person = new Person();
- Male male = new male();
- ChineseMale chineseMale = new ChineseMale();
- person.clone();
- male.clone();
- chineseMale.clone();
person.clone()会报错。
5.
Object类本身没有实现Cloneable接口,在一个Object类对象上调用clone方法会报CloneNotSupportedException。
Cloneable接口的使用<Reprinted>,布布扣,bubuko.com
Cloneable接口的使用<Reprinted>
原文:http://www.cnblogs.com/xxx-xxx/p/3631945.html