Originariamente inviato da JinKazama84
codice:
	    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();
Tieni presente una cosa: gli array implementano Cloneable ma un clone su un array bidimensionale clona solo la prima dimensione!!!

Questo programmino:
codice:
class Prova
{
    public static void main (String[] args)
    {
        Object[][] biarr = { { new Object(), new Object() }, { new Object(), new Object() } };

        printBiArr (biarr);

        Object[][] biarr2 = biarr.clone ();

        printBiArr (biarr2);
    }

    public static void printBiArr (Object[][] arr)
    {
        System.out.println (arr);
        for (Object[] a1 : arr)
        {
            System.out.println ("   " + a1);
            System.out.print ("      ");
            for (Object o : a1)
                System.out.print (o + "   ");
            System.out.println ();
        }
        System.out.println ("--------");
    }
}
Stampa:
codice:
[[Ljava.lang.Object;@e48e1b
   [Ljava.lang.Object;@12dacd1
      java.lang.Object@1ad086a   java.lang.Object@10385c1
   [Ljava.lang.Object;@42719c
      java.lang.Object@30c221   java.lang.Object@119298d
--------
[[Ljava.lang.Object;@f72617
   [Ljava.lang.Object;@12dacd1
      java.lang.Object@1ad086a   java.lang.Object@10385c1
   [Ljava.lang.Object;@42719c
      java.lang.Object@30c221   java.lang.Object@119298d
--------
Cosa vuol dire? Nota le parti sottolineate: ha clonato solo l'array principale ma non il resto.
In pratica ha creato un nuovo array:

{ vecchio reference a Object[] , vecchio reference a Object[] }

ma il resto è identico all'array originale.

L'unico caso in cui il clone su un array fa veramente una "deep-copy" è nel caso particolare di array di tipi primitivi e a 1 dimensione. Per qualunque altro tipo di array la clonazione è "shallow".

Nota infine come da Java 5 in poi la clonazione sugli array è "covariante" (non ho fatto cast nel codice).