Heim > Java > javaLernprogramm > Beispiel-Tutorial zum Klonen von Objekten (Clone) in Java

Beispiel-Tutorial zum Klonen von Objekten (Clone) in Java

零下一度
Freigeben: 2017-07-19 10:00:01
Original
1584 Leute haben es durchsucht

Teil II<br>

Wenn es um das Klonen von Objekten geht, müssen wir darüber sprechen, warum Objekte geklont werden sollten. Alle Objekte in Java werden im Heap gespeichert und der Heap wird global gemeinsam genutzt. Mit anderen Worten: Wenn verschiedene Methoden desselben Java-Programms einen Verweis auf ein Objekt erhalten können, kann der Referrer die internen Daten des Objekts nach Belieben ändern (vorausgesetzt, die internen Daten des Objekts werden über die Get/Set-Methode verfügbar gemacht). . Manchmal möchte der Code, den wir schreiben, dass der Aufrufer nur eine Kopie des Objekts erhält (d. h. ein Objekt mit genau demselben Inhalt, aber es gibt zwei solcher Objekte im Speicher). Gibt es eine Möglichkeit, dies zu tun? Natürlich ist es ein Klon.

Teil III

Zuallererst sind wir Programmierer, und natürlich kommunizieren wir in der Sprache unserer Programmierer.

import java.util.Date;
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
public class User implements Cloneable {
Nach dem Login kopieren
	private String username;
Nach dem Login kopieren
	private String password;
Nach dem Login kopieren
	private Date birthdate;
Nach dem Login kopieren
	public User(String username, String password, Date birthdate) {
Nach dem Login kopieren
		this.username = username;
Nach dem Login kopieren
		this.password = password;
Nach dem Login kopieren
		this.birthdate = birthdate;
Nach dem Login kopieren
	}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
	@Override
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
	protected Object clone() throws CloneNotSupportedException {
Nach dem Login kopieren
Nach dem Login kopieren
		return super.clone();
Nach dem Login kopieren
Nach dem Login kopieren
	}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
	@Override
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
	public int hashCode() {
Nach dem Login kopieren
Nach dem Login kopieren
		// 省略equals的实现(可用eclipse自动生成)
Nach dem Login kopieren
Nach dem Login kopieren
	}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
	@Override
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
	public boolean equals(Object obj) {
Nach dem Login kopieren
Nach dem Login kopieren
		// 省略equals的实现(可用eclipse自动生成)
Nach dem Login kopieren
Nach dem Login kopieren
	}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
	// 省略一大堆get/set方法
Nach dem Login kopieren
}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Der obige Code erstellt eine Benutzerklasse und implementiert die java.lang.Cloneable-Schnittstelle. Wie der Name schon sagt, bedeutet Cloneable, dass diese Klasse geklont werden kann.

Werfen wir zunächst einen Blick auf die java.lang.Cloneable-Schnittstelle.

