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]
阅读全文
0 0
- java_clone方法使用详解
- Java_Clone
- showModalDialog()方法使用详解
- showModalDialog()方法使用详解
- showModalDialog()方法使用详解
- Format方法使用详解
- 方法使用详解
- AsyncTask 使用,方法详解
- showModalDialog()、showModelessDialog()方法使用详解
- showModalDialog()、showModelessDialog()方法使用详解
- showModalDialog()、showModelessDialog()方法使用详解
- showModalDialog()、showModelessDialog()方法使用详解
- showModalDialog()、showModelessDialog()方法使用详解
- showModalDialog()、showModelessDialog()方法使用详解
- showModalDialog()、showModelessDialog()方法使用详解
- showModalDialog()、showModelessDialog()方法使用详解
- showModalDialog()、showModelessDialog()方法使用详解
- showModalDialog()、showModelessDialog()方法使用详解
- Java中Static Class及静态内部类和非静态内部类的不同
- android button 选中点击效果
- Project facet Java version 1.8 is not supported.
- opengles文字绘制相关资料
- wc命令总结
- java_clone方法使用详解
- C内存操作问题检查工具使用
- Consul 使用
- 使用 imagecopymerge() 函数创建半透明水印
- 装饰模式简单例子
- MySQL 5.7.18 解压缩版本的安装
- springMVC 中文乱码问题检查
- zsdf
- 分针网——每日分享:HTML5新增标签 + 智能表单