java(30) - 对象浅克隆和深克隆
来源:互联网 发布:软件质量品质管理 编辑:程序博客网 时间:2024/04/29 23:09
一.浅克隆和深克隆的概念:
1).浅克隆:又称为浅复制,被复制的对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换而言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
2).深克隆:又称为深复制,被复制的对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换而言之,深复制就是把要复制的对象所引用的对象都复制了一遍。
二.浅克隆实现:
<pre class="java" name="code"><strong><span style="font-size:18px;">public class Main {public static void main(String[] args) throws Exception {Student student1 = new Student(); student1.setName("张三"); student1.setSex("男"); student1.setNumber(10); Student student2 = (Student)student1.clone();System.out.println(student2.getName() +" "+ student2.getNumber() +" "+ student2.getSex()); student1.setName("李四");System.out.println(student1.getName());System.out.println(student2.getName());System.out.println(student1 == student2);System.out.println(student1.getClass() == student2.getClass());}}class Student implements Cloneable{int number;String name;String sex;public int getNumber() {return number;}public void setNumber(int number) {this.number = number;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}@Overrideprotected Object clone() throws CloneNotSupportedException {Object obj = super.clone(); return obj;}}</span></strong>
打印:
张三 10 男
李四
张三
false
true
Object的clone方法就是浅克隆,clone()方法满足(1).对任何对象obj,都有obj.clone()!=obj,克隆的对象与原对象不是一个对象。
三.深克隆实现(这种方式较为麻烦,一般用序列化实现):
public class Main {public static void main(String[] args) throws Exception {Teacher teacher = new Teacher();teacher.setName("李四");teacher.setNumber(20);Student stu = new Student();stu.setName("张三");stu.setNumber(10);stu.setSex("男");stu.setTeacher(teacher);Student stu2 = (Student)stu.clone();System.out.println(stu2.getTeacher().getName());teacher.setName("王五");//如果是浅克隆则打印王五,因为teacher引用没变,变得时候teacher中的name属性System.out.println(stu2.getTeacher().getName());}}class Teacher implements Cloneable{int number;String name;public int getNumber() {return number;}public void setNumber(int number) {this.number = number;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}}class Student implements Cloneable{int number;String name;String sex; Teacher teacher; public Teacher getTeacher() {return teacher;}public void setTeacher(Teacher teacher) {this.teacher = teacher;}public int getNumber() {return number;}public void setNumber(int number) {this.number = number;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}@Overrideprotected Object clone() throws CloneNotSupportedException { Student student = (Student)super.clone();student.setTeacher((Teacher)student.getTeacher().clone());return student;}}
打印:
李四
李四
0 0
- java对象克隆(浅克隆和深克隆)
- java(30) - 对象浅克隆和深克隆
- Java(对象的深克隆和浅克隆)
- Java对象的浅克隆和深克隆
- Java对象的浅克隆和深克隆
- Java对象的浅克隆和深克隆
- Java中对象的深克隆和浅克隆
- Java中对象的深克隆和浅克隆介绍
- JAVA对象深克隆与浅克隆
- Java对象克隆方法(浅克隆、深克隆)
- Java对象克隆方法(浅克隆、深克隆)
- Java对象克隆——浅克隆和深克隆的区别
- Java对象克隆——浅克隆和深克隆的区别
- java深克隆和浅克隆
- java深克隆和浅克隆
- java 深克隆和浅克隆区别
- java中的深克隆和浅克隆
- Java的深克隆和浅克隆
- js算法
- tomcat部署web应用的几种方式
- Markdown使用
- STL-优先队列(priority queue)
- NSDictionary,NSArray转成NSData(JSON)NSString类型
- java(30) - 对象浅克隆和深克隆
- caffe下安装python库
- Go语言数据结构
- HDU-2674 N!Again 水题
- 计算机网络基础笔记4
- GCC Warning ISO C++11 Does not allow conversion from literal string to char*
- 编译内核2.3.4遇到的问题以及解决方案
- javascript弹出窗口实现动态文件上传
- 苹果所有常用证书,appID,Provisioning Profiles配置说明及制作图文教程(精)