Rappelons que l'affectation d'un objet à une variable écrit dans cette variable une référence à l'objet, mais ne crée pas un nouvel objet. Si l'on veut dupliquer un objet, on peut recourir à la méthode clone, définie dans la classe Object. Celle-ci commence par tester si la classe de l'objet réalise l'interface Cloneable ; si c'est le cas, elle effectue une copie superficielle de l'objet, et sinon, elle déclenche l'exception CloneNotSupportedException. Le transtypage (A) est nécessaire, car clone() retourne un Object, pas un A :
A a1 = new A(); A a2 = (A) a1.clone();
Cependant, comme l'accessibilité de clone est « protected », cette invocation ne peut figurer qu'à l'intérieur de la classe de l'objet à dupliquer ; sinon, le message d'erreur « clone() has protected access in java.lang.Object » est émis par le compilateur. Afin de pouvoir dupliquer un objet utilisé dans une classe quelconque, il faut redéfinir la méthode clone dans sa classe, en invoquant super.clone() et en la rendant publique :
class A implements Cloneable { // ... public Object clone() throws CloneNotSupportedException { return super.clone(); } }
Si l'on veut pouvoir invoquer clone sans être obligé de traiter CloneNotSupportedException, il suffit de récupérer cette exception dans la redéfinition de clone, par exemple de la façon suivante :
public Object clone() { try { return super.clone(); } catch (CloneNotSupportedException e) {} }