Java Deep Clone C++里面有拷贝构造函数可以做深拷贝(deep clone),Java中是怎么做的?还有Memberwise copy, bitwise copy,Shallow copy, deep copy他们之间的关系是怎么样的? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 说一下我知道的:浅度拷贝和深度拷贝 浅度拷贝就是要拷贝当前对象的内容,自己是另外的地址,而该对象中的引用类型成员也是把地址给克隆对象了。 深度拷贝不仅复制当前对象的内容到不同的地址,并且也复制该对象内中所有引用类型的内容到不同地址。public class Book2 implements Cloneable{ String bookName; double price; Person2 author; public Book2(String bn,double price,Person2 author){ bookName = bn; this.price = price; this.author = author; } public Object clone(){ Book2 b = null; try{ b = (Book2)super.clone(); }catch(CloneNotSupportedException e){ e.printStackTrace(); } //这一行代码成就了深度拷贝 b.author = (Person2)author.clone(); return b; } public void display(){ System.out.print(bookName + "\t" + price + "\t") ; author.display(); }}//浅度拷贝public class TestLowCopy { public static void main(String[] args) { Book b1=new Book("Java编程",30.50,new Person1("张三",34)); Book b2=(Book) b1.clone(); b2.price=44.0; b2.author.setAge(45); b2.author.setName("李四"); b2.bookName="Java 开发"; b1.display(); b2.display(); /* * Person1传递的是值(引用的地址),所以Person1对象是同一个 * */ }}//深度拷贝public class TestDeepCopy { public static void main(String[] args) { Book2 b1 = new Book2("Java编程",30.50,new Person2("张三",34)); Book2 b2 = (Book2)b1.clone(); b2.price = 44.0; b2.author.setAge(45); b2.author.setName("李四"); b2.bookName = "Java开发"; b1.display(); b2.display(); }} public class Person2 implements Cloneable{ private String name; private int age; public Person2(String name,int age){ this.name = name; this.age = age; } public void setAge(int age){ this.age = age; } public void setName(String name){ this.name = name; } public void display(){ System.out.println("Name:" + name + "\tAge:" + age); } public Object clone(){ Person2 p = null; try{ p = (Person2)super.clone(); }catch(CloneNotSupportedException e){ e.printStackTrace(); } return p; }} 参考:1. Java中任意复杂度的深Clone2. Shallow Copy,Deep Copy,Bitwise Copy和Memberwise Copy nio写得client和c++ server通信问题 关于接口的问题,有些不明白,请教了 算法题1道 急求 急等!在线 请各位帮帮忙啊! 用java的jdk做的比分程序,做了一半,数据库入库没做完,谁来接? 各位高手,请教关于RMI的问题,跪求高手指教,指导一下我这个菜鸟!!多谢! 类名.class?? 简单问题,怎么把double转成String类型 JAVA可以在Windows下开发像VC那样窗口界面的程序吗? 如何使写入的记录在文本文件中一个记录占一行? 实体类查看器,不需要界面,用控制台实现即可,求思路 如何将MySQL驱动包随工程一起导出?
浅度拷贝和深度拷贝
浅度拷贝就是要拷贝当前对象的内容,自己是另外的地址,而该对象中的引用类型成员也是把地址给克隆对象了。
深度拷贝不仅复制当前对象的内容到不同的地址,并且也复制该对象内中所有引用类型的内容到不同地址。public class Book2 implements Cloneable{
String bookName;
double price;
Person2 author;
public Book2(String bn,double price,Person2 author){
bookName = bn;
this.price = price;
this.author = author;
}
public Object clone(){
Book2 b = null;
try{
b = (Book2)super.clone();
}catch(CloneNotSupportedException e){
e.printStackTrace();
}
//这一行代码成就了深度拷贝
b.author = (Person2)author.clone();
return b;
}
public void display(){
System.out.print(bookName + "\t" + price + "\t") ;
author.display();
}
}//浅度拷贝
public class TestLowCopy {
public static void main(String[] args) {
Book b1=new Book("Java编程",30.50,new Person1("张三",34));
Book b2=(Book) b1.clone();
b2.price=44.0;
b2.author.setAge(45);
b2.author.setName("李四");
b2.bookName="Java 开发";
b1.display();
b2.display();
/*
* Person1传递的是值(引用的地址),所以Person1对象是同一个
* */
}}//深度拷贝
public class TestDeepCopy {
public static void main(String[] args) {
Book2 b1 = new Book2("Java编程",30.50,new Person2("张三",34));
Book2 b2 = (Book2)b1.clone();
b2.price = 44.0;
b2.author.setAge(45);
b2.author.setName("李四");
b2.bookName = "Java开发";
b1.display();
b2.display();
}}
public class Person2 implements Cloneable{
private String name;
private int age;
public Person2(String name,int age){
this.name = name;
this.age = age;
}
public void setAge(int age){
this.age = age;
}
public void setName(String name){
this.name = name;
}
public void display(){
System.out.println("Name:" + name + "\tAge:" + age);
}
public Object clone(){
Person2 p = null;
try{
p = (Person2)super.clone();
}catch(CloneNotSupportedException e){
e.printStackTrace();
}
return p;
}
}
1. Java中任意复杂度的深Clone
2. Shallow Copy,Deep Copy,Bitwise Copy和Memberwise Copy