} public Car getCar() { return car; } public String getName() { return name; } public void setName(String name) { this.name = name; }}car.java 类的代码如下: public class Car {
private String name;
public Car(String name){
this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; }
}测试类ShallowCopyTest的代码入下:public class ShallowCopyTest { public static void main(String[] args){ Person1 person = new Person1("zhangsan", "aodi"); System.out.println("Original value --->" + person.getName() + " has--> " + person.getCar().getName()); Person1 q = (Person1) person.clone(); System.out.println("clone value --->" + q.getName() + " has--> " + q.getCar().getName()); q.setName("lisi"); q.getCar().setName("benci"); System.out.println("clone(After) value --->" + q.getName() + " has--> " + q.getCar().getName()); System.out.println("clone value --->" + person.getName() + " has--> " + person.getCar().getName()); }}在ShallowCopyTest中我们先生成了Person1的一个实例然后输出了他的信息然后我们通过浅拷贝赋值给另一个Person对象接着输出了这个对象的信息,接着我们通过这个对象进行了一些信息的修改,接着我们输出了这个对象的信息和原来那个对象的信息。当我们运行上面的ShallowCopyTest类时输出:Original value --->zhangsan has--> aodi clone value --->zhangsan has--> aodi clone(After) value --->lisi has--> benci clone value --->zhangsan has--> benci接下来我们实现深拷贝:Person2.java的代码和Person1的代码大致相同只是重写的clone的内容改为:@Override public Object clone() {
Person2 person = new Person2(name,car.getName());
return person; }car类不变;测试类DeepCopyTest的代码如下:public class DeepCopyTest { public static void main(String[] args){ Person2 person = new Person2("zhangsan", "aodi"); System.out.println("Original value --->" + person.getName() + " has--> " + person.getCar().getName()); Person2 q = (Person2) person.clone(); System.out.println("clone value --->" + q.getName() + " has--> " + q.getCar().getName()); q.setName("lisi"); q.getCar().setName("benci"); System.out.println("clone(After) value --->" + q.getName() + " has--> " + q.getCar().getName()); System.out.println("clone value --->" + person.getName() + " has--> " + person.getCar().getName()); }}运行这个类输出:Original value --->zhangsan has--> aodi clone value --->zhangsan has--> aodi clone(After) value --->lisi has--> benci clone value --->zhangsan has--> aodi接下来我们看看深拷贝和浅拷贝输出有什么异同相同:当拷贝的对象中含有基本类型时,当通过拷贝对像(q)改变属性值时原对象(person)的属性值不会改变不同 : 当考拷贝对象含有其他对象的引用时,在浅拷贝中拷贝对像(q)和原对象(person)共享其他对象的引用拷贝对像(q)改变引用属性值时原对象(person)的引用属性值也相应改变。相反在生拷贝中拷贝对像(q)和原对象(person)不共享其他对象的引用,拷贝对像(q)改变引用属性值时原对象(person)的引用属性值不会改变 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/happysmhzp/archive/2010/06/03/5646002.aspx
class A implements Cloneable{ int i; protected Object clone() throws CloneNotSupportedException { return super.clone(); } }class B extends A { protected Object clone() throws CloneNotSupportedException { return super.clone(); } }class C extends B { protected Object clone() throws CloneNotSupportedException { return super.clone(); } }
private Car car; //这个人的车
private String name;//名字
public Person1(String name,String carName){
this.name = name;
car = new Car(carName);
} @Override
public Object clone() {
try{
return super.clone();
}catch(CloneNotSupportedException e){
e.printStackTrace();
return null;
}
} public Car getCar() {
return car;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}}car.java 类的代码如下:
public class Car {
private String name;
public Car(String name){
this.name = name;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}测试类ShallowCopyTest的代码入下:public class ShallowCopyTest { public static void main(String[] args){ Person1 person = new Person1("zhangsan", "aodi"); System.out.println("Original value --->" + person.getName()
+ " has--> " + person.getCar().getName()); Person1 q = (Person1) person.clone(); System.out.println("clone value --->" + q.getName() + " has--> "
+ q.getCar().getName()); q.setName("lisi"); q.getCar().setName("benci"); System.out.println("clone(After) value --->" + q.getName() + " has--> "
+ q.getCar().getName()); System.out.println("clone value --->" + person.getName() + " has--> "
+ person.getCar().getName()); }}在ShallowCopyTest中我们先生成了Person1的一个实例然后输出了他的信息然后我们通过浅拷贝赋值给另一个Person对象接着输出了这个对象的信息,接着我们通过这个对象进行了一些信息的修改,接着我们输出了这个对象的信息和原来那个对象的信息。当我们运行上面的ShallowCopyTest类时输出:Original value --->zhangsan has--> aodi
clone value --->zhangsan has--> aodi
clone(After) value --->lisi has--> benci
clone value --->zhangsan has--> benci接下来我们实现深拷贝:Person2.java的代码和Person1的代码大致相同只是重写的clone的内容改为:@Override
public Object clone() {
Person2 person = new Person2(name,car.getName());
return person;
}car类不变;测试类DeepCopyTest的代码如下:public class DeepCopyTest { public static void main(String[] args){ Person2 person = new Person2("zhangsan", "aodi"); System.out.println("Original value --->" + person.getName()
+ " has--> " + person.getCar().getName()); Person2 q = (Person2) person.clone(); System.out.println("clone value --->" + q.getName() + " has--> "
+ q.getCar().getName()); q.setName("lisi"); q.getCar().setName("benci"); System.out.println("clone(After) value --->" + q.getName() + " has--> "
+ q.getCar().getName()); System.out.println("clone value --->" + person.getName() + " has--> "
+ person.getCar().getName()); }}运行这个类输出:Original value --->zhangsan has--> aodi
clone value --->zhangsan has--> aodi
clone(After) value --->lisi has--> benci
clone value --->zhangsan has--> aodi接下来我们看看深拷贝和浅拷贝输出有什么异同相同:当拷贝的对象中含有基本类型时,当通过拷贝对像(q)改变属性值时原对象(person)的属性值不会改变不同 : 当考拷贝对象含有其他对象的引用时,在浅拷贝中拷贝对像(q)和原对象(person)共享其他对象的引用拷贝对像(q)改变引用属性值时原对象(person)的引用属性值也相应改变。相反在生拷贝中拷贝对像(q)和原对象(person)不共享其他对象的引用,拷贝对像(q)改变引用属性值时原对象(person)的引用属性值不会改变
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/happysmhzp/archive/2010/06/03/5646002.aspx
int i; protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}class B extends A {
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}class C extends B {
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}