java里clone方法的问题

来源:百度知道 编辑:UC知道 时间:2024/06/04 05:49:59
先贴程序
import java.util.*;

public class CloneTest
{
public static void main(String[] args)
{
try
{
Employee original = new Employee("John Q. Public", 50000);
original.setHireDay(2000, 1, 1);
Employee copy = original.clone();
copy.raiseSalary(10);
copy.setHireDay(2002, 12, 31);
System.out.println("original=" + original);
System.out.println("copy=" + copy);
}
catch (CloneNotSupportedException e)
{
e.printStackTrace();
}
}
}

class Employee implements Cloneable
{
public Employee(String n, double s)
{
name = n;
salary = s;
}

public Employee clone() throws CloneNotSupportedException
{
// call Object.clone()
Employee cloned =

任何Object都是可以执行克隆(clone)方法的。
解释:Object中的clone执行的时候使用了RTTI(run-time type identification)的机制,动态的找到目前正在调用“clone方法”的那个“reference”,根据它的大小申请内存空间,然后进行的复制,将该对象的内存空间完全复制到新的空间中去,从而达到拷贝的目的。 所以调用super.clone() 得到的是当前调用类的副本,而不是父类的副本。
备注:如果在没有实现 Cloneable 接口的实例上调用 Object 的 clone 方法,则会导致抛出 CloneNotSupportedException 异常,这便是“合法”的含义。 但请注意,Cloneable接口只是个标签接口,不含任何需要实现的方法,就像Serializable接口一样。

首先必须实现接口,
public interface Cloneable此类实现了 Cloneable 接口,以指示 Object.clone() 方法可以合法地对该类实例进行按字段复制。

如果在没有实现 Cloneable 接口的实例上调用 Object 的 clone 方法,则会导致抛出 CloneNotSupportedException 异常。

按照惯例,实现此接口的类应该使用公共方法重写 Object.clone(它是受保护的)。请参阅 Object.clone(),以获得有关重写此方法的详细信息。
==》protected Object clone() throws CloneNotSupportedException

注意,此接口不 包含 clone 方法。因此,因为某个对象实现了此接口就克隆它是不可能的。即使 clone 方法是反射性调用的,也无法保证它将获得成功。

public class Box implements Cloneable{

public Date d = new Date();

@Override
public Box clone() throws CloneNotSupported