java基础学习-克隆
来源:互联网 发布:网络女主播是什么 编辑:程序博客网 时间:2024/06/06 04:40
浅复制
被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
深复制
被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍(递归下去)。
Java中对象的克隆
Object的clone()方法
clone方法将对象复制了一份并返回给调用者。一般而言,clone()方法满足:
1)对任何的对象x,都有x.clone() !=x
克隆对象与原对象不是同一个对象
2)对任何的对象x,都有x.clone().getClass()= =x.getClass()
克隆对象与原对象的类型一样
3)如果对象x的equals()方法定义恰当,那么x.clone().equals(x)应该成立。
实现:
1)为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。
2)在派生类中覆盖基类的clone()方法,并声明为public(Object类中的clone()方法为protected的)
3)在派生类的clone()方法中,调用super.clone()
4)在派生类中实现Cloneable接口
2)在派生类中覆盖基类的clone()方法,并声明为public(Object类中的clone()方法为protected的)
3)在派生类的clone()方法中,调用super.clone()
4)在派生类中实现Cloneable接口
浅复制
public class Student implements Cloneable {private int age;private String name;private Book book;public int getAge() {return age;}public Book getBook() {return book;}public void setBook(Book book) {this.book = book;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic Object clone() throws CloneNotSupportedException {Object object = super.clone();return object;}}
public class Book {public String name;public String getName() {return name;}public void setName(String name) {this.name = name;}}
public class Test {public static void main(String[] args) throws CloneNotSupportedException {Student student1 = new Student();Book book = new Book();book.setName("english");student1.setName("zhangsan");student1.setAge(22);student1.setBook(book);Student student2 = (Student) student1.clone();System.out.println(student1.clone().equals(student1));// falseSystem.out.println(student1.clone() == student1);// falseSystem.out.println(student1.clone().getClass() == student2.getClass());// trueSystem.out.println(student2.getName());// zhangsanstudent1.setName("lisi");student1.getBook().setName("chinese");System.out.println(student2.getName());// zhangsanSystem.out.println(student2.getBook().getName());// chinese}}
深复制
方式一:利用clone方法
public class Fruit implements Cloneable {public String name;public Apple apple;public String getName() {return name;}public void setName(String name) {this.name = name;}public Apple getApple() {return apple;}public void setApple(Apple apple) {this.apple = apple;}@Overridepublic Object clone() throws CloneNotSupportedException {<strong>Fruit fruit1 = (Fruit) super.clone();fruit1.setApple((Apple) fruit1.getApple().clone());return fruit1;</strong>}}
public class Apple implements Cloneable {public String Name = "";public String getName() {return Name;}public void setName(String name) {Name = name;}@Overridepublic Object clone() throws CloneNotSupportedException {<strong>return super.clone();</strong>}}
public class Test {public static void main(String[] args) throws Exception {Fruit fruit1 = new Fruit();Apple apple = new Apple();fruit1.setName("apple");apple.setName("fusi");fruit1.setApple(apple);Fruit fruit2 = (Fruit) fruit1.clone();System.out.println(fruit1.clone().equals(fruit1));// falseSystem.out.println(fruit1.clone() == fruit1);// falseSystem.out.println(fruit1.clone().getClass() == fruit2.getClass());// trueSystem.out.println(fruit2.getName());// applefruit1.setName("banana");fruit1.getApple().setName("shandong");System.out.println(fruit2.getName());// appleSystem.out.println(fruit2.getApple().getName());// fusi}}
public class People implements Serializable {public String name;public Girl girl;public String getName() {return name;}public void setName(String name) {this.name = name;}public Girl getGirl() {return girl;}public void setGirl(Girl girl) {this.girl = girl;}public Object deepCopy() throws Exception{ByteArrayOutputStream bos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(bos);oos.writeObject(this);ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bis);return ois.readObject();}}
public class Girl implements Serializable {public String name;public String getName() {return name;}public void setName(String name) {this.name = name;}}
public class Test {public static void main(String[] args) throws Exception {People people1 = new People();Girl girl = new Girl();people1.setName("zhangsan");girl.setName("meimei");people1.setGirl(girl);People people2 = (People) people1.deepCopy();System.out.println(people1.deepCopy().equals(people1));// falseSystem.out.println(people1.deepCopy() == people1);// falseSystem.out.println(people1.deepCopy().getClass() == people2.getClass());// trueSystem.out.println(people2.getName());// zhangsanpeople1.setName("lisi");people1.getGirl().setName("lili");System.out.println(people2.getName());// zhangsanSystem.out.println(people2.getGirl().getName());// meimei}}
0 0
- java基础学习-克隆
- java基础-深度克隆和浅克隆
- Java基础-接口,内部类及对象克隆的学习
- JAVA 克隆学习总结
- java 克隆clone学习
- java编程基础之克隆
- Java 7之基础 - 浅克隆与深克隆
- java基础入门-对象的浅克隆与深克隆
- Java基础---bat 克隆 内存泄漏
- java克隆详述-Java基础-Java-编程开发
- java 克隆
- java克隆
- java克隆
- JAVA克隆
- java 克隆
- JAVA 克隆
- java 克隆
- Java 克隆
- Android 自定义菜单示例
- 第十一周项目一(2)
- linux下 WMB通过ODBC连接数据库
- ora.LISTENER.lsnr INTERMEDIATE 处理一例
- [Erlang危机](4.3)SSH守护进程
- java基础学习-克隆
- [软工视频]面向对象
- QT常见错误之GLU头文件没法使用
- uboot 分析之 启动流程
- thinkpadE440 U盘安装mac10.9.4 Gpt分区+Clover+UEFI引导成功记录
- 每天学习一点c++之四——运算符重载
- 单例模式-->学习笔记
- flush
- [C++]LeetCode: 12 Palindrome Number