浅いコピーと深いコピーの問題java

トピックの詳細:

Javaでのオブジェクトコピーとは、オブジェクトのすべてのプロパティ(メンバー変数)を同じクラスタイプの別のオブジェクトにコピーすることです。例:たとえば、オブジェクトAとオブジェクトBは両方ともクラスSに属し、属性aとbを持っています。次に、オブジェクトAをコピーしてオブジェクトBに割り当てると、次のようになります。Ba = Aa; Bb = Ab;

浅いコピー:①データ型が基本データ型であるメンバー変数の場合、浅いコピーは値を直接転送します。つまり、属性値を新しいオブジェクトにコピーします。これは2つの異なるデータであるため、一方のオブジェクトのメンバー変数の値を変更しても、もう一方のオブジェクトによってコピーされるデータには影響しません。

②データ型が参照データ型であるメンバー変数の場合、例えば、メンバー変数が配列、特定のクラスのオブジェクトなどである場合、浅いコピーは参照によって渡されます。つまり、参照値のみです。メンバー変数の(メモリアドレス)。新しいオブジェクトにコピーします。実際には、両方のオブジェクトのメンバー変数が同じインスタンスを指しているためです。この場合、一方のオブジェクトのメンバー変数を変更すると、もう一方のオブジェクトのメンバー変数の値に影響します。この問題を解決するには、ディープコピーを導入します。

ディープコピー 配列やクラスオブジェクトなどの参照型のメンバー変数の場合、ディープコピーはターゲットオブジェクトに新しいオブジェクトスペースを作成し、元のオブジェクトの対応するメンバー変数エンティティオブジェクトの内容をコピーするため、異なるものを指します。メモリスペース。それらの1つを変更しても、他には影響しません。

Javaには、保護されたオブジェクトと呼ばれるメソッドがあります。clone()は、浅いコピーであるCloneNotSupportedExceptionをスローします。クラスのディープコピーを実装するには、Cloneableインターフェイスを実装してから、cloneメソッドを書き直す必要があります。

クローンメソッドの定義をオーバーライドします。

class Car implements Cloneable{  //定义一个Car类 实现接口Cloneable
       //成员变量定义
   public Object clone(){  //重写clone方法
       Car c = null;
        try {
                c = (Car)super.clone(); //调用父类Object实现浅拷贝
               } catch (CloneNotSupportedException e) {
                        e.printStackTrace();
               }
            //编写代码实现深拷贝

      }
    //编写代码实现其他成员方法
}

Car クラスに含まれる

1.プロパティ:

private String name;
private CarDriver driver;
private int[] scores;

2.引数なしのコンストラクター

public Car() {
}

3.メンバーメソッド:

@Override
public String toString() {
    return "Car [name=" + name + ", driver=" + driver + ", scores=" + Arrays.toString(scores) + "]";
}

4.その他のgetおよびsetメンバーメソッド:public String getName()、public CarDriver getDriver()、public int [] getScores()および

public void setName(String name)、public void setDriver(CarDriver dr)、public void setScores(int [] s)

cloneディープコピーを実装する方法 

CarDriver定義されたクラスの場合、次のようになります。

class CarDriver {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public CarDriver() {}
    public String toString() {
        return "CarDriver [name=" + name+"]";
    }
}
public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int i=sc.nextInt();
        switch(i) {
        case 1:     //深拷贝
            CarDriver cd=new CarDriver();
            Car c1=new Car();
            c1.setDriver(cd);
            cd.setName("d1");
            c1.setName("car1");
            int[] s=new int[2];
            c1.setScores(s);
            Car d1=(Car)c1.clone();
            System.out.println("c1:"+(c1==d1)+" driver:"+(c1.getDriver()==d1.getDriver())+" scores:"+(c1.getScores()==d1.getScores()));
            System.out.println(c1.toString()+" "+d1.getName()+" "+d1.getDriver().getName());    
            break;
        case 2: //        
            Car c2=new Car();
            Car d2=(Car)c2.clone();
            System.out.println("c2:"+(c2==d2)+" driver:"+c2.getDriver()+" "+(c2.getDriver()==d2.getDriver())+" scores:"+c2.getScores()+" "+(c2.getScores()==d2.getScores()));
            break;
        case 3:
            CarDriver cd1=new CarDriver();
            Car c3=new Car();
            c3.setDriver(cd1);
            Car d3=(Car)c3.clone();
            System.out.println("c3:"+(c3==d3)+" driver:"+c3.getDriver()+" "+(c3.getDriver()==d3.getDriver())+" scores:"+c3.getScores()+" "+(c3.getScores()==d3.getScores()));
            break;
        case 4:
            //CarDriver cd3=new CarDriver();
            Car c4=new Car();
            //c4.setDriver(cd3);
            int[] s1=new int[2];
            c4.setScores(s1);
            Car d4=(Car)c4.clone();
            System.out.println("c4:"+(c4==d4)+" driver:"+c4.getDriver()+" "+(c4.getDriver()==d4.getDriver())+" scores:"+" "+(c4.getScores()==d4.getScores()));
            break;

        } 
    }
}

//ここで、Carクラスの完全なコードを以下に記述する必要があります

回答コード:

class Car implements Cloneable{
    private String name;
    private CarDriver driver;
    private int[] scores;
    public Car() {
}
    public String getName() {
		return name;
	}
	public CarDriver getDriver() {
		return driver;
	}
	public int[] getScores() {
		return scores;
	}
	public void setName(String name){
	       this.name=name;
	   }
	public void setDriver(CarDriver dr){
	       this.driver=dr;
	   }
	public void setScores(int[] s){
	       this.scores=s;
	   }
    @Override
    public String toString() {
    	return "Car [name=" + name + ", driver=" + driver + ", scores=" + Arrays.toString(scores) + "]";
    }
    public Object clone(){
       Car c = null;
       try {
    	   c = (Car)super.clone();
       } catch (CloneNotSupportedException e) {
    	   e.printStackTrace();
       }
	  if(driver!=null) {
        c.driver=new CarDriver();
       if(driver.getName()!=null)
        c.driver.setName(new String(this.driver.getName()));
	  }
      if(name!=null)
        c.name=new String(this.name);  
      if(scores!=null) {
        c.scores=new int[this.scores.length];
       for(int i=0;i<this.scores.length;i++){
           c.scores[i]=this.scores[i];
         }
       }    
       return c;
   } 
}

おすすめ

転載: blog.csdn.net/qq_54587141/article/details/120744203