java 深复制浅复制 api解读
来源:互联网 发布:现在淘宝开店要交钱吗 编辑:程序博客网 时间:2024/05/16 11:18
今天看了下java下面的深浅复制问题,借鉴了网上资料自己整理一下。
Object中含有clone()方法,文章就在clone了里面了。
查看api,里面有此段描述:
按照惯例,clone()返回的对象应该独立于正被复制的对象。要获得此独立性,在super.clone 返回对象之前,有必要对该对象的一个或多个字段进行修改。这通常意味着要复制包含正在被复制对象的内部“深层结构”的所有可变对象(即对象中的对象),并使用对副本的引用替换对这些对象的引用。如果一个类只包含基本字段或对不变对象的引用,那么通常不需要重载clone()。
下面的代码注释完整,能够自我解释。
运行结果:
Object中含有clone()方法,文章就在clone了里面了。
查看api,里面有此段描述:
按照惯例,clone()返回的对象应该独立于正被复制的对象。要获得此独立性,在super.clone 返回对象之前,有必要对该对象的一个或多个字段进行修改。这通常意味着要复制包含正在被复制对象的内部“深层结构”的所有可变对象(即对象中的对象),并使用对副本的引用替换对这些对象的引用。如果一个类只包含基本字段或对不变对象的引用,那么通常不需要重载clone()。
下面的代码注释完整,能够自我解释。
//Cloneable必须实现class StudentInfo implements Cloneable{ public long id; public StudentInfo(long id) { this.id = id; } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } }
class Student{ public String name; public int age; public StudentInfo si; Student(String name, int age, StudentInfo si) { this.name = name; this.age = age; this.si = si; } @Override protected Object clone() throws CloneNotSupportedException { System.out.println("override clone"); StudentInfo studentInfo = (StudentInfo) this.si.clone(); return new Student(name, age, studentInfo); }}
class TestClone { public static void main(String[] args) throws CloneNotSupportedException { System.out.println("----------------基本类型的复制-----------"); // 基本类型,没有深浅复制,而且不能像c看到基本类型的地址 int a1 = 1; int a2 = a1; a2 = 2; System.out.println(a1); System.out.println(a2); System.out.println("----------------对象的复制 1-----------"); // 对象深浅复制 // case 1: 当对象内部的变量都是基本类型 StudentInfo s1 = new StudentInfo(18); StudentInfo s2 = (StudentInfo) s1.clone(); StudentInfo s3 = s1; // 查看s[1...3]地址 System.out.println(s1); System.out.println(s2); System.out.println(s3); // 修改学生信息2后,不影响 s2.id = 20; System.out.println("id=" + s1.id ); System.out.println("id=" + s2.id ); // 修改学生信息3后,影响 s3.id = 22; System.out.println("id=" + s1.id); System.out.println("id=" + s3.id); System.out.println("----------------对象的复制 2-----------"); // case 2: 对象内容变量含有对象 StudentInfo si = new StudentInfo(18); Student ss1 = new Student("张三", 18, si); // 进行深复制,需要重载clone方法 Student ss2 = (Student) ss1.clone(); Student ss3 = ss1; System.out.println(ss1); System.out.println(ss2); System.out.println(ss3); System.out.println(si + " " + ss2.si); System.out.println(si!=ss2.si ? "深复制成功": "深复制失败"); }}
运行结果:
- java 深复制浅复制 api解读
- Java 深复制,浅复制
- JAVA深复制浅复制
- java对象的复制,浅复制、深复制
- JAVA学习总结之简单复制、浅复制、深复制
- Java对象克隆(复制):深复制和浅复制
- JAVA中浅复制与深复制
- JAVA中浅复制与深复制
- JAVA中浅复制与深复制
- JAVA中浅复制与深复制
- java中的浅复制与深复制
- JAVA中浅复制与深复制
- JAVA中浅复制与深复制
- JAVA中浅复制与深复制
- JAVA中浅复制与深复制
- JAVA中浅复制与深复制
- JAVA中浅复制与深复制
- JAVA中浅复制与深复制
- Eclipse中给jar包导入JavaDoc的方法
- Entity Framework1.0系列文章
- 在WinCE5.0和WinCE6.0下,编译选项介绍
- 视频播放时无法屏幕截图怎么办?
- 百度 一面 心得
- java 深复制浅复制 api解读
- 111
- 深入分析 Java 中的中文编码问题
- RAC Failover三种方式
- 软件产品设计困难
- 声学的一些概念
- C++ 关于静态成员函数和常成员函数
- 快速设置Button OnClick方法,利用xml配置文件
- 图学PowerBuilder----怪异的编辑器