参考:《Java经典编程》实例054~058,《Java7 入门经典》

1.   使用构造函数复制对象

对象是传址调用,直接通过“=”来进行连接是并没有达到复制对象的目的。下面这样的类可以通过构造函数来复制对象。局限在于,要求生成对象的类的域仅仅是基本类型,没有其他引用类型。如果有引用类型,则新对象仅仅复制了引用类型的副本,他们指向同一个对象,这是浅复制。除非对该引用类型也再次进行构造函数的复制,直到所有复制都针对的是基本类型,这是深复制。

根据《Java7 入门经典》P250页6.8.3节的说法,跟第二类的复杂的克隆相比,构造函数法是复制对象方法的最佳实践。

第一类:域只有基本类型

public class Employee {

private String name;

private int age;

/**

* 构造函数复制对象

*/

public Employee(Employee employee) {

// TODO Auto-generated constructor stub

name=employee.getName();

age=employee.getAge();

}

/**

* 初始化

*/

public Employee(String name,int age) {

// TODO Auto-generated constructor stub

this.name=name;

this.age=age;

}

@Override

public String toString() {

// TODO Auto-generated method stub

return "姓名:"+name+",年龄"+age;

}

//省略set()和get()函数

}

第二类:域有引用类型Addres address,需要对其也进行构造函数复制

/**

* 创建时间:2014年9月8日 下午2:38:13

* 项目名称:Test

* @author Cao Yanfeng

* @since JDK 1.6.0_21

* 类说明:

*/

public class Employee {

private String name;

private int age;

private Address address;

/**

* 初始化

*/

public Employee(String name,int age,Address address) {

// TODO Auto-generated constructor stub

this.name=name;

this.age=age;

this.address=new Address(address);

}

/**

* 构造函数复制

*/

public Employee(Employee employee) {

// TODO Auto-generated constructor stub

name=employee.getName();

age=employee.getAge();

address=new Address(employee.getAddress());

}

@Override

public String toString() {

// TODO Auto-generated method stub

return "姓名:"+name+",年龄:"+age+",地址——"+address;

}

//省略set()和get()函数

}

/**

* 创建时间:2014年9月8日 下午2:52:18 项目名称:Test

*

* @author Cao Yanfeng

* @since JDK 1.6.0_21 类说明:

*/

public class Address {

private String state;

private String province;

private String city;

/**

* 构造函数实现复制

*/

public Address(Address address) {

// TODO Auto-generated constructor stub

state=address.state;

province=address.province;

city=address.city;

}

/**

* 初始化

*/

public Address(String state, String province, String city) {

// TODO Auto-generated constructor stub

this.state = state;

this.province = province;

this.city = city;

}

@Override

public String toString() {

// TODO Auto-generated method stub

StringBuilder stringBuilder = new StringBuilder();

stringBuilder.append("国家:" + state + ",");

stringBuilder.append("省:" + province + ",");

stringBuilder.append("市:" + city);

return stringBuilder.toString();

}

//省略set()和get()函数

}

2.   对象克隆   克隆的效果和使用构造函数复制对象高度一致,局限在于,要求生成对象的类的域仅仅是基本类型,没有其他引用类型。如果有引用类型,则新对象仅仅复制了引用类型的副本,他们指向同一个对象,并没有对其进行克隆,这是浅克隆。除非对该引用类型也再次进行clone,直到所有clone都针对的是基本类型,这就是深度克隆。

注意,所有类都要实现Cloneable接口,并重写clone()方法。

第一类:域只有基本类型

/

**

* 创建时间:2014年9月8日 下午2:38:13 项目名称:Test

*

* @author Cao Yanfeng

* @since JDK 1.6.0_21 类说明:

*/

public class Employee implements Cloneable {

private String name;

private int age;

/**

* 初始化

*/

public Employee(String name, int age) {

// TODO Auto-generated constructor stub

this.name = name;

this.age = age;

}

@Override

protected Employee clone() throws CloneNotSupportedException {

// TODO Auto-generated method stub

Employee employee = null;

employee = (Employee) super.clone();

return employee;

}

@Override

public String toString() {

// TODO Auto-generated method stub

// return "姓名:"+name+",年龄:"+age+",地址——"+address;

return "姓名:" + name + ",年龄:" + age;

}

//省略set()和get()函数

}

第二类:域有引用类型Addres address,需要对其也进行clone

/**

* 创建时间:2014年9月8日 下午2:38:13 项目名称:Test

*

* @author Cao Yanfeng

* @since JDK 1.6.0_21 类说明:

*/

