void Methode gibt Array zurück

Kann mir jemand sagen, warum primitive Datentypen immer mit return zurückgegeben werden müssen, während Arrays das nicht müssen?
Java:
import java.util.Arrays;

public class Test {

  public static void main(String[] args) {
   
  int i[] = {1, 2, 3};
  int j = 1;
   
  test(i, j);
   
  System.out.println(Arrays.toString(i));
  System.out.println(j);
   
  }
   
  public static void test (int[] i, int j){
   
  i[0]++;
  i[1]++;
  i[2]++;
  j++;
   
  }
   
}

upload_2016-9-27_14-22-30.png
 

Anhänge

  • upload_2016-9-27_14-22-30.jpeg
    upload_2016-9-27_14-22-30.jpeg
    10,5 KB · Aufrufe: 35
Hallo Tommy,

die übergebenen Parameter (i und j) welcher du der Methode mitgibst, sind lediglich lokale Variablen.
Und deren Werte werden der Methode als Kopie übergeben.
Innerhalb der Methode machen die das ganze Zeug mit und nehmen die erwarteten Werte dann an.
Am Ende der Methode werden diese zerstört.
Setze doch mal in die test-Methode ein System.out.println()-Anweisung ein und lass dir j innerhalb der Methode ausgeben.

J ist in der Parameterliste eine andere Variable als die lokale, welche du in der main Methode deklariert hast.
Probier noch etwas aus. Und schreibe statt "test (int [] i, int j)" - test ( int[] i, int lokaleVariable)" und lass diese im Methodenrumpf inkrementieren. Du siehst dann, dass du die Methode genauso aufrufen kannst und dass das j mit dem anderen j eigentlich nichts zu tun hat.

Und das Array ist ein referenzdatentyp. Es wird der Methode somit auch nicht das Array übergeben, sondern nur ein Zeiger. - wie bei Objekten.
Und dieser Zeiger wird vorher ebenfalls kopiert. Es wird also der Verweis auf das Array kopiert und dann in die Methode übergeben. Der kopierte Verweis wird dann am Ende der Methode ebenfalls zerstört. Und wenn du dann in der Methode so ein paar Sachen am Array veränderst, veränderst du auch das Array bzw. die Elemente.
 
@tommy: Was du sagst, trifft nicht nur auf primitive Typen zu, sondern AUCH auf Arrays.
In deinem Beispiel änderst du nämlich nur den INHALT des Speicherbereichs und nicht, was in der Variable steht, die auf den Speicherbereich zeigt.


Hier ist ein Gegenbeispiel, wo das passiert:
Java:
  public static void test2(int[] array) {
  array[0]++; //Änderung wird nach außen übernommen, der INHALT des Array wird geändert, nicht die Array-Referenz selbst.
  array = new int[]{5,4,3,2,1};//geht nicht zurück nach außen, die lokale Variable array kriegt einen neuen Speicherbereich, dort wird 5,4,3,2,1 reingeschrieben. Von außen merkt man davon nichts.
  }

Hier ist ein ähnliches Beispiel mit Attributen.
Java:
  public static void test3(Point2D.Double p) {
    p.setX(2);
    p.setY(3);
    p = new Point3D.Double(4,5);
    //An dieser Stelle hat p die Werte 4 und 5, während die von außen sichtbare Variable die Werte 2 und 3 hat.
  }
Kurz: Sobald du <Variablenname> = ...; schreibst, dann kriegt die aufrufende Methode die Änderung nicht mehr mit, egal um welchen Datentyp es sich handelt.
 
Zuletzt bearbeitet von einem Moderator:

Zurück
Oben