Parameterübergabe von Methoden verstehen

Vokabulator

Mitglied
So, ich hab grad n Durcheinander, was die Parameterübergabe bei methoden anbelangt. Wäre da für Hilfe dankbar. Mein aktueller Wissensstand:

a) Übergebe ich einen primitiven Datentyp, dann wird der Wert kopiert und er ändert sich nur innerhalb der Methode, es ändert sich nicht der Wert der übergebenen Variable außerhalb der Methode

b) Wenn ich aber ein Array von primitiven Typen übergebe und diesem Array in der Methode neue Werte zuweise, dann habe ich das ursprüngliche Array auch verändert.

Bsp:

Code:
     int[] r = {1,2,3};
		p.methodeArray(r);
		for(int i=0;i < r.length;i++) {
		     System.out.println("R nach Methodenaufruf: "+r[i]);
		}

Code:
	public void methodeArray(int[] array) {
		array[0] = 2;
		array[1] = 3;
		array[2] = 4;
		for(int i=0;i < array.length;i++) {
			System.out.println("R in methode: "+array[i]);
		}
	}

r hat nach Methodenaufruf die Werte 2,3,4 und nicht mehr 1,2,3

c) Wenn ich ein Objekt übergebe, gibt es zwei Möglichkeiten:
1. Ich verändere innerhalb der Methode den Wert des Objektes, was nur so geht:

übergebenesobjekte = new UrsprünglichesObjekt("anderer Parameter");
--> Hier habe ich den Wert von übergebenesobjekt mit einem neuen Objekt derselben Klasse belegt
--> Das heißt: Wert einer Objektreferenz verändern = mit nuem Objekt belegen. Das entspräche einem
Code:
int p = param
bei den primitiven Typen.

2. Ich verändere direkt Eigeschaften des übergebenen Objektes. Diese sind dann dauerhaft geändert, weil ich ja über den Parameter, der den Wert der übergeben Referenz hat, auf den Original-Speicherwert zugreife.

d) Wenn ich ein Objekt-Array übergebe, dann habe ich eine Kombination aus b) und c), d. h. ich kann die Werte des Arrays neu belegen, ich kann aber auch die Eigenschaften der einzelnen, im Array gespeicherten Objekte, dauerhaft verändern.

D. h.
> bei primitiven gilt call by value. Da ich hier aber keine Eigenschaften zu verändern habe, kann ich bei primitiven nur den Wert neu belegen
> bei Referenztypen kann ich den Wert neu belegen oder ich kann auf Eigenschaften zugreifen (und sie dauerhaft verändern)

Fragen:
I) Stimmt das alles so? (Frech, ich weiß :D)
II) Warum ändern sich bei dem int-Array die Werte dauerhaft?

Vielen Dank für Tipps und Erleuchtung!
 

3301

Mitglied
Es kommt letzendlich immer darauf an was du mit den Methoden genau machen willst.
Deine methodeArray vom Typ void gibt keine Werte zurück. Das bedeutet nun, dass die Methode einen Array annimmt und Ihn dann verändert, da er bestimmt statisch in der Klasse definiert wurde.

Wenn Du jetzt aber eine Methode hast wie zum Beispiel "Array Spiegelung", bei der Methode wird auch ein Array angenommen, das Array wird gespiegelt und mit einem return innerhalb der Methode zurückgegeben. Das vorherige übergebene Array bleibt somit gleich.
 

X5-599

Top Contributor
Also im Grunde gibt es bei Java nur Call By Value. Es ist ein bischen verwirrend, wenn man es mit Objekten als Übergabe Parameter zu tun hat. Man könnte den Eindruck bekommen, dass es vielleicht doch Call By Reference gibt.
Nebenbei werden Arrays (egal ob primitiv- oder Referenzdatentypisiert) genau wie Objekte als Übergabe Parameter behandelt.

Beispiel:

Java:
public class CallByTest
{
	static class TestClass
	{
		String attr;
		
