Java中对象的复制
1、 Java中对象与变量
先新建一个对象
Dog dog=new Dog("Rover","Poodle");
其中,dog为Dog类型的变量,Dog("Rover", "Poodle")为Dog类型的对象,dog变量获得是Dog("Rover","Poodle")对象的引用。
如果再写:
Dog myDog=dog;
表示myDog与dog引用同一对象Dog("Rover", "Poodle"),修改myDog会引起dog的同步修改
myDog.setName=”Smart”;
则造成对象Dog("Rover", "Poodle")的消失(如果程序的任意一个地方都不在有对该对象的引用的话),Dog("Smart", "Poodle")会新建,这个时候myDog和dog引用了新的Dog("Smart","Poodle")对象,如下图
2、 简单的对象复制
任何类都是超类Object的子类,Object提供了Protected类型的clone()函数用于对象的复制。然而,使用clone()复制对象会变的复制而麻烦。更建议使用的方式是实现一个复制功能的构造函数。下面的例子:
public class Dog {
public Dog(String aName,String abreed) {
// TODO Auto-generatedconstructor stub
name=aName;
breed=abreed;
}
public Dog(Dog dog) {
// TODO Auto-generatedconstructor stub
name=dog.name;
breed=dog.breed;
}
protected Stringname;
protected Stringbreed;
}
主程序编写:
Dog dog=new Dog("Rover","Poodle");
Dog myDog=newDog(dog);
就实现了myDog所引用的对象地址与dog所引用的对象地址的彼此独立,修改myDog所引用的对象不会引起dog所引用的对象,一句话,myDog和dog彼此独立。
3、 复杂的对象复制
问题抽象为:
PetDog类对象继承自Dog……(仍有父类的话),
Flea类继承自FlySpecises……(仍有父类的话)
PetDog类包含Flea类的一个对象,对PetDog类进行复制的条件:Flea类及Flea的所有超类都可以复制
这是因为,对PetDog类进行复制的话必须保证对PetDog类中的Flea类对象可以被复制。
关键点如下:
Dog类的的构造函数:
public Dog(Dog dog) {
// TODO Auto-generatedconstructor stub
super(dog);
name=dog.name;
breed=dog.breed;
}
FlySpecises的构造函数:
public FlySpecises (FlySpecises flySpecises) {
// TODO Auto-generatedconstructor stub
super(flySpecises);
name= flySpecises.name;
species= flySpecises.species;
}
Flea类的构造函数:
public Flea(Flea flea) {
// TODO Auto-generatedconstructor stub
super(flea);
name=flea.name;
species=flea.species;
}
则PetDog可以为:
public class PetDog extends Dog {
public PetDog(String aName, String abreed,StringfleaName,String feasSpecies) {
super(aName, abreed);
// TODO Auto-generatedconstructor stub
petFlea=new Flea(fleaName, feasSpecies);
}
//对象复制的关键构造函数
public PetDog(PetDog petDog) {
super(petDog);
// TODO Auto-generatedconstructor stub
petFlea=new Flea(petDog.petFlea);
}
protected FleapetFlea;
}