/*
Nach dem Login kopieren
Nach dem Login kopieren
 * @(#)Cloneable.java	1.17 05/11/17
Nach dem Login kopieren
 *
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
 * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
Nach dem Login kopieren
Nach dem Login kopieren
 * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
Nach dem Login kopieren
Nach dem Login kopieren
 */
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
package java.lang;
Nach dem Login kopieren
Nach dem Login kopieren
/**
Nach dem Login kopieren
Nach dem Login kopieren
 * A class implements the Cloneable interface to
Nach dem Login kopieren
 * indicate to the {@link java.lang.Object#clone()} method that it
Nach dem Login kopieren
 * is legal for that method to make a
Nach dem Login kopieren
 * field-for-field copy of instances of that class.
Nach dem Login kopieren
 *
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

 * Invoking Object's clone method on an instance that does not implement the
Nach dem Login kopieren
 * Cloneable interface results in the exception
Nach dem Login kopieren
 * CloneNotSupportedException being thrown.
Nach dem Login kopieren
 *
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

 * By convention, classes that implement this interface should override
Nach dem Login kopieren
 * Object.clone (which is protected) with a public method.
Nach dem Login kopieren
 * See {@link java.lang.Object#clone()} for details on overriding this
Nach dem Login kopieren
 * method.
Nach dem Login kopieren
 *
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

 * Note that this interface does not contain the clone method.
Nach dem Login kopieren
 * Therefore, it is not possible to clone an object merely by virtue of the
Nach dem Login kopieren
 * fact that it implements this interface.  Even if the clone method is invoked
Nach dem Login kopieren
 * reflectively, there is no guarantee that it will succeed.
Nach dem Login kopieren
 *
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
 * @author  unascribed
Nach dem Login kopieren
Nach dem Login kopieren
 * @version 1.17, 11/17/05
Nach dem Login kopieren
 * @see     java.lang.CloneNotSupportedException
Nach dem Login kopieren
 * @see     java.lang.Object#clone()
Nach dem Login kopieren
 * @since   JDK1.0
Nach dem Login kopieren
Nach dem Login kopieren
 */
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
public interface Cloneable {
Nach dem Login kopieren
}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Seien Sie nicht überrascht, ja, bis auf viele Hühnerdärme ist diese Schnittstelle nicht definiert irgendetwas Methodensignatur. Mit anderen Worten: Wir möchten ein Objekt klonen, aber es stellt mir keine Methode zur Verfügung. Was also tun? Haben Sie keine Angst, wir haben immer noch die allmächtige Objektklasse. Vergessen Sie nicht, dass er der Vorfahre aller Klassen ist (eine gottähnliche Existenz), also sollten Sie ihn begrüßen, wann immer Sie etwas haben.

/*
Nach dem Login kopieren
Nach dem Login kopieren
 * @(#)Object.java	1.73 06/03/30
Nach dem Login kopieren
 *
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
 * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
Nach dem Login kopieren
Nach dem Login kopieren
 * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
Nach dem Login kopieren
Nach dem Login kopieren
 */
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
package java.lang;
Nach dem Login kopieren
Nach dem Login kopieren
/**
Nach dem Login kopieren
Nach dem Login kopieren
 * Class Object is the root of the class hierarchy.
Nach dem Login kopieren
 * Every class has Object as a superclass. All objects,
Nach dem Login kopieren
 * including arrays, implement the methods of this class.
Nach dem Login kopieren
 *
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
 * @author  unascribed
Nach dem Login kopieren
Nach dem Login kopieren
 * @version 1.73, 03/30/06
Nach dem Login kopieren
 * @see     java.lang.Class
Nach dem Login kopieren
 * @since   JDK1.0
Nach dem Login kopieren
Nach dem Login kopieren
 */
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
public class Object {
Nach dem Login kopieren
    <br>
Nach dem Login kopieren
   // 省略N多的代码
Nach dem Login kopieren
    /**
Nach dem Login kopieren
     * Creates and returns a copy of this object.  The precise meaning
Nach dem Login kopieren
     * of "copy" may depend on the class of the object. The general
Nach dem Login kopieren
     * intent is that, for any object x, the expression:
Nach dem Login kopieren
     *
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
*
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
     * x.clone() != x
Nach dem Login kopieren
     * will be true, and that the expression:
Nach dem Login kopieren
     *
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
*
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
     * x.clone().getClass() == x.getClass()
Nach dem Login kopieren
     * will be true, but these are not absolute requirements.
Nach dem Login kopieren
     * While it is typically the case that:
Nach dem Login kopieren
     *
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
*
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
     * x.clone().equals(x)
Nach dem Login kopieren
     * will be true, this is not an absolute requirement.
Nach dem Login kopieren
     *
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

     * By convention, the returned object should be obtained by calling
Nach dem Login kopieren
     * super.clone.  If a class and all of its superclasses (except
Nach dem Login kopieren
     * Object) obey this convention, it will be the case that
Nach dem Login kopieren
     * x.clone().getClass() == x.getClass().
Nach dem Login kopieren
     *
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

     * By convention, the object returned by this method should be independent
Nach dem Login kopieren
     * of this object (which is being cloned).  To achieve this independence,
Nach dem Login kopieren
     * it may be necessary to modify one or more fields of the object returned
Nach dem Login kopieren
     * by super.clone before returning it.  Typically, this means
Nach dem Login kopieren
     * copying any mutable objects that comprise the internal "deep structure"
Nach dem Login kopieren
     * of the object being cloned and replacing the references to these
Nach dem Login kopieren
     * objects with references to the copies.  If a class contains only
Nach dem Login kopieren
     * primitive fields or references to immutable objects, then it is usually
Nach dem Login kopieren
     * the case that no fields in the object returned by super.clone
Nach dem Login kopieren
     * need to be modified.
Nach dem Login kopieren
     *
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

     * The method clone for class Object performs a
Nach dem Login kopieren
     * specific cloning operation. First, if the class of this object does
Nach dem Login kopieren
     * not implement the interface Cloneable, then a
Nach dem Login kopieren
     * CloneNotSupportedException is thrown. Note that all arrays
Nach dem Login kopieren
     * are considered to implement the interface Cloneable.
Nach dem Login kopieren
     * Otherwise, this method creates a new instance of the class of this
Nach dem Login kopieren
     * object and initializes all its fields with exactly the contents of
Nach dem Login kopieren
     * the corresponding fields of this object, as if by assignment; the
Nach dem Login kopieren
     * contents of the fields are not themselves cloned. Thus, this method
Nach dem Login kopieren
     * performs a "shallow copy" of this object, not a "deep copy" operation.
Nach dem Login kopieren
     *
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

     * The class Object does not itself implement the interface
Nach dem Login kopieren
     * Cloneable, so calling the clone method on an object
Nach dem Login kopieren
     * whose class is Object will result in throwing an
Nach dem Login kopieren
     * exception at run time.
Nach dem Login kopieren
     *
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
     * @return     a clone of this instance.
Nach dem Login kopieren
     * @exception  CloneNotSupportedException  if the object's class does not
Nach dem Login kopieren
     *               support the Cloneable interface. Subclasses
Nach dem Login kopieren
     *               that override the clone method can also
Nach dem Login kopieren
     *               throw this exception to indicate that an instance cannot
Nach dem Login kopieren
     *               be cloned.
Nach dem Login kopieren
     * @see java.lang.Cloneable
Nach dem Login kopieren
     */
Nach dem Login kopieren
    protected native Object clone() throws CloneNotSupportedException;
Nach dem Login kopieren
}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Haha, wieder eine große Reihe von Hühnerdärmen, ich glaube nicht, dass ich hier bin, um die Anzahl der Wörter zu erhöhen, das sind alles Technologien, die von geschrieben wurden Java-Entwickler von Sun. Artikel, mehr lesen und weniger reden.