		public String toString()
		{
			return attr;
		}
	}
	
	public static void main(String[] args)
	{
		
        TestClass o = new TestClass();
        o.attr = "Attribut A";
        System.out.println(o);
        
        changeOne(o);
        
        System.out.println(o);
	}
	
	public static void changeOne(TestClass o)
	{
		o.attr = "Attribut B";
	}
	
	public static void changeTwo(TestClass o)
	{
		o = new TestClass();
		o.attr = "Attribut C";
	}
}

Zeile 18 gibt aus:
Attribut A

und Zeile 22:
Attribut B

Jetzt könte man meinen: "Das ist doch Call By Reference. Ich habe das ursprüngliche Objekt geändert."
- Jein
Das ursprüngliche Objekt ist geändert worden - Ja
In der changeOne Methode erhalten wir eine "Referenz" auf unser Objekt und ändern eine Eigenschaft. Tatsächlich erhalten wir aber nicht die echte Referenz, sondern nur eine Kopie davon. Alles was an der Kopie geändert wird, wirkt sich auch auf die "echte" Referenz aus. Alles außer: Eine Zuweisung mit einer anderen Referenz.

Das lässt sich nachweisen in dem wir Zeile 20 in changeTwo(o) ändern.

Nun lautet die Ausgabe:
Attribut A
Attribut A

Tada. Wenn wir in der Methode eine echte Referenz auf unser Objekt bekämen, würde sich an Stelle des ursprünglichen Objekts nun ein komplett neues befinden.


Vielleicht ist es Harrspalterei. Aber ich denke es ist schon wichtig zu Wissen, dass es kein echtes Call By Reference in Java gibt. Besonders wenn man schon andere Programmiersprache kennt, wo so etwas existiert.
 
Zuletzt bearbeitet:

Natac

Bekanntes Mitglied
Ich finde Folgendes ist, gerade für den Einstieg, vielleicht leichter zu merken:

  1. Jede Neuzuweisung innerhalb der Methode ist von außen nicht sichtbar. Egal ob primitiv oder Objekt.
    Java:
    void f(Object o, int i){
      o = new Object();
      i = 42;
    }
  2. Jede Operation auf dem Parameter ("."-Operator oder "[]" bei Array) ist nach außen sichtbar. Da dies nur auf Objekten möglich ist (Arrays sind auch Objekte), ist dies mit Primitiven Typen nicht möglich.
    Java:
    void f(MyObject mo, int[] array){
      mo.value = 5;
      array[0] = 7;
    }

Natürlich hat X5-599 das sehr viel genau erklärt, aber mir gings eher darum, dass du durchsteigst (@TE). Warum dem dann so ist, dafür kannst du dir gerne X5-599 Erklärung durchlesen. ;)
 

G4ruDA

Mitglied
Hallo,
ich habe das jetzt nicht wirklich verstanden mit dem call by reference. Ich dachte, dass es sowas doch in Java gar nicht wirklich gibt.

Ich fasse mal zusammen wie ich es hier verstanden habe:

call by reference funktioniert nur bei Objekten / Arrays die man im Parameter übergibt und dessen Werte man in der Methode (quasi direkt an der Referenz) verändert.

Meine Frage: ich deklariere eine Methode

