clon objeto java

clon de java

¿Por qué clon

Tenemos que utilizar un objeto en muchos casos para grabar otro objeto del estado actual del objeto puede tener muchos atributos, si vamos uno por uno conjunto, no sólo es inconveniente e ineficaz, nos fijamos en un encuentro principiante poder problema

class Person{
	String name;
    int age;
	
	public Person() {}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	
}

@Test
	public void test2() {
		Person p1=new Person("tom",20);
		Person p2=p1;
		System.out.println(p1);
		System.out.println(p2);
		System.out.println("---------");
		p1.age=30;
		System.out.println(p1);
		System.out.println(p2);
	}
输出:
Person [name=tom, age=20]
Person [name=tom, age=20]
---------
Person [name=tom, age=30]
Person [name=tom, age=30]

Tal vez algunas personas piensan persona p2 = p1 tal manera que se puede clonar un objeto, esta idea es errónea, esta asignación sólo se utiliza el signo igual de la dirección de p2 p1 asignación al objeto, a continuación, seleccione p1 y p2 un montón de un mismo objeto, por lo tanto, modificar el p2 p1 entonces se cambió

Si una propiedad a un ajuste manual no sólo es engorroso, sino que también puede tener atributos de propiedad, el cambio no es fácil

public void test2() {
		Person p1=new Person("tom",20);
		Person p2=new Person();
		p2.age=p1.age;
		p2.name=p1.name;
	}

Aquí jerarquía de atributo persona es muy sencillo modificar parece simple, pero una propiedad de tipo Dirección persona si hay más, entonces usted debe modificar manualmente la dirección e ir a un nuevo propiedades de asignación, si el atributo de jerarquía anidada de profundidad, y en muy difícil

Así que podemos usar el método de clonación para clonar objetos proporcionados por objeto, debido a que el método de clon es una palabra clave protegidas modificarse, si queremos usar fuera de la clase tendrá que sustituir la clase de padres, método clone objeto es una modificación de la palabra nativa el método, que llama a las otras lenguas del método, de alta eficiencia, es algo digno de mención es clonar la clase de objeto debe implementar la interfaz Cloneable, esta interfaz es una interfaz de marcador, que no define ningún método, si no implementa la interfaz Cloneable utilizando el clon método lanza una excepción CloneNotSupportedException

clon sin profundidad

Si las propiedades del objeto prototipo es un tipo de valor, a continuación, copiar clonar un objeto, si la propiedad es un tipo de referencia, la referencia asignada a las propiedades de los objetos clonados

class Person implements Cloneable{//必须实现Cloneable接口
	String name;
    int age;
	
	public Person() {}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	@Override
	protected Object clone(){
		Person p=null;
		try {
			p=(Person)super.clone();
		}catch(CloneNotSupportedException e) {//实现了Cloneable接口这个异常就不可能发生
			e.printStackTrace();
		}
		return p;
	}
	
}

@Test
	public void test2() {
		Person p1=new Person("tom",20);
		Person p2=(Person)p1.clone();
		System.out.println(p1);
		System.out.println(p2);
		System.out.println("---------");
		p1.age=30;
		System.out.println(p1);
		System.out.println(p2);
	}
输出:
Person [name=tom, age=20]
Person [name=tom, age=20]
---------
Person [name=tom, age=30]
Person [name=tom, age=20]

Este clon de la clase Object proporciona el tipo de valor de la propiedad todo el tiempo no será un problema, pero si hay una característica de la clase de tipo de referencia será un problema

class Person implements Cloneable{
	String name;
    int age;
    Address address;
	
	public Person() {}
	public Person(String name, int age,Address addr) {
		super();
		this.name = name;
		this.age = age;
		this.address=addr;
	}
	
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + ", address=" + address + "]";
	}
	@Override
	protected Object clone(){
		Person p=null;
		try {
			p=(Person)super.clone();
		}catch(CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return p;
	}
	
}
class Address{
	String addr;

	public Address(String addr) {
		super();
		this.addr = addr;
	}

	@Override
	public String toString() {
		return "Address [addr=" + addr + "]";
	}
	
}

@Test
	public void test2() {
		Address addr=new Address("成都市郫都区");
		Person p1=new Person("tom",20,addr);
		Person p2=(Person)p1.clone();
		System.out.println(p1);
		System.out.println(p2);
		System.out.println("---------");
		p1.address.addr="成都市金牛区";
		System.out.println(p1);
		System.out.println(p2);
	}
输出:
Person [name=tom, age=20, address=Address [addr=成都市郫都区]]
Person [name=tom, age=20, address=Address [addr=成都市郫都区]]
---------
Person [name=tom, age=20, address=Address [addr=成都市金牛区]]
Person [name=tom, age=20, address=Address [addr=成都市金牛区]]

