浅谈Java中实现深拷贝的两种方式—clone() & Serialized
作者:刘知安 发布时间:2022-04-05 18:36:15
标签:java,clone,深拷贝,Serialized
clone() 方法麻烦一些,需要将所有涉及到的类实现声明式接口 Cloneable,并覆盖Object类中的clone()方法,并设置作用域为public(这是为了其他类可以使用到该clone方法)。
序列化的方法简单,需要将所有涉及到的类实现接口Serializable
package b1ch06.clone;
import java.io.Serializable;
class Car implements Cloneable, Serializable {
private String band;
public Car(String band) {
this.band = band;
}
public String getBand() {
return band;
}
public void setBand(String band) {
this.band = band;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
package b1ch06.clone;
import java.io.Serializable;
class Employee implements Cloneable, Serializable {
private String name;
private Car car;
public Employee(String name, Car car) {
this.name = name;
this.car = car;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Car getcar() {
return car;
}
public void setcar(Car car) {
this.car = car;
}
protected void test() {
System.out.println("test func");
}
@Override
public Object clone() throws CloneNotSupportedException {
Employee employee_cloned = (Employee) super.clone();
Car car_cloned = (Car) this.car.clone();
employee_cloned.setcar(car_cloned);
return employee_cloned;
}
}
package b1ch06.clone;
import java.io.*;
public class SerializedClone {
@SuppressWarnings("unchecked")
public static <T extends Serializable> T clone(T obj) {
T cloneObj = null;
try {
//写入字节流
ByteArrayOutputStream out = new ByteArrayOutputStream();
ObjectOutputStream obs = new ObjectOutputStream(out);
obs.writeObject(obj);
obs.close();
//分配内存,写入原始对象,生成新对象
ByteArrayInputStream ios = new ByteArrayInputStream(out.toByteArray());
ObjectInputStream ois = new ObjectInputStream(ios);
//返回生成的新对象
cloneObj = (T) ois.readObject();
ois.close();
} catch (Exception e) {
e.printStackTrace();
}
return cloneObj;
}
}
package b1ch06.clone;
public class MyClone {
public static void main(String[] args) {
Car car = new Car("BMW");
Employee employee = new Employee("ANDY", car);
// 方法一:覆盖所有涉及到的类的clone()方法
try {
Employee employee_cp = (Employee) employee.clone();
System.out.println("=========================");
System.out.println("original对象地址?:");
System.out.println(employee.toString());
System.out.println("copy对象地址?:");
System.out.println(employee_cp.toString());
System.out.println("前后两个对象指向同一地址?:");
System.out.println(employee_cp == employee);
System.out.println("=========================");
System.out.println("original对象中car对象地址?:");
System.out.println(employee.getcar().toString());
System.out.println("copy对象中car对象地址?:");
System.out.println(employee_cp.getcar().toString());
System.out.println("前后两个car对象指向同一地址?:");
System.out.println(employee_cp == employee);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
// 方法二:序列化实现深拷贝
Employee cloned_employee = SerializedClone.clone(employee);
System.out.println("=========================");
System.out.println("original对象地址?:");
System.out.println(employee.toString());
System.out.println("copy对象地址?:");
System.out.println(cloned_employee.toString());
System.out.println("前后两个对象指向同一地址?:");
System.out.println(cloned_employee == employee);
System.out.println("=========================");
System.out.println("original对象中car对象地址?:");
System.out.println(employee.getcar().toString());
System.out.println("copy对象中car对象地址?:");
System.out.println(cloned_employee.getcar().toString());
System.out.println("前后两个car对象指向同一地址?:");
System.out.println(cloned_employee == employee);
}
}
以上所述是小编给大家介绍的Java中实现深拷贝的两种方式--——clone() & Serialized详解整合网站的支持!
来源:https://blog.csdn.net/qq_37174526/article/details/86484517
0
投稿
猜你喜欢
- 定义里氏替换原则(Liskov Substitution Principle,LSP),官方定义如下: 如果对每一个类型为S的对象o1,都有
- 一、什么是并查集对于一种数据结构,肯定是有自己的应用场景和特性,那么并查集是处理什么问题的呢?并查集是一种树型的数据结构,用于处理一些不相交
- 对于单链表不熟悉的可以看一下基于Java实现单链表的增删改查一、原地反转1、新建一个哨兵节点下一结点指向头结点2、把待反转链表的下一节点插入
- 0 问题描述一个应用在运行一段时间后,随着访问量不断增加,突然处理能力下降。但是从流量,jstack,gc上看基本正常。感觉好像突然从 “健
- 本文主要带大家看看Object类中一些常用方法的API文档的介绍和JDK中的源码。1.equals方法1.API中equals方法的介绍2.
- 面向对象编程(Object Oriented Programming)有三大特性:封装、继承、多态。在这里,和大家一起加深对三者的理解。封装
- 1、实现效果:项目的整体的日志打印级别为ERROR,但在某个包下或某个类想打印INFO级别的日志。2、配置:FILE是ERROR级别日志打印
- 本文实例总结了java判断字符串是否为数字的方法。分享给大家供大家参考,具体如下:方法一:用JAVA自带的函数public static b
- 前言当用户向服务器发送了一次HTTP请求,该请求可能会经过多个信息资源处理以后才返回给用户,各个信息资源使用请求转发机制相互转发请求,但是用
- 线程池主要解决两个问题:一是当执行大量异步任务时线程池能够提供较好的性能。在不使用线程池时,每当需要执行异步任务时直接new一个线程来运行,
- Spring Data Jpa复杂查询总结只是做一个总结所以就不多说废话了实体类@Entity@Table(name = "t_h
- 简介springmvc对json的前后台传输做了很好封装,避免了重复编码的过程,下面来看看常用的@ResponseBody和@Request
- 【前言】面向资源的 Restful 风格的 api 接口本着简洁,资源,便于扩展,便于理解等等各项优势,在如今的系统服务中越来越受欢迎。.n
- Java是一门面向对象的语言,即一切皆是对象!那么为何数据类型中还分为:基本类型和对象?Java中有8种基本数据类型boolean、byte
- 一、@Configuration注解1、基本使用自定义配置类/** * 1、@Configuration 告诉SpringBoot这是一个配
- 如何将Object类型转换为int类型Object object = null;try{ Integer.pars
- 一个简单的红包生成算法,代码如下:/** * 红包 * @param n * @param money 单位:分 * @return **/
- 一、spring-boot-devtools在pom中直接引入依赖<dependency> <groupId&
- Java基础面试题及答案集锦(基础题122道,代码题19道),具体详情如下所示:1、面向对象的特征有哪些方面1.抽象:抽象就是忽略一个主题中
- Java是一门天然的面向对象的语言。而所有我们手动创造出来的类,都继承于同一个类,即Object类。可以看一下Object类的结构nativ