Java 深浅拷贝
2016-07-02
1深拷贝:不仅拷贝对象,而且对象所引用地址的内容一块拷贝。改变一个对象的某个属性,并不影响另一个对象所引用的内容。
2浅拷贝:仅拷贝对象本身,并不对所引用(所指的)内容进行拷贝,当对一个对象做改变的时候,另一个对象的相应属性也做同样的改变。
3深拷贝要重写clone函数。implements Cloneable。
浅拷贝:
深拷贝
这个代码是借鉴的(记得是这样的,标注---借鉴资源)
class Professor0 implements Cloneable {
String name;
int age; Professor0(String name, int age) {
this.name = name;
this.age = age;
} public Object clone() throws CloneNotSupportedException {
return super.clone();//调用父类的
}
} class Student0 implements Cloneable {
String name;// 常量对象。
int age;
Professor0 p;// 学生1和学生2的引用值都是一样的。 Student0(String name, int age, Professor0 p) {
this.name = name;
this.age = age;
this.p = p;
} /* public Object clone() {
Student0 o = null;
try {
o = (Student0) super.clone();
} catch (CloneNotSupportedException e) {
System.out.println(e.toString());
} return o;
}*/
} public class qiancopy {
public static void main(String[] args) {
Professor0 p = new Professor0("perfesser0", 50);
Student0 s1 = new Student0("stu1", 18, p);
System.out.println("学生s1的姓名:" + s1.name + "\n学生s1教授的姓名:" + s1.p.name + "," + "\n学生s1教授的年纪" + s1.p.age+"......end");// 学生1的教授 Student0 s2 =s1;
s2.p.name = "s2copys";
s2.p.age = 30;
s2.name = "s2";
s2.age = 45;
System.out.println("学生s1的姓名:" + s1.name+ "\n学生s1的年龄:" + s1.age + "\n学生s1教授的姓名:" + s1.p.name + "," + "\n学生s1教授的年纪" + s1.p.age+"...end");
System.out.println("学生s2的姓名:" + s2.name+ "\n学生s2的年龄:" + s2.age + "\n学生s2教授的姓名:" + s2.p.name + "," + "\n学生s2教授的年纪" + s2.p.age+"...end");// 学生1的教授 }
}
class Professor implements Cloneable {
String name;
int age; Professor(String name, int age) {
this.name = name;
this.age = age;
} public Object clone() {
Object o = null;
try {
o = super.clone();
} catch (CloneNotSupportedException e) {
System.out.println(e.toString());
}
return o;
}
} class Student implements Cloneable {
String name;
int age;
Professor p; Student(String name, int age, Professor p) {
this.name = name;
this.age = age;
this.p = p;
} public Object clone() {
Student o = null;
try {
o = (Student) super.clone();//stu 深拷贝
} catch (CloneNotSupportedException e) {
System.out.println(e.toString());
}
o.p = (Professor) p.clone();//professer深拷贝
return o;
}
} public class shencopy {
public static void main(String args[]) { Professor p = new Professor("professer1", 50);
Student s1 = new Student("stu1", 18, p);
System.out.println("学生s1的姓名:" + s1.name+ "\n学生s1的年龄:" + s1.age + "\n学生s1教授的姓名:" + s1.p.name + "," + "\n学生s1教授的年纪" + s1.p.age+"......end");// 学生1的教授 Student s2 = (Student) s1.clone();
s2.name = "s2copys";
s2.age = 30;
s2.p.name = "stu2";
s2.p.age = 30;
System.out.println("学生s1的姓名:" + s1.name+ "\n学生s1的年龄:" + s1.age + "\n学生s1教授的姓名:" + s1.p.name + "," + "\n学生s1教授的年纪" + s1.p.age+"......end");// 学生1的教授
System.out.println("学生s2的姓名:" + s2.name+ "\n学生s2的年龄:" + s2.age + "\n学生s2教授的姓名:" + s2.p.name + "," + "\n学生s2教授的年纪" + s2.p.age+"......end");// 学生2的教授 }
}
Java 深浅拷贝的更多相关文章
- java提高(15)---java深浅拷贝
#java深浅拷贝 一.前言 为什么会有深浅拷贝这个概念? 我觉得主要跟JVM内存分配有关,对于基本数据类型,只存在栈内存,所以它的拷贝不存在深浅拷贝这个概念.而对于对象而言,一个对象的创建会在内存中 ...
- java深浅拷贝
转载:http://atjava.iteye.com/blog/1722501 首先我们看看浅拷贝和深拷贝的定义 浅拷贝:只复制一个对象,对象内部存在的指向其他对象数组或者引用则不复制 深拷贝:对象, ...
- 一文搞懂Java引用拷贝、浅拷贝、深拷贝
微信搜一搜 「bigsai」 专注于Java和数据结构与算法的铁铁 文章收录在github/bigsai-algorithm 在开发.刷题.面试中,我们可能会遇到将一个对象的属性赋值到另一个对象的情况 ...
- 一文搞懂Java引用拷贝、深拷贝、浅拷贝
刷题.面试中,我们可能会遇到将一个对象的属性赋值到另一个对象的情况,这种情况就叫做拷贝.拷贝与Java内存结构息息相关,搞懂Java深浅拷贝是很必要的! 在对象的拷贝中,很多初学者可能搞不清到底是拷贝 ...
- java Clone之深浅拷贝
要点: 1.浅度拷贝可以不实现Cloneable接口(自动使用Object.clone)或者不重写Cloneable的clone方法. 2.要被深度拷贝的类必须实现Cloneable接口并重写clon ...
- 关于Java中的HashMap的深浅拷贝的测试与几点思考
0.前言 工作忙起来后,许久不看算法,竟然DFA敏感词算法都要看好一阵才能理解...真是和三阶魔方还原手法一样,田园将芜,非常可惜啊. 在DFA算法中,第一步是需要理解它的数据结构,在此基础上,涉及到 ...
- 关于Java的Object.clone()方法与对象的深浅拷贝
文章同步更新在个人博客:关于Java的Object.clone()方法与对象的深浅拷贝 引言 在某些场景中,我们需要获取到一个对象的拷贝用于某些处理.这时候就可以用到Java中的Object.clon ...
- 什么是java的深浅拷贝?
什么是java的深浅拷贝? 浅拷贝 就是很肤浅的拷贝,只拷贝了别人的地址.没有拷贝地址里面的值.地址里面的值改变后,就都改变了. 深拷贝 就是很深入的拷贝,深入到核心的拷贝,拷贝了别人地址里面的值,别 ...
- 学习--->更新集合/内存/深浅拷贝
一.计算机基础 1..软件(应用程序) 2.解释器/编译器 - 解释型语言:将代码每一行传递给计算机一行,常用编程语言python,PHP,Ruby. - 编译型语言:将代码完全执行完后会形成一个文 ...
随机推荐
- FiddlerCoreAPI 使用简介
原文:https://blog.csdn.net/zhang116868/article/details/49406599 大名鼎鼎的Fiddler大家都知道,或者用过,Fiddler 开放了他的Fi ...
- CentOS 6.6下安装配置Tomcat环境
本文转载至:http://www.linuxidc.com/Linux/2015-08/122234.htm 实验系统:CentOS 6.6_x86_64 实验前提:防火墙和selinux都关闭 实验 ...
- pandas的to_csv函数
分隔符 sep : Field delimiter for the output file (default ”,”) dt.to_csv('C:/Users/think/Desktop/Result ...
- ExtJS自定义事件
1.开发ExtJS组件UI的时候,基本上对于一些操作,就是与后台交互之类的多数都是用户进行点击触发一个事件,在事件的处理器handler里面调具体的业务方法,完成业务数据的处理以及业务流程的流转机制, ...
- blktrace未公开选项网络保存截取数据
本文链接地址: blktrace未公开选项网络保存截取数据 我们透过blktrace来观察io行为的时候,第一件事情需要选择目标设备,以便分析该设备的io行为.具体使用可以参考我之前写的几篇:这里 这 ...
- 为solr增加用户验证
添加此功能主要是为了增加solr服务器的安全性,不能随便让人访问. 1. 在tomcat的F:\Tomcat 6.0.26_solr\conf\tomcat-users.xml添加用户角色并 ...
- zabbix监控windows系统CPU使用率
参考网站:https://blog.csdn.net/reblue520/article/details/76287113 Zabbix 自带的模块没有 CPU 使用率(百分比)这个监控项,我们可以通 ...
- nginx直接返回json
尝试配置nginx.conf之后,访问直接变成下载文件... 查阅之后,发现需要配置返回内容的格式. location ~ ^/get_json { default_type application/ ...
- 使用JsonViewer来格式化json字符串
1. 在线转换 https://www.bejson.com/jsonviewernew/ ==>格式化 2. 使用notepad ++ 的jsonViewer插件 下载地址 http://ww ...
- Activity服务类-4 HistoryService服务类
一共个方法15个方法 用于查询历史工作流信息1.创建查询(7个方法)//创建一个新的编程查询来搜索{@link HistoricProcessInstance}.HistoricProcessInst ...