public class Employee implements Cloneable {

private String name;

private int age;

private Address address;

/**

*

*/

public Employee(String name, int age,Address address) {

// TODO Auto-generated constructor stub

this.name = name;

this.age = age;

this.address=address;

}

// @Override

protected Employee clone() throws CloneNotSupportedException {

// TODO Auto-generated method stub

Employee employee = null;

employee = (Employee) super.clone();

employee.address=address.clone();

return employee;

}

@Override

public String toString() {

// TODO Auto-generated method stub

return "姓名:"+name+",年龄:"+age+",地址——"+address;

}

//省略set()和get()函数

}

/**

* 创建时间:2014年9月8日 下午2:52:18 项目名称:Test

*

* @author Cao Yanfeng

* @since JDK 1.6.0_21 类说明:

*/

public class Address implements Cloneable{

private String state;

private String province;

private String city;

/**

* 初始化

*/

public Address(String state, String province, String city) {

// TODO Auto-generated constructor stub

this.state = state;

this.province = province;

this.city = city;

}

@Override

protected Address clone() throws CloneNotSupportedException {

// TODO Auto-generated method stub

Address address=null;

address=(Address)super.clone();

return address;

}

@Override

public String toString() {

// TODO Auto-generated method stub

StringBuilder stringBuilder = new StringBuilder();

stringBuilder.append("国家:" + state + ",");

stringBuilder.append("省:" + province + ",");

stringBuilder.append("市:" + city);

return stringBuilder.toString();

}

//省略set()和get()函数

}

3.   对象序列化   对象序列化即把待复制的对象从内存写到本地文件中,然后再从本地文件读到出内存中并赋给新的引用。对象序列号实现了深度克隆。

注意,待序列化化的对象要实现Serializable接口,域中如果有引用类型,也要实现Serializable接口,否则序列化出错。

/**

* 创建时间:2014年9月8日 下午2:36:34

* 项目名称:Test

* @author Cao Yanfeng

* @since JDK 1.6.0_21

* 类说明:

*/

