java_clone方法使用详解

来源:互联网 发布:单机加密软件 编辑:程序博客网 时间:2024/06/07 18:58

核心实现代码

class Employee implements Cloneable{private String name;private double salary;private Date hireDay;public Employee clone() throws CloneNotSupportedException{Employee o = (Employee)super.clone(); //Object.clone()o.hireDay = (Date)hireDay.clone();return o;}}

两点说明

1、clone方法实现要点:实现 Cloneable接口 + 使用public访问修饰符重新定义clone方法以实现深拷贝

2、clone方法是Object类的一个protected方法,因此无法调用anObj.clone(),也就是说用户在编写的代码中不能直接调用它,只有Employee才能克隆Employee对象(这样通过类来拷贝将避免出现浅拷贝的 问题)

3、Cloneable接口是java提供的几个标记接口(tagging interface),与通常接口不同的是它没有指定方法,Cloneable中的clone方法是从Object类继承而来,这个Cloneable接口作为标记是想说明如果一个对象需要克隆而没有实现Cloneable接口,就会产生一个异常。

完整示例程序

/** * This program demonstrates clone() */import java.util.*;class Employee implements Cloneable{private String name;private double salary;private Date hireDay;public Employee(String n, double s){name = n;salary = s;hireDay = new Date();}public void setHireDay(int year, int month, int day){Date newHireDay = new GregorianCalendar(year, month-1, day).getTime();hireDay.setTime(newHireDay.getTime());}public void raiseSalary(double per){salary *= (1 + per/100);}public String toString(){return "Employee[name=" + name + ",salary=" + salary + ",hireDay=" + hireDay + "]";}public Employee clone() throws CloneNotSupportedException{Employee o = (Employee)super.clone(); //call Object.clone()o.hireDay = (Date)hireDay.clone();  //clone mutable fieldsreturn o;}}public class Test{public static void main(String args[]){try{Employee t1 = new Employee("alice", 1000);t1.setHireDay(2000, 1, 1);Employee t2 = t1.clone();t2.raiseSalary(100);t2.setHireDay(2010, 1, 1);System.out.println(t1.toString());System.out.println(t2.toString());}catch(CloneNotSupportedException e){e.printStackTrace();}}}
output:

Employee[name=alice,salary=1000.0,hireDay=Sat Jan 01 00:00:00 CST 2000]Employee[name=alice,salary=2000.0,hireDay=Fri Jan 01 00:00:00 CST 2010]
原创粉丝点击