Ja, es ist eine native Methode. Es ist tatsächlich eine tiefgreifende Sache, aber wir müssen sie trotzdem nutzen. Darüber hinaus ist seine Methode geschützt, und er fordert uns eindeutig auf, einen Vorteil daraus zu ziehen.

Sehen Sie sich weiterhin den Testcode unten an.

import java.util.Date;
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
import org.junit.Test;
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
public class TestCase {
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
<br>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
	@Test
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
	public void testUserClone() throws CloneNotSupportedException {
Nach dem Login kopieren
		User u1 = new User("Kent", "123456", new Date());
Nach dem Login kopieren
		User u2 = u1;
Nach dem Login kopieren
		User u3 = (User) u1.clone();
Nach dem Login kopieren
<br>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
		System.out.println(u1 == u2);		// true
Nach dem Login kopieren
		System.out.println(u1.equals(u2));	// true
Nach dem Login kopieren
<br>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
		System.out.println(u1 == u3);		// false
Nach dem Login kopieren
		System.out.println(u1.equals(u3));	// true
Nach dem Login kopieren
	}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
<br>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Diese clone()-Methode ist wirklich großartig. Sie klont unser Objekt auf einmal. Die Adressen von u1 und u3 sind unterschiedlich, aber der Inhalt das gleiche.

Teil IV

Anhand des obigen Beispiels können wir sehen, dass es tatsächlich zwei Schritte zum Klonen eines Objekts gibt:

1. Lassen Sie diese Klasse die Schnittstelle java.lang.Cloneable implementieren.

2.

Aber ist es wirklich so einfach? Schauen Sie sich den Code unten noch einmal an.

public class Administrator implements Cloneable {
Nach dem Login kopieren
	private User user;
Nach dem Login kopieren
	private Boolean editable;
Nach dem Login kopieren
	public Administrator(User user, Boolean editable) {
Nach dem Login kopieren
		this.user = user;
Nach dem Login kopieren
		this.editable = editable;
Nach dem Login kopieren
	}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
<br>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
	@Override
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
	protected Object clone() throws CloneNotSupportedException {
Nach dem Login kopieren
Nach dem Login kopieren
		return super.clone();
Nach dem Login kopieren
Nach dem Login kopieren
	}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
	@Override
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
	public int hashCode() {
Nach dem Login kopieren
Nach dem Login kopieren
		// 老规矩
Nach dem Login kopieren
Nach dem Login kopieren
	}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
	@Override
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
	public boolean equals(Object obj) {
Nach dem Login kopieren
Nach dem Login kopieren
		// 老规矩
Nach dem Login kopieren
Nach dem Login kopieren
	}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
	// 老规矩
Nach dem Login kopieren
}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Das Obige definiert eine Administratorklasse, die ein Objekt der Benutzerklasse enthält. Schauen wir uns als Nächstes die Auswirkung des Klonens des Administratorobjekts an.

import java.util.Date;
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
import org.junit.Test;
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
public class TestCase {
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
	@Test
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
	public void testAdministratorClone() throws CloneNotSupportedException {
Nach dem Login kopieren
		Administrator a1 = new Administrator(new User("Kent", "123456", new Date()), true);
Nach dem Login kopieren
		Administrator a2 = a1;
Nach dem Login kopieren
		Administrator a3 = (Administrator) a1.clone();
Nach dem Login kopieren
<br>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
		System.out.println(a1 == a2);			// true
Nach dem Login kopieren
		System.out.println(a1.equals(a2));		// true
Nach dem Login kopieren
<br>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
		System.out.println(a1 == a3);			// false
Nach dem Login kopieren
		System.out.println(a1.equals(a3));		// true
Nach dem Login kopieren
<br>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
		System.out.println(a1.getUser() == a3.getUser());		//true ! It's not our expected!!!!!
Nach dem Login kopieren
		System.out.println(a1.getUser().equals(a3.getUser()));	//true
Nach dem Login kopieren
	}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Hehehe! Etwas ist schief gelaufen. Java ist so einfach zu beherrschen!

Hier können wir zwei Fachbegriffe vorstellen: flaches Klonen und tiefes Klonen.

Das sogenannte flache Klonen ist, wie der Name schon sagt, ein sehr oberflächlicher Klon. Wenn wir das Administratorobjekt klonen möchten, klonen wir nur sich selbst und die Referenzadressen aller Objekte, die es enthält.

Tiefes Klonen ist kein flaches Klonen. Klonen Sie alle Objekte außer sich selbst, einschließlich aller in ihm enthaltenen Objektinstanzen. Der Grad des tiefen Klonens wird durch spezifische Bedürfnisse bestimmt. Es gibt auch ein Sprichwort vom „Klonen auf N-Ebene“.

Allerdings werden alle Daten vom primitiven Typ, egal ob flacher Klon oder tiefer Klon, nach dem Originalwert geklont. Schließlich sind sie keine Objekte und werden nicht im Heap gespeichert. Hinweis: Grundlegende Datentypen enthalten nicht die entsprechenden Wrapper-Klassen.

Wenn wir möchten, dass das Objekt tief geklont wird, können wir die Administrator-Klasse wie folgt ändern.

@Override
Nach dem Login kopieren
protected Object clone() throws CloneNotSupportedException {
Nach dem Login kopieren
	Administrator admin = (Administrator) super.clone();
Nach dem Login kopieren
	admin.user = (User) admin.user.clone();
Nach dem Login kopieren
	return admin;
Nach dem Login kopieren
}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Da Boolean den Wert zwischenspeichert, müssen wir das Boolean-Objekt nicht klonen. Und die Boolean-Klasse implementiert nicht die java.lang.Cloneable-Schnittstelle.

Teil V

1. 让该类实现java.lang.Cloneable接口;

2. 确认持有的对象是否实现java.lang.Cloneable接口并提供clone()方法;

3. 重写(override)Object类的clone()方法,并且在方法内部调用持有对象的clone()方法;

4. ……

5. 多麻烦啊,调来调去的,如果有N多个持有的对象,那就要写N多的方法,突然改变了类的结构,还要重新修改clone()方法。

难道就没有更好的办法吗?

Part VI

接下来要重点介绍一下使用java.lang.Serializable来实现对象的深度克隆。

首先,我们编写一个工具类并提供cloneTo()方法。

import java.io.ByteArrayInputStream;
Nach dem Login kopieren
import java.io.ByteArrayOutputStream;
Nach dem Login kopieren
import java.io.IOException;
Nach dem Login kopieren
import java.io.ObjectInputStream;
Nach dem Login kopieren
import java.io.ObjectOutputStream;
Nach dem Login kopieren
public abstract class BeanUtil {
Nach dem Login kopieren
	@SuppressWarnings("unchecked")
Nach dem Login kopieren
	public static  T cloneTo(T src) throws RuntimeException {
Nach dem Login kopieren
		ByteArrayOutputStream memoryBuffer = new ByteArrayOutputStream();
Nach dem Login kopieren
		ObjectOutputStream out = null;
Nach dem Login kopieren
		ObjectInputStream in = null;
Nach dem Login kopieren
		T dist = null;
Nach dem Login kopieren
		try {
Nach dem Login kopieren
			out = new ObjectOutputStream(memoryBuffer);
Nach dem Login kopieren
			out.writeObject(src);
Nach dem Login kopieren
			out.flush();
Nach dem Login kopieren
			in = new ObjectInputStream(new ByteArrayInputStream(memoryBuffer.toByteArray()));
Nach dem Login kopieren
			dist = (T) in.readObject();
Nach dem Login kopieren
		} catch (Exception e) {
Nach dem Login kopieren
			throw new RuntimeException(e);
Nach dem Login kopieren
		} finally {
Nach dem Login kopieren
			if (out != null)
Nach dem Login kopieren
				try {
Nach dem Login kopieren
Nach dem Login kopieren
					out.close();
Nach dem Login kopieren
					out = null;
Nach dem Login kopieren
				} catch (IOException e) {
Nach dem Login kopieren
Nach dem Login kopieren
					throw new RuntimeException(e);
Nach dem Login kopieren
Nach dem Login kopieren
				}
Nach dem Login kopieren
Nach dem Login kopieren
			if (in != null)
Nach dem Login kopieren
				try {
Nach dem Login kopieren
Nach dem Login kopieren
					in.close();
Nach dem Login kopieren
					in = null;
Nach dem Login kopieren
				} catch (IOException e) {
Nach dem Login kopieren
Nach dem Login kopieren
					throw new RuntimeException(e);
Nach dem Login kopieren
Nach dem Login kopieren
				}
Nach dem Login kopieren
Nach dem Login kopieren
		}
Nach dem Login kopieren
		return dist;
Nach dem Login kopieren
	}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

看不懂,没关系,直接拿去用就可以了。嘻嘻。

接下来我们测试一下是否能通过这个工具来实现深度克隆。

又是这个可爱的TestCase,可怜的每次都要动他……

import java.util.Date;
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
import org.junit.Test;
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
public class TestCase {
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
<br>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
	@Test
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
	public void testCloneTo() {
Nach dem Login kopieren
		Administrator src = new Administrator(new User("Kent", "123456", new Date()), true);
Nach dem Login kopieren
		Administrator dist = BeanUtil.cloneTo(src);
Nach dem Login kopieren
<br>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
		System.out.println(src == dist);			// false
Nach dem Login kopieren
		System.out.println(src.equals(dist));		// true
Nach dem Login kopieren
<br>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
		System.out.println(src.getUser() == dist.getUser());		//false ! Well done!
Nach dem Login kopieren
		System.out.println(src.getUser().equals(dist.getUser()));	//true
Nach dem Login kopieren
	}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
<br>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

好了,无论你的对象有多么的复杂,只要这些对象都能够实现java.lang.Serializable接口,就可以进行克隆,而且这种克隆的机制是JVM完成的,不需要修改实体类的代码,方便多了。

Das obige ist der detaillierte Inhalt vonBeispiel-Tutorial zum Klonen von Objekten (Clone) in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage