Array wird verändert ohne Rückgabe?

HelloJava

Mitglied
Hallo,
obwohl ich schon lange mit Java gearbeitet habe, ist mir erst jetzt etwas aufgefallen, was ich zuvor nicht für möglich gehalten habe. Das Beispiel ist wie folgt:

Java:
public class ArrayMod{
	
	
	public static void main(String[] args){
		
		int[] array = {1,2,3};
		
		umsortieren( array );
		
		for(int i=0 ; i<array.length ; i++)
		System.out.print(array[i]);
	}
	
	public static void umsortieren(int[] a){
		
		int t = a[1];
		a[1] = a[2];
		a[2] = t;
	}
}

Das Array hat zuerst die Reihenfolge 1,2,3. Danach wird es der Methode umsortieren übergeben, welche zwei Zahlen im Array einfach austauscht. Nun ist es aber so, dass die Methode "umsortieren" das veränderte Array nicht wieder returnt. Wenn ich das Array nach der umsortieren-Methode in der main-Methode wieder ausgebe, ist die Reihenfolge 1,3,2.
Wie ist das möglich? Das Array "array" befindet sich doch in der main-Methode und ist nicht außerhalb als global festgelegt und trotzdem wird es verändert zurückgegeben? Habe ich etwas Grundlegendes missverstanden?

Und warum funktioniert es nicht mit einfachen Zahlen, wie im folgenden Beispiel:

Java:
public class ZahlMod{
	
	
	public static void main(String[] args){
		
		int zahl = 1;
		
		veraendern(zahl);
		
		System.out.print(zahl);
	}
	
	public static void veraendern(int z){
		
		z = 2;
		
	}
}

Hier wird wieder der richtige Wert "1" ausgegeben, wie ich es eigentlich auch beim Array erwartet hätte.
 
Zuletzt bearbeitet:

diggaa1984

Top Contributor
Und warum funktioniert es nicht mit einfachen Zahlen ..

Du hast die Antwort bereits selbst gegeben. Einfach Datentypen werden nicht manipuliert sondern du arbeitest auf einer Kopie mit identischem Inhalt. Da ein Array und alle von Object abgeleitete Typen aber kein einfachen Datentypen sind, kannst du diese als Parameter übergeben und auch die Daten in der Methode manipulieren.
 

DrZoidberg

Top Contributor
Objekte werden in Java immer als Referenz übergeben. Auch Variablen speichern immer eine Referenz auf das Objekt. Bei primitiven Datentypen dagegen werden niemals Referenzen verwendet, da wird der Wert kopiert.
Es heisst in der JLS (Java language specification) zwar, dass Java grundsätzlich immer "pass by value" verwendet und nicht "pass by reference", jedoch handelt es sich bei den Werten in Java meistens um Referenzen.
 
Zuletzt bearbeitet:

Vancold

Aktives Mitglied
Hey!

Wie die Leute vor mir schon gesagt haben liegt es daran was Array für eine Art von Variable ist oder welchen Datentyp es hat.
Es gibt nämlich grob 2 Arten in Java:

1#: Primitive Datentypen
Beispiele: byte, int, short,long, double, char, float usw.

Diese Werte werden abgespeichert an einer Bestimmten Adresse im Speicher.
Wenn du jetzt diese Werte übergibst wird nicht die Adresse sondern der Wert der Variable übergeben.

Das nennt sich call by value.
Der Wert der alten Variable wird sich also nicht verändern, weil nicht mit der Adresse gearbeitet wird wo etwas gespeichert wird.



2#: Objekte & Arrays
Beispiele: int[], String[], Date, JPanel, Object

So bei dieser Art von Datentypen wird nicht mit dem Wert gearbeitet. Es wird die Adresse (Referenz übergeben)
D.h jedes Programmteil arbeitet mit dem selben Objekt wenn du ihm die Referenz gibst.

Stells dir einfach so vor:

Du hast ein Haus und möchtest das jemand für dich dieses Haus renoviert.
Dein Haus ist jetzt ein Objekt. Dieses Objekt hat eine Adresse (Die Schwammerlgasse 17)

Du gehst zu einer Firma die für renovierungen durchzieht.
Du sagst dieser Firma was du brauchst und gibst Ihnen die Adresse.

(D.h Ihre Fähigkeit Häuser zu renovieren ist eine Funktion, die Adresse die Referenz; Das Objekt)
Nun werden sie das Haus renovieren.
Nach Abschluss der Renovierung gehen sie dann einfach (Wir gehen davon aus das du im vorraus gezahlt hast).