Java:
public int verändern ( int x, TestClass objekt) {
      do something...

habe damit call by value und call by reference kombiniert? Laut der erklärung von x5-599 müsste das so stimmen
 

G4ruDA

Mitglied
ah nun hab ich es auch verstanden...

könnte man aber beides quasi kombinieren? Call by Value und "Call by Reference" so wie ich es in meinem vorherigen Beitrag erwähnt habe?
 
Zuletzt bearbeitet:

Fohnbit

Top Contributor
Ein interessantes Thema.
Möchte mich mit einer Frage anschließen:
Erzeuge eine Instanz einer Klasse. Im Constructor übergebe ich ein Bytearray.
Mittels this.arr = arr; im construcot halte ich das Array solange das Objekt existiert.

Jedoch verweise ich damit auf das existierende und benötige keinen Zusätzlichen Speicher.

Hätte ich nun Methoden und Klassen, die mit Teilen des Bytearray arbeiten, wäre es Sinnvoller, die Referenz + 2 Integer werten für Start,Ende zu nutzen als ein Arraycopy?

Was passiert aber wenn man einen Thread startet und während der Thread läuft, das original Array zerstört wird?

Danke!
 

JavaMeister

Gesperrter Benutzer
Ausprobieren!??

1. verstehe ich nicht, was du meinst.

2. ohne weiteres kann das array nucht zerstört werden.

Aber beachte, dass die referenzen aus dem objekt nicht kopiert werden. modifikationen an xem objekt also an seinen attributen wirken sich fur alle aus.

Deswgen meint man, dass es call by reference gibt. Ist aber. nicht so.
 

Fohnbit

Top Contributor
Hallo!

Also ich wüßte nicht wie ich die Speicherauslastung ausprobieren könnte!

Ich arbeite gerade an der Zerlegung eines seriellen Protokolls.
Ich erhalte ein Bytearray mit etwa 30-50 bytes.

Ich habe meine Klassen so aufgeteilt, das diese logisch dem Protokoll zugrunde liegen:
Header
Data
OptionalData
...

Was ich meinte:
Ich könnte mittels Arraycopy immer den passenden Teil aus dem Protokoll den Klassen zur Verfügung stellen. Denn die anderen Bytes müssen die nicht kennen.
Oder ich übergebe das ganze Array und gib noch Anfang und Ende der jeweiligen Informationen im Array mit.
So kann jede Klasse aus dem ursprünglichen grossen Array herausholen, da die Klassen Start und Ende im Array kennen.
 


Schreibe deine Antwort... und nutze den </> Button, wenn du Code posten möchtest...
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Methoden Parameterübergabe Java Basics - Anfänger-Themen 4
E Einfache Frage zur Parameterübergabe in Methoden Java Basics - Anfänger-Themen 8
C System.out.println - Parameterübergabe funktioniert nicht Java Basics - Anfänger-Themen 2
P Parameterübergabe, von Methode zu Methode zu main Java Basics - Anfänger-Themen 4
J Parameterübergabe in switch? Java Basics - Anfänger-Themen 2
W Was bedeutet im Struktogramm „zufall“ aufrufen (keine Parameterübergabe)? Java Basics - Anfänger-Themen 8
M Methode Objekt als Parameterübergabe Java Basics - Anfänger-Themen 6
B Parameterübergabe in main Java Basics - Anfänger-Themen 1
E Erste Schritte Parameterübergabe - Prozentrechner Java Basics - Anfänger-Themen 5
S Parameterübergabe zwischen zwei Programme Java Basics - Anfänger-Themen 4
Joew0815 Parameterübergabe Java Basics - Anfänger-Themen 3
Q Parameterübergabe - Objekt - Referenz Java Basics - Anfänger-Themen 5
K Parameterübergabe im Terminal(Linux) Java Basics - Anfänger-Themen 8
P Java-Konsolenanwendung mit Parameterübergabe (Windows) Java Basics - Anfänger-Themen 3
X Parameterübergabe per Reflection Java Basics - Anfänger-Themen 10
H Parameterübergabe Java Basics - Anfänger-Themen 4
X Parameterübergabe Java Basics - Anfänger-Themen 6
S Parameterübergabe - identische Funktionen, aber falsche Funktion Java Basics - Anfänger-Themen 5
K Input/Output switch case - Parameterübergabe args[0] Java Basics - Anfänger-Themen 34
A Parameterübergabe zwischen statischen und nicht statischen Klassen Java Basics - Anfänger-Themen 6
L Parameterübergabe Java Basics - Anfänger-Themen 6
K Parameterübergabe Java Basics - Anfänger-Themen 3
W Parameterübergabe Java Basics - Anfänger-Themen 9
Y Probleme mit Parameterübergabe Java Basics - Anfänger-Themen 8
O Parameterübergabe mit RadioButtons Java Basics - Anfänger-Themen 2
V Return - JA/NEIN - Parameterübergabe Array (Referenz) Java Basics - Anfänger-Themen 7
G Parameterübergabe über mehrer Klassen Java Basics - Anfänger-Themen 2
S parameterübergabe Java Basics - Anfänger-Themen 5
M Parameterübergabe an *.jar Java Basics - Anfänger-Themen 5
M Parameterübergabe an externe JAR-Datei? Java Basics - Anfänger-Themen 2
B Frage zu Code (Parameterübergabe) Java Basics - Anfänger-Themen 14
S Parameterübergabe: Generische Klasse Java Basics - Anfänger-Themen 4
B printf() mit Parameterübergabe? Java Basics - Anfänger-Themen 2
G Parameterübergabe als Referenz bzw. als Kopie Java Basics - Anfänger-Themen 4
G Java Applikation ein Programm mit Parameterübergabe starten Java Basics - Anfänger-Themen 3
V doPost parameterübergabe funktioniert nicht. Java Basics - Anfänger-Themen 5
G Problem bei Parameterübergabe Java Basics - Anfänger-Themen 2
T Runtime.getRuntime().exec mit parameterübergabe Java Basics - Anfänger-Themen 16
roflomfg Parameterübergabe in in "*.jar" files möglich? Java Basics - Anfänger-Themen 8
F Rekursive Aufrufe, Parameterübergabe, call by reference Java Basics - Anfänger-Themen 3
D probleme bei der Parameterübergabe Java Basics - Anfänger-Themen 12
M Parameterübergabe Java Basics - Anfänger-Themen 7
J Nested Layouts - Parameterübergabe bei ActionListener Java Basics - Anfänger-Themen 2
M Parameterübergabe! Java Basics - Anfänger-Themen 4
M Probleme bei Parameterübergabe in Rekursion Java Basics - Anfänger-Themen 5
K Parameterübergabe bei quickSort Java Basics - Anfänger-Themen 6
G Parameterübergabe bei Runtime.getRuntime().exec Java Basics - Anfänger-Themen 16
J parameterübergabe arraylist Java Basics - Anfänger-Themen 9
D args und parameterübergabe Java Basics - Anfänger-Themen 8
D Parameterübergabe mit JSP Java Basics - Anfänger-Themen 2
I Parameterübergabe beim Aufruf in der Kommandozeile Java Basics - Anfänger-Themen 4
B Parameterübergabe und return; Java Basics - Anfänger-Themen 3
F Performanceverlust bei ständiger Parameterübergabe? Java Basics - Anfänger-Themen 4
K Parameterübergabe Java Basics - Anfänger-Themen 5
R Parameterübergabe Java Basics - Anfänger-Themen 13
H Parameterübergabe zwischen einzelnen Funktionen Java Basics - Anfänger-Themen 4
R Klassen Anonyme Klassen: Zugänglichkeit neuer Methoden Java Basics - Anfänger-Themen 2
DrahtEck Methoden Methoden und Werte Java Basics - Anfänger-Themen 10
emreiu Methoden Rekursive Methoden Runter- & Hochzählen Java Basics - Anfänger-Themen 2
U Funktionale Interfaces mit mehreren abstrakten Methoden? Java Basics - Anfänger-Themen 8
MoxMorris Einige Methoden aus verschiedenen Klassen nacheinander auszuführen läuft seltsam Java Basics - Anfänger-Themen 2
J Argumente in Methoden übergeben Java Basics - Anfänger-Themen 1
XWing Methoden rückgabe Problem? Java Basics - Anfänger-Themen 6
Say Class scope und Instance scope und Getter nur selbstgeschrieben Methoden Java Basics - Anfänger-Themen 11
I Gleiche Klassen und Methoden in unterschiedlichen Projekten nutzen Java Basics - Anfänger-Themen 2
N Klassen Methoden anderer Klassen aufrufen Java Basics - Anfänger-Themen 4
Renjiroo Java Bmi Rechner mit Methoden Java Basics - Anfänger-Themen 4
frager2345 Thread - Methoden synchronized deklarieren Java Basics - Anfänger-Themen 10
M Designentscheidung von Attributen/Methoden im Falle von Vererbung Java Basics - Anfänger-Themen 8
berserkerdq2 Findet eine parallele Verarbeitung in Java bei Threads erst statt, wenn man die Methoden auch synchronized? Und wie sieht bei Conditions aus? Java Basics - Anfänger-Themen 8
Alen123 Erstes Arbeiten mit Methoden. Java Basics - Anfänger-Themen 5
berserkerdq2 Zwei Klassen Erben von der Klasse A, die eine Klasse kann ich an Methoden übergeben, die als Parameter A haben, die andere nicht? Java Basics - Anfänger-Themen 3
M Andere Methoden in anderen Klassen aufrufen Java Basics - Anfänger-Themen 11
L Methoden in anderen Klassen nutzen Java Basics - Anfänger-Themen 6
D Gerade oder ungerade Zahl mittels Methoden Java Basics - Anfänger-Themen 13
M Erklärung von Ausnahmebehandlung in Methoden Java Basics - Anfänger-Themen 13
S Methoden 2 non-static Methoden, trotzdem Fehler "non static method can not be referenced from a static context" Java Basics - Anfänger-Themen 9
L Rekursive Methoden Java Basics - Anfänger-Themen 14
X Wie erreiche ich, dass ein Robot weitere Attribute hat, die nicht materialisiert sind, sondern nur über get/ set-Methoden simuliert sind? Java Basics - Anfänger-Themen 1
C Problem mit mehreren Methoden + Scanner Java Basics - Anfänger-Themen 5
R Frage zu Methoden (Rückgabewert u. ohne.) Java Basics - Anfänger-Themen 2
W Verschiedene Methoden in einer Klasse in der Main aufrufen? Java Basics - Anfänger-Themen 8
W Methoden aufrufen - auch klassenübergreifend? Java Basics - Anfänger-Themen 9
Kotelettklopfer Methoden nicht aufrufbar Java Basics - Anfänger-Themen 34
R Schulaufgabe, Bruache Hilfe mit non-static Methoden Java Basics - Anfänger-Themen 2
S Vererbung Abstrakte Methoden: Wozu das Ganze?! Java Basics - Anfänger-Themen 7
S abstrakte methoden in subclass? Java Basics - Anfänger-Themen 7
S Methoden - Warum int wenn auch void? Java Basics - Anfänger-Themen 3
H Kann man Methoden öfter aufrufen? Java Basics - Anfänger-Themen 2
CptK Interface Functional interface mit mehreren Methoden Java Basics - Anfänger-Themen 6
P Objekt in mehreren Methoden verwenden. Java Basics - Anfänger-Themen 3
M Aufruf von statischen Methoden einer anderen Klasse Java Basics - Anfänger-Themen 15
lougoldi Verkettung von Methoden und Konstruktoren Java Basics - Anfänger-Themen 4
Zeppi OOP Methoden mit einander Verknüpfen Java Basics - Anfänger-Themen 6
A Löschen von Leerzeichen in einem char array ohne methoden Java Basics - Anfänger-Themen 6
A Parametar übergabe zwischen Methoden Java Basics - Anfänger-Themen 26
D Methoden nach einer bestimmten Reihenfolge ausführen. Java Basics - Anfänger-Themen 20
P Wie rufe ich Methoden mit einer Referenz auf eine Klasse||Objekt auf Java Basics - Anfänger-Themen 4
O Attribute die Methoden zählen Java Basics - Anfänger-Themen 5
M Bräuchte Hilfe bei diesen Methoden Java Basics - Anfänger-Themen 4

Ähnliche Java Themen


Oben