Problema de copia superficial y copia profunda java

Detalles del tema:

La copia de objetos en Java se refiere a copiar todas las propiedades (variables miembro) de un objeto a otro objeto con el mismo tipo de clase. Por ejemplo: Por ejemplo, el objeto A y el objeto B pertenecen a la clase S y tienen atributos a y b. Luego, copiar el objeto A y asignarlo al objeto B es: Ba=Aa, Bb=Ab;

Copia superficial : ① Para una variable miembro cuyo tipo de datos es un tipo de datos básico, la copia superficial transferirá directamente el valor, es decir, copiará el valor del atributo a un nuevo objeto. Debido a que se trata de dos datos diferentes, modificar el valor de la variable miembro de un objeto no afectará los datos copiados por el otro objeto.

②Para una variable miembro cuyo tipo de datos es un tipo de datos de referencia, por ejemplo, una variable miembro es una matriz, un objeto de cierta clase, etc., la copia superficial se pasará por referencia, es decir, solo el valor de referencia (dirección de memoria) de la variable miembro Haga una copia en el nuevo objeto. Porque, de hecho, las variables miembro de ambos objetos apuntan a la misma instancia. En este caso, modificar la variable miembro en un objeto afectará el valor de la variable miembro en el otro objeto. Para resolver este problema, introduce una copia profunda :

Copia profunda  Para las variables miembro de tipo de referencia, como matrices u objetos de clase, la copia profunda creará un nuevo espacio de objeto en el objeto de destino y luego copiará el contenido del objeto de entidad de variable miembro correspondiente del objeto original, para que apunten a diferentes espacios de memoria. Cambiar uno de ellos no afectará al otro.

Hay un método en Java llamado Objeto protegido clone() lanza CloneNotSupportedException, que es una copia superficial. Para implementar una copia profunda de una clase, debe implementar la interfaz Cloneable y luego reescribir el método de clonación

Anule la definición del método de clonación:

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 la clase contiene

1. Propiedades:

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

2. Constructor sin argumentos

public Car() {
}

3. Método de miembros:

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

4. Otros métodos para obtener y establecer miembros: public String getName(), public CarDriver getDriver(), public int[] getScores() y

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

clonemétodo para implementar copia profunda

CarDriverPara la clase definida, como sigue:

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;

        } 
    }
}

// Ahora solo necesita escribir el código completo de la clase de automóvil a continuación

Código de respuesta:

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;
   } 
}

Supongo que te gusta

Origin blog.csdn.net/qq_54587141/article/details/120744203
Recomendado
Clasificación