Maison  >  Article  >  Java  >  Copie profonde et copie superficielle de la copie d'objet Java

Copie profonde et copie superficielle de la copie d'objet Java

王林
王林avant
2019-11-25 15:28:282474parcourir

Copie profonde et copie superficielle de la copie d'objet Java

1. Pour implémenter la copie d'objet, une interface Cloneable doit être implémentée. Si cette interface n'est pas implémentée, une CloneNotSupportedException sera générée. En fait, cette interface n’a pas une seule méthode, c’est pourquoi ce type d’interface est souvent appelé interface marqueur.

2. Il existe une méthode clone() dans Object qui implémente une copie superficielle. Pour les variables membres des types de données de base, la copie superficielle transférera directement la valeur, c'est-à-dire copiera la valeur de l'attribut dans le nouvel objet, afin que les types de données de base puissent être copiés directement.

Pour les types de données variables, tels que les objets Date, des copies complètes doivent être implémentées. Bien entendu, la classe Date elle-même implémente la méthode clone(), mais la classe String, par exemple, n'implémente pas la méthode clone(. ) car les objets String ne peuvent pas. Il n'y a aucun moyen de changer la séquence de caractères dans son cycle de vie pour modifier la séquence de caractères dans la mémoire. Il n'y a aucun problème si des attributs similaires dans différents objets font référence à la même chaîne.

Tutoriel vidéo d'apprentissage Java : Vidéo d'apprentissage Java

L'exemple est le suivant :

public class Main{
	public static void main(String[] args){
	}
}
class Employee implements Cloneable{
	private int id;
	private Date date;
	public Employee(){}
	public Employee(int id){
		this.id=id;
		this.date=new Date();
	}
	@Override
	public Employee clone() throws CloneNotSupportedException{
		Object t=super.clone();//此时的object中的拷贝只是浅拷贝
		Employee clone=(Employee)t;
		clone.date=this.data.clone();//date类实现了深拷贝,直接调用即可
		return clone;
	}
}
class Mannager extends Employee{
	private String name;
	public Mannager(){
		super();
	}
	public Mannager(String name,int id){
		super(id);
		this.name=name;
	}
	@Override
	public Mannager clone(){
		Employee t=super.clone();//先把id date属性复制
		Mannager clone=(Mannager)t;
		clone.name=t.name;//String 对象直接赋值引用
		return clone;
	}
}

Autres articles recommandés sur Java : Introduction à Java tutoriel

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer