import java.io.*; // Per poder duplicar Objectes de les nostres classes, podem usar // la propietat de clonar implementant la interface Clonaeable. // Aquest cas particular on tenim una superclasse abstracta i despres // dues derivades no-abstractes, notem que les derivades han d'implementar // el mètode de clonar: clone(). // Podem observar també, que el polimorfisme funciona correctament, ja que // tot i fer el càsting explicit a la superclasse A en el clone, realment // estem clonant usant el clone d'A1 i d'A2. abstract class A implements Cloneable{ public int i=0; abstract public void saluda(); abstract public Object clone(); } class A1 extends A implements Cloneable{ public void saluda() { System.out.println("Hola, sóc un A1 i el meu enter val: "); System.out.println(i); } public Object clone(){ A1 copia=new A1(); copia.i=i; /* noteu que aqui al fer la copia si la varialble d'instancia fos un objecte també caldria "clonar-lo" */ return(copia); } } class A2 extends A implements Cloneable{ public void saluda() { System.out.println("Hola, sóc un A2 i el meu enter val: "); System.out.println(i); } public Object clone(){ A2 copia=new A2(); copia.i=i; return(copia); } } public class Exj{ public static void main(String arg[]){ A[] vecta = new A[2]; A[] vectb = new A[2]; int j=0; vecta[0] = new A1(); vecta[1] = new A2(); for (j=0;j<2;j++) vectb[j]= (A)vecta[j].clone(); for (j=0;j<2;j++) vecta[j].i=3; // Observem que la modificació de la i als objectes del vector // vecta, no afecten als de la seva còpia vectb, i que a més, // el polimorfisme ha funcionat bé en el clone pq cada objecta // "saluda" segons la seva classe. for (j=0;j<2;j++) { vecta[j].saluda(); vectb[j].saluda(); } } }