今天看了下java下面的深浅复制问题,借鉴了网上资料自己整理一下。
Object中含有clone()方法,文章就在clone了里面了。
@Override
protected Object clone() throws CloneNotSupportedException {
return super.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深复制浅复制的实现附源代码,并实现java类之间的多对多联系。
java的深复制与浅复制,讲述了深复制和浅复制的区别
Java深复制与浅复制
android 浅复制和深复制-Java Generic Deep Copy 篇
Java关于深拷贝(深复制)和浅拷贝(浅复制)比较通俗易懂的简单说明及示例代码...
NULL 博文链接:https://bijian1013.iteye.com/blog/2358367
java 深克隆浅克隆···············
JAVA api JAVA api 汉化版JAVA api JAVA api 汉化版JAVA api JAVA api 汉化版JAVA api JAVA api 汉化版JAVA api JAVA api 汉化版JAVA api JAVA api 汉化版JAVA api JAVA api 汉化版
主要介绍了Java中的深拷贝(深复制)和浅拷贝(浅复制)介绍,需要的朋友可以参考下
1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
JavaAPI文档中文版,JavaAPI文档中文版,JavaAPI文档中文版,JavaAPI文档中文版,JavaAPI文档中文版,JavaAPI文档中文版,JavaAPI文档中文版,JavaAPI文档中文版,JavaAPI文档中文版,JavaAPI文档中文版,JavaAPI...
本文档是 Java 2 Platform Standard Edition 6.0 的 API 规范。 请参见: 描述 Java 2 Platform 软件包 java.applet 提供创建 applet 所必需的类和 applet 用来与其 applet 上下文通信的类。 java.awt 包含...
附件是使用java调用jenkins api的demo,希望对您有所帮助
java json api,json api
Java中对象的深复制和浅复制详解.doc
JAVAapi-JAVA中文API,JAVAapi-JAVA中文API,JAVAapi-JAVA中文API。
NULL 博文链接:https://zzqrj.iteye.com/blog/572562
Java API整合ES实现深分页,高亮等操作
Sun官方发布:Java API_5.0(每一个学java的人都应该看的) 真正中文版, 实践证明打好基础是最重要的。
java api 网页版 java api 网页版 java api 网页版 java api 网页版