P1 modificar la dirección de acuerdo clonado P1 P2 de la dirección ha cambiado, esto se conoce como propiedades del objeto clonado es un tipo de referencia, sólo se copiará referencias, y esta situación general, no queremos, por lo Es necesario utilizar clon profunda

clon de profundidad

1. todas las referencias clonar tipos de clones método de reemplazo

Aquí método de tipo de referencia override clon, la clonación se refiere al objeto en sí es un atributo de tipo de referencia debe reemplazar el método clon y el tipo de referencia de tipo de referencia también es necesario ser reescrito, y el artículo debe ser utilizado de forma explícita en el clon método

class Person implements Cloneable{
	String name;
    int age;
    Address address;//这个属性是引用类型,必须实现Cloneable接口重写clone方法
	
	public Person() {}
	public Person(String name, int age,Address addr) {
		super();
		this.name = name;
		this.age = age;
		this.address=addr;
	}
	
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + ", address=" + address + "]";
	}
	@Override
	protected Object clone(){
		Person p=null;
		try {
			p=(Person)super.clone();
		}catch(CloneNotSupportedException e) {
			e.printStackTrace();
		}
      //显式调用克隆引用数据类型
		p.address=(Address)address.clone();
		return p;
	}
	
}
class Address implements Cloneable{
	String addr;

	public Address(String addr) {
		super();
		this.addr = addr;
	}

	@Override
	public String toString() {
		return "Address [addr=" + addr + "]";
	}

	@Override
	protected Object clone() {
		Address addr=null;
		try {
			addr=(Address)super.clone();
		}catch(CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return addr;
	}
	
}

@Test
	public void test2() {
		Address addr=new Address("成都市郫都区");
		Person p1=new Person("tom",20,addr);
		Person p2=(Person)p1.clone();
		System.out.println(p1);
		System.out.println(p2);
		System.out.println("---------");
		p1.address.addr="成都市金牛区";
		System.out.println(p1);
		System.out.println(p2);
	}
输出:
Person [name=tom, age=20, address=Address [addr=成都市郫都区]]
Person [name=tom, age=20, address=Address [addr=成都市郫都区]]
---------
Person [name=tom, age=20, address=Address [addr=成都市金牛区]]
Person [name=tom, age=20, address=Address [addr=成都市金牛区]]

Los métodos que utilizan la secuencia

Necesidad de clase de objeto clon debe implementar la interfaz Serializable, que es una interfaz de marcador, la interfaz no tiene ninguna manera de lograr la clase de este método se puede escribir en la representación de objetos de esta clase a la corriente IO, siempre y objetos en la red puede ser enviar por correo o guardar en un disco local

class Person implements Cloneable,Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 8990580911834489134L;
	String name;
    int age;
    Address address;
	
	public Person() {}
	public Person(String name, int age,Address addr) {
		super();
		this.name = name;
		this.age = age;
		this.address=addr;
	}
	
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + ", address=" + address + "]";
	}
	@Override
	protected Object clone(){
		Person p=null;
		try {
			//将对象写入流中
			ByteArrayOutputStream baos=new ByteArrayOutputStream();
			ObjectOutputStream oos=new ObjectOutputStream(baos);
			oos.writeObject(this);
			//将对象从流中读取出来
			ByteArrayInputStream bais=new ByteArrayInputStream(baos.toByteArray());
			ObjectInputStream ois=new ObjectInputStream(bais);
			p=(Person)ois.readObject();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return p;
	}
	
}
class Address implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 328854588872604721L;
	String addr;

	public Address(String addr) {
		super();
		this.addr = addr;
	}

	@Override
	public String toString() {
		return "Address [addr=" + addr + "]";
	}
}

@Test
	public void test2() {
		Address addr=new Address("成都市郫都区");
		Person p1=new Person("tom",20,addr);
		Person p2=(Person)p1.clone();
		System.out.println(p1);
		System.out.println(p2);
		System.out.println("---------");
		p1.address.addr="成都市金牛区";


		System.out.println(p1);
		System.out.println(p2);
	}
输出:
Person [name=tom, age=20, address=Address [addr=成都市郫都区]]
Person [name=tom, age=20, address=Address [addr=成都市郫都区]]
---------
Person [name=tom, age=20, address=Address [addr=成都市金牛区]]
Person [name=tom, age=20, address=Address [addr=成都市郫都区]]

Supongo que te gusta

Origin www.cnblogs.com/moyuduo/p/12670541.html
Recomendado
Clasificación