Weißt du was ich damit meine?
Sie geben dir das Haus nicht wieder zurück :p


lg

rene
 

HelloJava

Mitglied
Vielen Dank euch allen und inbesondere an Vancold für das schöne Beispiel!

Nun habe ich aber noch eine Frage. Was passiert, wenn ich das ursprüngliche Array bzw. die Reihenfolge wieder brauche? Kann man es irgendwie davor schützen verändert zu werden?


Java:
public class ArrayMod{
    
    
    public static void main(String[] args){
        
        int[] array = {1,2,3};
        
        umsortieren( array );
        
        /*Hier soll wieder die ursprüngliche Reihenfolge ausgegeben werden*/
        for(int i=0 ; i<array.length ; i++)
        System.out.print(array[i]);
    }
    
    public static void umsortieren(int[] a){
        
        int t = a[1];
        a[1] = a[2];
        a[2] = t;
    }
}

P.S. Wie kann ich hier im Forum ein "Danke" vergeben?
 

Vancold

Aktives Mitglied
Hallo!

Nein.
Also schützen nicht.
Den Trick den du dazu benutzen kannst ist das du das ursprüngliche Array speicherst und ein zweites Array machst das umsortiert ist.

UND was ich jetzt sage merke dir!
hier funktioniert int[] newArray = oldArray; // Hier speicherst du die Referenz und das heißt:
// Wenn du eines der beiden änderst ändern sich beide
// Was du willst ist eine Kopie (Klon)

Hier ist der Beispiel code dafür

Java:
public class ArrayMod{
    
    
    public static void main(String[] args){
        
        int[] oldArray   = {1,2,3};              // Array wird deklariert und initialisiert
        int[] newArray = oldArray.clone();   // Hier deklarierst du eine neue Variable und speicherst den INHALT von oldArray in newArray (nicht die Referenz)
        
        umsortieren( newArray ); // Das neue Array wird umsortiert
        
        /*Hier soll wieder die ursprüngliche Reihenfolge ausgegeben werden*/
        for(int i=0 ; i< oldArray.length ; i++) {
          System.out.print(oldArray[i]);
        }
        System.out.println(""); // Hab ich eingebaut das es Zeilenabstand ist zwischen dem Output und dem der IDE
    }
    
    public static void umsortieren(int[] a){
        
        int t = a[1];
        a[1] = a[2];
        a[2] = t;
    }
}

In newArray ist das umsortierte Array (also der Inhalt)
Das ist ein neues Array mit neuer Referenz.

Warum du clone(); aufrufst kann ich dir einfach begründen, weil diese Funktion den Inhalt kopiert aber nicht die Referenz (Das ist was wir wollen).

Hoffe du kennst dich aus damit :)

Ums nochmal zusammenzufassen. Bei Arrays und Objekten wird mit dem = die Referenz übergeben, das heißt jede Veränderungen wird bei beiden Variablen übernommen, da sie beide auf das selbe Array hinweisen.
Willst du den Inhalt kopieren bei Objekten dann benutze .clone();
Dadurch hast du zwei unabhängige Objekte bzw. Arrays : )


LG

Rene


PS: Und zum Beispiel: Wenn dir Firma geht könnte Sie dir z.b etwas geben, das wäre dann der Rückgabetyp. Hoffe du verstehst was ich dir damit sagen will :p

PSS: Wenn du nämlich oldArray mit newArray austausch in der For-Schleife wirst du merken das es klappt :p.
 
Zuletzt bearbeitet:

HelloJava

Mitglied
Vielen Dank, Vancold!