public class ObjectCloneTest {

/**

* @param args

* @throws CloneNotSupportedException

*/

public static void main(String[] args) throws CloneNotSupportedException {

// TODO Auto-generated method stub

Address address=new Address("中国", "北京", "北京");

Employee employee=new Employee("曹艳丰",23,address);

System.out.println(employee);

Employee employee2=null;

ObjectOutputStream out=null;

ObjectInputStream in=null;

try {

out=new ObjectOutputStream(new FileOutputStream("employee.dat"));

out.writeObject(employee);

in=new ObjectInputStream(new FileInputStream("employee.dat"));

employee2=(Employee)in.readObject();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (ClassNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

System.out.println(employee2);

}

}

/**

* 创建时间:2014年9月8日 下午2:38:13 项目名称:Test

*

* @author Cao Yanfeng

* @since JDK 1.6.0_21 类说明:

*/

public class Employee implements Serializable {

/**

* 序列号

*/

private static final long serialVersionUID = 1L;

private String name;

private int age;

private Address address;

/**

*

*/

public Employee(String name, int age, Address address) {

// TODO Auto-generated constructor stub

this.name = name;

this.age = age;

this.address = address;

}

@Override

public String toString() {

// TODO Auto-generated method stub

return "姓名:" + name + ",年龄:" + age + ",地址——" + address;

}

//省略set()和get()函数

}

/**

* 创建时间:2014年9月8日 下午2:52:18 项目名称:Test

*

* @author Cao Yanfeng

* @since JDK 1.6.0_21 类说明:

*/

public class Address implements Serializable{

/**

*序列号

*/

private static final long serialVersionUID = 1L;

private String state;

private String province;

private String city;

/**

* 初始化

*/

public Address(String state, String province, String city) {

// TODO Auto-generated constructor stub

this.state = state;

this.province = province;

this.city = city;

}

@Override

public String toString() {

// TODO Auto-generated method stub

StringBuilder stringBuilder = new StringBuilder();

stringBuilder.append("国家:" + state + ",");

stringBuilder.append("省:" + province + ",");

stringBuilder.append("市:" + city);

return stringBuilder.toString();

}

//省略set()和get()函数

}

java使用其他项目的对象,Java对象的复制方法总结相关推荐

  1. java8如何兼容java7_尽管使用Java 8功能,项目如何支持Java 7

    这不是一个错误(正如我自己想的那样).该项目确实使用来自Java 8的类.它不使用Java 7进行编译,并且其Maven构建也不能与Java 7一起运行. 但是,由于Lambda中特定于Java 8的 ...

  2. java练手项目_20个Java练手项目,献给嗜学如狂的人

    给大家推荐一条由浅入深的JAVA学习路径,首先完成 Java基础.JDK.JDBC.正则表达式等基础实验,然后进阶到 J2SE 和 SSH 框架学习.最后再通过有趣的练手项目进行巩固. 7875643 ...

  3. 【Java练手项目七】Java项目实战之天天酷跑

    首先,写一个需求文档: 一.项目名称:<天天酷跑>(RunDay) 二.功能介绍: 闯关类游戏,玩家登录后,选择进入游戏,通过键盘控制玩家的上下左右移动,来躲避 障碍物和吃金币,玩家躲避的 ...

  4. Java面向对象小项目 慕课网Java入门第二季答答租车系统

    一.项目背景 编写一个控制台程序,要求实现如下功能: 1.展示所有可租车辆 2.选择车型,租车量 3.显示租车清单,包括:总载货量,总载客量,总金额等: 二.车的类别 客车:只能载客 货车:只能载货 ...

  5. java预研项目_缓存java框架技术预研3:JAVA缓存技术介绍

    几个著名Java开源缓存框架介绍(OSCache,JSC) OSCache是个一个广泛采用的高性能的缓存框架,OSCache能用于任何Java应用程序的普通的缓存解决方案. OSCache有以下特点: ...

  6. java人工智能开源项目_用Java开源项目JOONE实现人工智能编程

    很少有程序员不对这里或者那里所包含的人工智能编程所吸引,然而,许多对AI感兴趣的程序员很快就因其中包含的算法的复杂性而退却.在本文中,我们将讨论一个能大大简化这种复杂性的Java开源工程. Java面 ...

  7. java 连接redis 项目_eclipse写java程序实现连接redis数据库教程

    第一步,在windows下载安装配置好redis数据库.这里我就不再概述了.下载jedis-2.4.2.jar,当然最好是下载最新版本的jar包. 这个在百度搜索下就出来的.下载后,放在一个文件夹下面 ...

  8. 基于java的信访项目_基于JAVA的某省人大信访信息系统的设计与实现

    分 类 号 : TP 3 1 1 . 5 单 位 代码 : 1 01 8 3 研 究 生 学 号 : 2 0 1 35 3 H3 08 密 级 : 公 开 吉 林 大 学 硕 士 学 位 ...

  9. Java高并发项目案例,Java开发指南

    一.前言 最近刚读完一本书:<Netty.Zookeeper.Redis 并发实战>,个人觉得 Netty 部分是写得很不错的,读完之后又对 Netty 进行了一波很好的复习(之前用 sp ...

最新文章

  1. NeurIPS 2020论文接收列表公布,智源研究院35篇入围
  2. pytorch使用 torchvision 的 Transform 读取图片数据
  3. Fabric--链码的概念与使用
  4. 服务器控件 原生html,应用样式到HTML服务器控件
  5. 如何给容器服务的Docker增加数据盘
  6. lambda中sorted排序
  7. 开发辅助 | 阿里图标库iconfont入门使用
  8. 详介oracle的RBO/CBO优化器
  9. web窗体的内置对象
  10. Spring拓展接口之FactoryBean
  11. 云原生2.0时代:企业更应了解一下容器安全
  12. 自己做的PPT试题或其它文件模板有时被系统还原成原来默认的样子,如何解决?
  13. 图书管理系统详细设计说明
  14. 超级加粗大标题Mogrt免费PR动态图形模板
  15. c语言零基础自学软件下载,C语言入门学习下载-C语言入门学习app下载v1.0-52PK下载中心...
  16. 视音频数据处理入门:颜色空间(二)---ffmpeg
  17. IGBT的双脉冲测试实验
  18. 小程序报错 Invalid regular expression: invalid group specifier name
  19. 【ChatGPT】输出MySQL常用语法汇总
  20. 某私募基金投资公司面经+字节基础架构面经——11.18日

热门文章

  1. linux shell读取文件
  2. R语言数据结构之矩阵
  3. 复位 stm32_stm32学习笔记
  4. 数据结构----内存分配问题
  5. 大华测试笔试题_互联网校招非技术岗的这三类笔试题目你都清楚了吗?
  6. python 列表、字典转json字符串
  7. 四、双向链表的操作分析和代码实现
  8. 语义分割--Mix-and-Match Tuning for Self-Supervised Semantic Segmentation
  9. liunx tar安装mysql_在Linux下,安装Mysql(tar)
  10. MySQL 实战 定时备份数据库