(2)clone小结
来源:互联网 发布:linux实用命令 编辑:程序博客网 时间:2024/05/19 03:29
Clone方法
为什么要使用clone方法?原因:java面向对象的设计语言,处处都是对象,基本数据类型遵循值传递,数据保存在栈上,对象也遵循值传递——引用传递(地址传递),数据保存在堆上。clone分为浅拷贝和深拷贝。
下面看一段程序,原始变量和拷贝变量引用同一个对象,无论调用e的setName还是ee的setName,都改变堆对象Employee的name域。
public class Employee { private String name;private double salary;private Date hireDay;public Employee(String name, double salary, int year, int month, int day) {super();this.name = name;this.salary = salary;GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day);this.hireDay = calendar.getTime();}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getSalary() {return salary;}public void setSalary(double salary) {this.salary = salary;}public Date getHireDay() {return hireDay;}public void raiseSalary(double byPercent) {this.salary = this.salary * byPercent / 100; } public static void main(String[] args) {Employee e = new Employee("Estelle",50000,2017,2,2);Employee ee = e;System.out.println("name is :" + e.getName());//Estelleee.setName("Heng");System.out.println("name is :" + e.getName());//HengSystem.out.println("name is :" + ee.getName());//HengEmployee copy = e.clone(); }}
要想实现e和ee改变name值不同步,需要使用Object.clone()方法。因为e和ee引用同一个对象。Object.clone()方法修饰符为protected,所以只能实现子类的拷贝。
1、浅拷贝
浅拷贝:只能实现基本数据类型的拷贝,若Employee类中有可变子对象,则无法真正意义下的完全拷贝,则需要深拷贝。如下图所示,Employee中子对象name是String类(不可改变类),salary是基本数据类型数据,都可以实现拷贝,但hireDay是可变子对象,所以在浅拷贝下仍引用同一个Date。
2、深拷贝
public Employee clone() {try {Employee copy = (Employee) super.clone();copy.hireDay = (Date) hireDay.clone();//实现Date子对象的克隆} catch (CloneNotSupportedException e) {// TODO Auto-generated catch blocke.printStackTrace();}return copy;}
0 0
- (2)clone小结
- 数据库clone(ebs)2
- 深入浅出Java clone技术(2)
- R12.2 clone 总结
- Java 中clone()
- Clone()方法详解
- day74(clone用法)
- java clone()
- java clone()
- clone
- clone
- clone
- clone
- clone
- Clone
- clone
- clone
- clone
- JAVA RSA加解密和数字签名、DES加解密 在项目中的实际使用
- 一个促销活动并发抢标出现事故的优化经历
- mybatis#{}和${}的区别/去除生成的SQL语句的单引号
- 软件测试思路
- Android5.1对于第三方apk的系统编译
- (2)clone小结
- svn服务器搭建和使用(二)
- MeasureSpec中三种模式:UNSPECIFIED,AT_MOST,EXACTLY
- ORACLE临时表总结
- .NetCore~C#6的一些新特性
- LWIP手记【A】arp流程之典型情况一
- Android DataBinding:再见Presenter,你好ViewModel!
- QT界面数据传递
- 逍遥安卓与Genymotion两种安卓模拟器的对比测试