Novità:

ho capito cosa intendevi dire allora ho fatto questo nella surface:
codice:
public Object clone() {
	try {
	    Surface cloned = (Surface) super.clone();
	    cloned.ground = (Piece[][]) ground.clone();
	    for (int x=0;x<l;x++){
		for (int y=0;y<h;y++)
		    cloned.ground[x][y]=(Piece)ground[x][y].clone();
	    }
	    return cloned;
	} catch (CloneNotSupportedException e) {
	    // non succede mai perché implementiamo Cloneable
	    return null;
	}
    }
Chiaramente Piece lo fatta clonaeble e ci ho definito il medoto super.clone()

Così fatta mi viene creato un oggetto cloned che ha id diverso dall'originale un ground che ha id diverso mentre ogni elemento del ground rimane invariato. La cosa che non capisco e che ho fatto il doppio for per clonare ogni elemento visto che se funge per ground e surface dovrebbe funzionare anche per i singoli elementi.. invece no .. quando si aggiornano i singoli elementi di cloned.ground viene aggiornato l'id anche nell'originale.. Com'è possibile?