浅拷贝:

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

深拷贝 & 浅拷贝的更多相关文章

  1. c# 内存的具体表现- 通用类型系统 深拷贝 浅拷贝 函数传参

    c# 通用类型系统 及变量在 深拷贝 浅拷贝 函数传参 中的深层次的表现 在编程中遇到了一些想不到的异常,跟踪发现,自己对于c#变量在内存上的表现理解有偏差,系统的学习并通过代码实验梳理了各种情况下, ...

  2. python集合增删改查,深拷贝浅拷贝

    集合 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. 关系 ...

  3. JavaScript之深拷贝&浅拷贝

    深拷贝&浅拷贝,说起来都明白,但是说不出所以然.今天就系统的整理下思绪,一点点的将其分析出所以然 废话不多说 浅拷贝 简单的说就是一个值引用,学生时代接触过编程的人都应该了解过指针,浅拷贝可以 ...

  4. 【opencv】imread 赋值 深拷贝浅拷贝

    import cv2 import copy import os def filter_srcimg(dstimg): ss=3 srcimg=copy.deepcopy(dstimg) #aa=5 ...

  5. Java基础 深拷贝浅拷贝

    Java基础 深拷贝浅拷贝 非基本数据类型 需要new新空间 class Student implements Cloneable{ private int id; private String na ...

  6. 【04】Python 深拷贝浅拷贝 函数 递归 集合

    1 深拷贝浅拷贝 1.1 a==b与a is b的区别 a == b    比较两个对象的内容是否相等(可以是不同内存空间) a is b  比较a与b是否指向同一个内存地址,也就是a与b的id是否相 ...

  7. JS Object Deep Copy & 深拷贝 & 浅拷贝

    JS Object Deep Copy & 深拷贝 & 浅拷贝 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Refe ...

  8. Map拷贝 关于对象深拷贝 浅拷贝的问题

    问题:map拷贝时发现数据会变化. 高能预警,你看到的下面的栗子是不正确的,后面有正确的一种办法,如果需要看的话的,请看到底,感谢各同学的提醒,已做更正,一定要看到最后      先看例子:     ...

  9. clone 深拷贝 浅拷贝

    1. 定义:知道一个对象,但不知道类,想要得到该对象相同的一个副本,在修改该对象的属性时,副本属性不修改,clone的是对象的属性 2. 意义:当一个对象里很多属性,想要得到一个相同的对象,还有set ...

  10. Python深复制浅复制or深拷贝浅拷贝

    1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象.(比深拷贝更加节省内存)2. copy.deepcopy 深拷贝 拷贝对象及其子对象 用一个简单的例子说明如下: >& ...

随机推荐

  1. 51 Nod 1354 选数字(体现动态规划的本质)

    1354 选数字  基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  关注 当给定一个序列a[0],a[1],a[2],...,a[n-1] 和一个整数K时 ...

  2. Centos 7 搭建蓝鲸V4.1.16稳定社区版

    在本地用VMware模拟了三台主机 准备至少3台 CentOS 7 以上操作系统的机器,保证三台虚拟机都可以上网 最低配置:2核4G(我用的是这个) 建议配置: 4核12G 以上 192.168.16 ...

  3. deepin Linux 安装+工作学习配置

    一 安装 在官网下载 U盘安装,神舟优雅x4开机按F7,选择U盘启动. U盘安装器在下载的镜像文件中. 二 配置 升级最新系统 设置root用户密码: dawn@dawn-PC:~$ sudo pas ...

  4. Flask-特殊的装饰器

    视图函数中的装饰器 -----------------------视图中的装饰器---------------------- 1.如果使用的是函数视图,那么自己定义的装饰器必须放在`app.route ...

  5. css3_1

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 微信一键登录(微信OAuth2.0)

    1.注册微信开放平台https://open.weixin.qq.com,一定要清楚微信开放平台和微信公众平台是分别独立的,不能共用. 2.登录进入——管理中心,网站应用,创建网站应用.填写申请,企业 ...

  7. 埃利斯(A.Ellis)ABCDE情绪管理理论

    埃利斯(A.Ellis)ABCDE情绪管理理论A :Activating Events(诱发事件)B :Beliefs(个体对诱发事件的评价.解释.看法)C :Consequences(个体情绪和行为 ...

  8. Grafana添加Zabbix为数据源(一)

    最前面,此博文引自:http://docs.grafana-zabbix.org/installation/configuration-sql/ 使用zabbix来收集书籍,用grafana来显示数据 ...

  9. js 生成树以及关键字搜索生成树

    function main(keywords,data){ function fn(arr){ var flag = false; for(var i = 0;i <arr.length;i++ ...

  10. R语言与概率统计(六) 主成分分析 因子分析

    超高维度分析,N*P的矩阵,N为样本个数,P为指标,N<<P PCA:抓住对y对重要的影响因素 主要有三种:PCA,因子分析,回归方程+惩罚函数(如LASSO) 为了降维,用更少的变量解决 ...