Du kannst wirklich sehr gut erklären und weißt genau, was man noch zusätzlich bedenken sollte! :)
Hast mir sehr geholfen. Das Thema wäre damit erledigt.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Methoden Wieso wird mein Array "a" verändert und meine Variable "a" nicht? Java Basics - Anfänger-Themen 4
L [Verständnisproblem] Array wird trotz void rückgabe verändert. Java Basics - Anfänger-Themen 5
J Warum wird Array durch Methode ohne Rückgabewert verändert? Java Basics - Anfänger-Themen 5
sserio Zweidimensionales Array [][] wird untereinander ausgegeben Java Basics - Anfänger-Themen 14
I Programm erkennt nicht an das Array zurückgegeben wird trotz Initialisierung *einfach* Java Basics - Anfänger-Themen 9
H Array wird als Rückgabewert nicht akzeptiert? Java Basics - Anfänger-Themen 2
A char array wird überschrieben Java Basics - Anfänger-Themen 6
L Iterieren durch eine ArrayList. Integer Array wird übergeben Java Basics - Anfänger-Themen 17
NeoLexx Variable für Array wird nicht korrekt übergeben Java Basics - Anfänger-Themen 45
P Array wird automatisch überschrieben Java Basics - Anfänger-Themen 3
B Gefülltes Array wird mit nullwerten übergeben Java Basics - Anfänger-Themen 9
Bluebird209 Array wird nicht an Methode übergeben Java Basics - Anfänger-Themen 7
E Methoden 2D Array wird in der Methode nicht geändert/gespeichert Java Basics - Anfänger-Themen 5
E Wie wird in Java ein Char-Array terminiert ? Java Basics - Anfänger-Themen 15
D Array wird immer mir 100 für jeden Wert initialisiert? Java Basics - Anfänger-Themen 2
Silvascus Array, der mit dem Namen, der per Methode übergeben wird, erstellt wird Java Basics - Anfänger-Themen 5
C Array wird falsch befüllt? Java Basics - Anfänger-Themen 7
T Array wird überschrieben Java Basics - Anfänger-Themen 4
L Schleifen und Array, nur letzte Eingabe wird ausgegeben Java Basics - Anfänger-Themen 3
S Array wird nicht übernommen NullPointerException Java Basics - Anfänger-Themen 6
D Array Objekt wird überschrieben Java Basics - Anfänger-Themen 3
L Wie wird ein 2 Dimensionales Array befüllt? Java Basics - Anfänger-Themen 6
C Array Aktualisierung wird nicht im Tooltip angezeigt Java Basics - Anfänger-Themen 2
P Datentypen String auf JTextField wird zu Char-Array und anschließend zu int Java Basics - Anfänger-Themen 12
A Array wird nicht durchlaufen Java Basics - Anfänger-Themen 10
F Variablen String-Array wird ungewollt "überschreiben" Java Basics - Anfänger-Themen 7
M Array wird beim Neuaufruf nicht neu initialisiert Java Basics - Anfänger-Themen 9
D Erste Schritte Warum wird bei einem Array die Länge über Length ausgegeben? Java Basics - Anfänger-Themen 6
A Ein Array aus einer Klasse wird nicht sauber abgefüllt Java Basics - Anfänger-Themen 4
A OOP Array wird ohne grund sortiert?! Java Basics - Anfänger-Themen 4
I Array und variable gleicher wert, wird jedoch nicht erkannt Java Basics - Anfänger-Themen 4
B Array-objekte,. Es wird ein Fehler ausgegeben Java Basics - Anfänger-Themen 11
A Array wird überschrieben Java Basics - Anfänger-Themen 5
B Array von Choice wird nicht von getSelectedItem erkannt Java Basics - Anfänger-Themen 3
A Zeichenkette teilen mit Substring oder Char Array Java Basics - Anfänger-Themen 14
A 6. Element aus einem Array zurückgeben Java Basics - Anfänger-Themen 1
A Was bedeutet bei einem Array "int a [MAX][MAX];", Java Basics - Anfänger-Themen 7
T Array verkleinern Java Basics - Anfänger-Themen 2
J Array aus Numberfield Eingaben Java Basics - Anfänger-Themen 7
D Array List mit Objekten sortieren Java Basics - Anfänger-Themen 2
onlyxlia Anzahl Random Zahlen mit Scanner abfragen und in Array speichern Java Basics - Anfänger-Themen 10
Ü Java Array - Buchstaben als Zahlen ausgeben Java Basics - Anfänger-Themen 22
Ü Zweidimensionales Array in der ersten Zeile deklarieren Java Basics - Anfänger-Themen 13
Thomas Uppe 2D Array Reihenfolge vermischen Java Basics - Anfänger-Themen 4
T array auslesen Java Basics - Anfänger-Themen 2
Nitrogames Variablen Variable aus JOptionPane Abfrage in Array einfügen Java Basics - Anfänger-Themen 4
moini Auf Array aus Superklasse zugreifen? Java Basics - Anfänger-Themen 2
J ArrayList in 2D-Array konvertieren. Java Basics - Anfänger-Themen 48
M NullPointerException: Cannot read the array length because "this.Kinder" is null Java Basics - Anfänger-Themen 1
P Wieso kann ich als Index für einen Array einen Char angeben? Java Basics - Anfänger-Themen 3
Finn_lol Fehlermeldung bei Schleife mit Array Java Basics - Anfänger-Themen 4
Proxy Chars vor array übergabe toLowerUpcase Java Basics - Anfänger-Themen 14
iAmFaiinez Primzahlen Tester ohne Array Java Basics - Anfänger-Themen 4
S array 2 dimensional treppe Java Basics - Anfänger-Themen 3
S Array 2x2 Blöcke mit 0 und 1 Java Basics - Anfänger-Themen 10
C Array von Klassen Java Basics - Anfänger-Themen 2
julian0507 2Dim-Array Spaltensummen Java Basics - Anfänger-Themen 1
XWing Doppelte Zahlen im Array Java Basics - Anfänger-Themen 8
melisax Java 2D-Array Tabelle Java Basics - Anfänger-Themen 4
melisax Java Array Wert an bestimmtem Index angeben Java Basics - Anfänger-Themen 14
W Items löschen aus String Array vom Custom Base Adapter Java Basics - Anfänger-Themen 2
Proxy Stack erweitern mit neuem Array falls der alte voll ist!? Java Basics - Anfänger-Themen 5
E Array, nächste Zahl zur 5 ausgeben, wie? Java Basics - Anfänger-Themen 42
J Array.list vergleichen Java Basics - Anfänger-Themen 1
W Java-Code mit Array Java Basics - Anfänger-Themen 14
D Reflections & Generisches Array Java Basics - Anfänger-Themen 4
T Array Java Basics - Anfänger-Themen 2
T Array Java Basics - Anfänger-Themen 15
T Wörteranzahl im Array zählen Java Basics - Anfänger-Themen 9
Ostkreuz Zweidimensionaler Array Index Java Basics - Anfänger-Themen 2
S String Array Buchstaben um einen gewissen Wert verschieben Java Basics - Anfänger-Themen 4
R Images aus einem Array ausgeben Java Basics - Anfänger-Themen 3
R 2d Array individuell machen Java Basics - Anfänger-Themen 4
D 2D Char Array into String Java Basics - Anfänger-Themen 2
J Array Median bestimmen Java Basics - Anfänger-Themen 6
S Array Maximum bestimmen mit for und foreach Java Basics - Anfänger-Themen 7
S Prüfen ob ein zweidimensionales Array rechteckig ist Java Basics - Anfänger-Themen 4
N Array Java Basics - Anfänger-Themen 1
J Array Mittleren Wert bestimmen Java Basics - Anfänger-Themen 2
D OOP Array einem Objekt zuweisen Java Basics - Anfänger-Themen 2
O Zahlen aus einem char-array per char + Zeichen addieren Java Basics - Anfänger-Themen 2
S leeres Array statt Null Pointer Exception ausgeben Java Basics - Anfänger-Themen 20
S Inhalte aus Array vergleichen und Max ausgeben Java Basics - Anfänger-Themen 3
M 2d array ohne längen anlegen Java Basics - Anfänger-Themen 4
S Bestimmte werte aus einem Array löschen Java Basics - Anfänger-Themen 2
S Ausgeben wie oft ein Wert in einem Array vorkommt Java Basics - Anfänger-Themen 7
E Reihenfolge der Werte umdrehen (mittels statischem int-Array Java Basics - Anfänger-Themen 3
O 2 Dimensionales Array Java Basics - Anfänger-Themen 6
M Bubble Sort - Int[] Array sortieren Java Basics - Anfänger-Themen 2
javaBoon86 Array mehrere Dimensionen Java Basics - Anfänger-Themen 10
B Array nach Elementwerten sortieren? Java Basics - Anfänger-Themen 1
B Explizit Array definieren geht nicht? Java Basics - Anfänger-Themen 14
D Kleinste Zahl in Array finden die vorher noch errechnet werden müssen. Java Basics - Anfänger-Themen 4
L Gegebenes Array sortieren, indem zufällige Zahlenpaare aus Array ausgewählt werden Java Basics - Anfänger-Themen 14
Say 2-DIM Array Code lesen und verstehen Java Basics - Anfänger-Themen 5
N Array beim erstellen mit Werten füllen Java Basics - Anfänger-Themen 6
C Java Array Struktur, welche ist wann besser? Java Basics - Anfänger-Themen 12
Temsky34 Array IndexOf nicht verfügbar Java Basics - Anfänger-Themen 18
belana wie am besten 2D Array von String to Integer Java Basics - Anfänger-Themen 18
S Array mit Methode löschen Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben