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. - 编译型语言:将代码完全执行完后会形成一个文 ...
随机推荐
- 同一个IP段ping不通同事的电脑
原因居然是同事的防火墙打开了. windows关闭防火墙的教程,请自行百度.
- Dubbo各种协议
协议参考手册 (+) (#) 推荐使用Dubbo协议 性能测试报告各协议的性能情况,请参见:性能测试报告 (+) dubbo:// (+) (#) Dubbo缺省协议采用单一长连接和NIO异步通讯,适 ...
- xgboost的遗传算法调参
遗传算法适应度的选择: 机器学习的适应度可以是任何性能指标 —准确度,精确度,召回率,F1分数等等.根据适应度值,我们选择表现最佳的父母(“适者生存”),作为幸存的种群. 交配: 存活下来的群体中的父 ...
- javascript继承之原型式继承(四)
javascript之父道格拉斯在2006年给出了这样一串代码,来实现继承. function object(o) { function F() { } F.prototype = o; return ...
- ZooKeeper系列(3)命令操作 (转)
原文地址:http://www.cnblogs.com/wuxl360/p/5817524.html 一.Zookeeper的四字命令 Zookeeper支持某些特定的四字命令字母与其的交互.他们大多 ...
- html 更新
HTML介绍 Web服务本质 import socket sk = socket.socket() sk.bind(("127.0.0.1", 8080)) sk.listen(5 ...
- 在CentOS7.4中安装jdk的几种方法及配置环境变量
在CentOS7.4中安装jdk的几种方法及配置环境变量 一.下载jdk jdk下载地址:http://www.oracle.com/technetwork/java/javase/downloads ...
- Executor框架(二)Executor 与 ExecutorService两个基本接口
一.Executor 接口简介 Executor接口是Executor框架的一个最基本的接口,Executor框架的大部分类都直接或间接地实现了此接口. 只有一个方法 void execute(Run ...
- corejava-内容梳理
- jdk1,8 HashMap
Java源码分析:HashMap 1.8 相对于1.7 到底更新了什么? 上面网站总结很详细 源码除了具体操作其余全罗列.这里就不总结了