Java中对象的复制

来源:互联网 发布:力港网络客服电话 编辑:程序博客网 时间:2024/05/31 19:36

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所引用的对象,一句话,myDogdog彼此独立。




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;

}