Returnera en array, djupkopiering, grundkopiering

Antag att vi har en klass PP som har en instansvariabel enligt följande: private int [] x;
I klassen finns en metod getX_Alt1 som returnerar arrayen x. Den ser ut så här:

  public int [] getX_Alt1() { 
     return this.x;
  }

Returtypen för en metod står alltid före metodens namn. I detta fall står det int [], eftersom metoden skall returnera en int-array.

Följande exempel visar hur metoden kan anropas:


  // Skapa ett PP-objekt p1
  PP p1 = new PP(); 

  ...  // Gör något med p1

  // Anropa metoden getX som returnerar arrayen x
  // Arrayen z kommer referera till samma array som x 
  int [] z = p1.getX_Alt1();
  
x och z kommer att referera till samma array, dvs om vi ändrar något i arrayen z kommer det innebära att också instansvariabeln x kommer att ändras. Instansvariabeln x och z är alias för samma array med element. Om vi ändrar ett element i arrayen z kommer det per automatik att innebära att instansvariabeln x också ändras.
Om vi gör z[0]=14; innebär det att instansvariabeln x i PP-objektet p1 får ett nytt värde, dvs x[0]=14;.

Det är (normalt) inte önskvärt att man kan ändra ett objekt på detta sätt, eftersom det är via metoderna i en klass som man ändrar objektet. Om klassen har en metod som returnerararrayen skall den inte returnera referensen till arrayen, utan en array som är kopia av innehållet i arrayen. Metoden getX_Alt2 löser detta problem:


  public int [] getX_Alt2() {
     // Skapa en array som är lika lång som instansvariabeln x 
     int [] xcopy = new int[this.x.length];
     // Kopiera elementens värden från x till xcopy 
     for (int i=0;i < this.x.length;i++) {
        xcopy[i]=this.x[i];
     }
     // Returnera xcopy
     return xcopy;
  }

Följande exempel visar hur metoden getX_Alt2 kan anropas:


  // Skapa ett PP-objekt p1
  PP p1 = new PP(); 

  ...  // Gör något med p1

  // Anropa metoden getX_Alt2 som returnerar en array som
  // är kopia av instansvariabeln x
  // Arrayen z kommer INTE att referera till samma array som x 
  int [] z = p1.getX_Alt2();
  
Om vi nu gör: z[0]=14 kommer detta inte att påverka instansvariabeln x.

Djupkopiering vs grundkopiering