克隆对象就是复制一个一模一样的对象,但是复制出来的对象和原对象不是同一个对象,是两个对象,只不过复制过来的对象和原对象除了内存地址之外,其它的属性一模一样。
在超类 Object 中有一个 clone() 方法:
protected native Object clone() throws CloneNotSupportedException;
这里涉及到一个新的关键字 native,该关键字是与 C++ 联合开发的时候使用,纯 Java 的开发中并不会涉及到该关键字。如果一个方法中使用了 native 关键字,表示该方法是一个原生函数,也就是说这个方法是用 C++ 语言实现的,且被编译成了 DLL,由 Java 调用。
该方法定义上有一个 CloneNotSupportedException 异常声明,如果我们要克隆的对象所属的类, 没有实现 Cloneable 接口,那么这个对象就不能克隆,此时进行克隆操作的时候就会报异常。
Cloneable 接口的源码:
public interface Cloneable {
}
Cloneable 接口中没有定义任何内容,这样的接口我们称之为标识性接口,表示的是一种能力,即某个类如果实现了 Cloneable 接口,就表示该类类型的实例对象具备克隆能力。
示例:
public class Person implements Cloneable{private String name;private int age;public Person(String name,int age){this.name = name;this.age = age;}/*** 重写 toString 方法* @return*/@Overridepublic String toString() {return "["+this.name + "," + this.age + "]";}/*** 重写克隆方法,修改访问权限* @return* @throws CloneNotSupportedException*/@Overridepublic Object clone() throws CloneNotSupportedException {return super.clone();}}
public class Test {public static void main(String[] args) throws CloneNotSupportedException {Person person1 = new Person("张三",11);Person person2 = (Person) person1.clone();System.out.println(person1 == person2);System.out.println(person1.toString());System.out.println(person2.toString());}
}
打印结果: