深拷贝 & 浅拷贝
浅拷贝:
class Professor {
String name;
int age;
public Professor(String name, int age) {
this.name = name;
this.age = age;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
class Student implements Cloneable {
String name;
int age;
Professor p;
public Student(String name, int age, Professor p) {
this.name = name;
this.age = age;
this.p = p;
}
@Override
protected Object clone() throws CloneNotSupportedException {
Student s = (Student) super.clone();
// s.p = (Professor) p.clone();
return s;
}
}
public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
Professor p = new Professor("教授1", 50);
Student s1 = new Student("学生1", 18, p);
Student s2 = (Student) s1.clone();
s2.p.name = "教授2";
s2.p.age = 30;
s2.name = "学生2";
s2.age = 25;
System.out.println(s1.name + " " + s1.age + " " + s1.p.name + " " + s1.p.age);
}
}
结果: 学生1 18 教授2 30
深拷贝:
class Professor implements Cloneable {
String name;
int age;
public Professor(String name, int age) {
this.name = name;
this.age = age;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
class Student implements Cloneable {
String name;
int age;
Professor p;
public Student(String name, int age, Professor p) {
this.name = name;
this.age = age;
this.p = p;
}
@Override
protected Object clone() throws CloneNotSupportedException {
Student s = (Student) super.clone();
s.p = (Professor) p.clone();
return s;
}
}
public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
Professor p = new Professor("教授1", 50);
Student s1 = new Student("学生1", 18, p);
Student s2 = (Student) s1.clone();
s2.p.name = "教授2";
s2.p.age = 30;
s2.name = "学生2";
s2.age = 25;
System.out.println(s1.name + " " + s1.age + " " + s1.p.name + " " + s1.p.age);
}
}
结果: 学生1 18 教授1 50
序列化形式深拷贝:
class Professor implements Serializable {
private static final long serialVersionUID = 1286716519490813020L;
String name;
int age;
public Professor(String name, int age) {
this.name = name;
this.age = age;
}
}
class Student implements Serializable {
private static final long serialVersionUID = -547004870369127943L;
String name;
int age;
Professor p;
public Student(String name, int age, Professor p) {
this.name = name;
this.age = age;
this.p = p;
}
public Object deepClone() throws IOException, ClassNotFoundException {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(this);
ObjectInputStream objectInputStream = new ObjectInputStream(new ByteArrayInputStream(byteArrayOutputStream.toByteArray()));
return objectInputStream.readObject();
}
}
public class Main {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Professor p = new Professor("教授1", 50);
Student s1 = new Student("学生1", 18, p);
Student s2 = (Student) s1.deepClone();
s2.p.name = "教授2";
s2.p.age = 30;
s2.name = "学生2";
s2.age = 25;
System.out.println(s1.name + " " + s1.age + " " + s1.p.name + " " + s1.p.age);
}
}
结果: 学生1 18 教授1 50
深拷贝 & 浅拷贝的更多相关文章
- c# 内存的具体表现- 通用类型系统 深拷贝 浅拷贝 函数传参
c# 通用类型系统 及变量在 深拷贝 浅拷贝 函数传参 中的深层次的表现 在编程中遇到了一些想不到的异常,跟踪发现,自己对于c#变量在内存上的表现理解有偏差,系统的学习并通过代码实验梳理了各种情况下, ...
- python集合增删改查,深拷贝浅拷贝
集合 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. 关系 ...
- JavaScript之深拷贝&浅拷贝
深拷贝&浅拷贝,说起来都明白,但是说不出所以然.今天就系统的整理下思绪,一点点的将其分析出所以然 废话不多说 浅拷贝 简单的说就是一个值引用,学生时代接触过编程的人都应该了解过指针,浅拷贝可以 ...
- 【opencv】imread 赋值 深拷贝浅拷贝
import cv2 import copy import os def filter_srcimg(dstimg): ss=3 srcimg=copy.deepcopy(dstimg) #aa=5 ...
- Java基础 深拷贝浅拷贝
Java基础 深拷贝浅拷贝 非基本数据类型 需要new新空间 class Student implements Cloneable{ private int id; private String na ...
- 【04】Python 深拷贝浅拷贝 函数 递归 集合
1 深拷贝浅拷贝 1.1 a==b与a is b的区别 a == b 比较两个对象的内容是否相等(可以是不同内存空间) a is b 比较a与b是否指向同一个内存地址,也就是a与b的id是否相 ...
- JS Object Deep Copy & 深拷贝 & 浅拷贝
JS Object Deep Copy & 深拷贝 & 浅拷贝 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Refe ...
- Map拷贝 关于对象深拷贝 浅拷贝的问题
问题:map拷贝时发现数据会变化. 高能预警,你看到的下面的栗子是不正确的,后面有正确的一种办法,如果需要看的话的,请看到底,感谢各同学的提醒,已做更正,一定要看到最后 先看例子: ...
- clone 深拷贝 浅拷贝
1. 定义:知道一个对象,但不知道类,想要得到该对象相同的一个副本,在修改该对象的属性时,副本属性不修改,clone的是对象的属性 2. 意义:当一个对象里很多属性,想要得到一个相同的对象,还有set ...
- Python深复制浅复制or深拷贝浅拷贝
1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象.(比深拷贝更加节省内存)2. copy.deepcopy 深拷贝 拷贝对象及其子对象 用一个简单的例子说明如下: >& ...
随机推荐
- 阿里云Ubuntu安装Composer和中国镜像
引用: Composer是PHP用来管理依赖(dependency)关系的工具.你可以在自己的项目中声明所依赖的外部工具库(libraries),Composer 会帮你安装这些依赖的库文件. PHP ...
- Selenium定位class包含空格的元素-复合class节点
在HTML中, 节点有三种常见属性, 分别是id, name和class, 其中class是一个特殊的属性, 支持多个类名, 以空格隔开, 如下图所示: 你是否注意到, 为什么selenium中的fi ...
- nvm临时版本和永久版本
nvm use 8.15.1//临时版本 nvm alias default 8.15.1//永久版本
- Explain详解
explain语句用于查看某个查询语句具体使用了什么执行计划 执行输出各列详解 table 每条记录对应一个表的查询,如果是两表连接查询,就会有两条记录,table对应查询表名 id 查询语句可能是单 ...
- HDU2795线段树入门 简单查询和修改
http://acm.hdu.edu.cn/showproblem.php?pid=2795 #include<iostream> using namespace std; ; int h ...
- Configuring Windows for Certificate Logon
Setting up a Windows Domain ( on AD) Installing Domain Controller Roles,During installing Active Dir ...
- SpringCloud(六)之 网关概念、Zuul项目搭建-(利用Zuul 实现鉴权和限流实战)
一.网关概念 1.什么是路由网关 网关是系统的唯一对外的入口,介于客户端和服务器端之间的中间层,处理非业务功能 提供路由请求.鉴权.监控.缓存.限流等功能.它将"1对N"问题转换成 ...
- Nginx设置成服务并开机自动启动
在/etc/init.d下创建文件nginx [root@localhost ~]# vim /etc/init.d/nginx 其内容参考nginx官方文档 需要注意的配置: nginx=”/usr ...
- Java之加密算法
加密算法主要分为对称加密.非对称加密.Hash加密. 一.何为对称加密? 对称加密是指对称密码编码技术,它的特点是文件加密和解密使用相同的密钥加密. 对称机密的密钥一般小于256bit.因为就密钥而言 ...
- Oracle 对某张表中的某一列进行取余,将结果集分为多个集合
比如分为 5个集合,那么就用某一列和5 取余 ,分别可以取 余数为 0.1.2.3.4 的结果集,那么就把集合分为5个小的集合了 1.取余数为 0 的集合 select * from (select ...