Parameteruebergabe

Neue Frage »

Auf diesen Beitrag antworten »
neuling96 Parameteruebergabe

Welche Ausgabe erzeugt das Programm? Begründen Sie Ihre Antwort ausführlich. Geben Sie Ihre Losung in
einer Datei Parameteruebergabe.txt ab.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
public class Parameteruebergabe {
static String a = "A";
static String b = "B";
static String[] ab = { a, b };
public static void swap(String s0, String s1) {
String temp = s0;
s0 = s1;
s1 = temp;
}
public static void swap(String[] s) {
String temp = s[0];
s[0] = s[1];
s[1] = temp;
}
public static void proverb() {
System.out.println("Wer " + a + " sagt, muss auch " + b + " sagen!");
System.out.println("Also muss auch " + ab[0] + " sagen, wer " + ab[1]
+ " sagt?");
}
public static void main(String[] args) {
proverb();
swap(a, b);
proverb();
swap(ab);
proverb();
}
}



Fangen wir mit

proberb(); an

das liefert:
Wer A sagt, muss auch B sagen!
Also muss auch A sagen, wer B sagt?

Problem habe ich hier

swap(a, b);
diese Methode ist def. und macht, aber wie setzte ich mein Programm das ein?

Vermutung:
swap(a, b); greift auf


und liefert

public static void swap(String s0, String s1) {
String temp = s0;
s0 = s1;
s1 = temp;
}

die vertauschung von a und b dann wird auf

proberb();
zugegriffen
und liefert

Wer A sagt, muss auch B sagen!
Also muss auch A sagen, wer B sagt?


soweit, richtig?
 
Auf diesen Beitrag antworten »
eulerscheZahl

Es ist (finde ich) etwas wirr, deine Erklärung zu lesen.
Die Ausgabe ist:
Zitat:
Wer A sagt, muss auch B sagen!
Also muss auch A sagen, wer B sagt?
Wer A sagt, muss auch B sagen!
Also muss auch A sagen, wer B sagt?
Wer A sagt, muss auch B sagen!
Also muss auch B sagen, wer A sagt?

Die ersten beiden Blöcke hattest du ja schon, den 3. hast du nicht erwähnt.

Bei swap(a, b)
wird
code:
1:
2:
3:
4:
5:
public static void swap(String s0, String s1) {
	String temp = s0;
	s0 = s1;
	s1 = temp;
}

aufgerufen. Hier werden zwar Strings vertauscht. Allerdings handelt es sich dabei um lokale Kopien, die nach Beenden der Funktion wieder weg sind.

Wird ein Array übergeben, handelt es sich nicht um eine Kopie, sondern um einen Verweis auf das Array. (Grund ist der, dass sonst mitunter große Datenmengen kopiert werden müssten). Daher zeigt die Vertauschung hier auch Wirkung für den Rest des Programms.
Auf diesen Beitrag antworten »
neuling96

mir wird einfach nicht klar wann man
call by value und call by reference benutzt!
in java ja i.d.r call by value, aber wann reference

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
public static void swap(int[] a , int[] b ) {
	int [] temp = a;
	b= a;
	b[0] = 42;
}
public static void main(String[] args) {
int[] x = new int [] {0,1}
int[] y = new int []  { 2,3}
swap(x,y);


was ist der Inhalt der variablen nach der Ausführung swap(x,y)?

Call of value-> alles bleibt beim alten!?
Auf diesen Beitrag antworten »
eulerscheZahl

Da hast du dir gleich ein kompliziertes Beispiel rausgesucht:
Bei Arrays wird die Adresse übergeben, wo im Speicher sie stehen. Die Adresse wiederum wird aber per-value übergeben.
Ergo: wenn du b= a; schreibst, hat das nur Auswirkung auf die aktuelle Funktion.
Das heißt zum einen, dass b nach der Funktion unverändert vorliegen wird (wir haben keine Speicheradresse mehr von b in spaw, können also nichts mehr reinschreiben).
Zum anderen wird jetzt mit b[0] = 42 das geändert, was der Funktion als a übergeben wurde.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
	int[] a = new int [] {0,1};
	int[] b = new int []  { 2,3};
	swap(a,b);
	System.out.println("a = " + Arrays.toString(a));
	System.out.println("b = " + Arrays.toString(b));

Ausgabe:
a = [42, 1]
b = [2, 3]


Allgemein gilt:
Werte werden mit call-by-value übergeben.
Arrays und Klassen werden mit call-by-reference übergeben, wobei die Reference selbst wiederum ein value ist, was heißt, dass du die reference nicht ändern kannst.
 
Auf diesen Beitrag antworten »
neuling96

kannst du bitte ein bsp/code geben für
"Klassen werden mit call-by-reference übergeben"
Auf diesen Beitrag antworten »
eulerscheZahl

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
public class Main {	
	public Main() {
		MeineKlasse instanz = new MeineKlasse();
		instanz.a = 3;
		System.out.println("a = " + instanz.a);
		changeVal(instanz);
		System.out.println("a = " + instanz.a);
	}
	
	private class MeineKlasse {
		public int a;
	}
	
	public static void changeVal(MeineKlasse instanz) {
		instanz.a++;
	}
	
	public static void main(String[] args) {
		new Main();
	}
}

/*Ausgabe:
a = 3
a = 4
*/

Es wird eine Klasse als Funktionsargument übergeben. Wenn ein Wert in dieser Klasse geändert wird, so hat das auch Gültigkeit für die Funktion, in der die Variable erzeugt wurde.
Auf diesen Beitrag antworten »
neuling96

danke Daumen hoch
Auf diesen Beitrag antworten »
neuling96

Zitat:
Original von eulerscheZahl
Da hast du dir gleich ein kompliziertes Beispiel rausgesucht:
Bei Arrays wird die Adresse übergeben, wo im Speicher sie stehen. Die Adresse wiederum wird aber per-value übergeben.
Ergo: wenn du b= a; schreibst, hat das nur Auswirkung auf die aktuelle Funktion.
Das heißt zum einen, dass b nach der Funktion unverändert vorliegen wird (wir haben keine Speicheradresse mehr von b in spaw, können also nichts mehr reinschreiben).
Zum anderen wird jetzt mit b[0] = 42 das geändert, was der Funktion als a übergeben wurde.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
	int[] a = new int [] {0,1};
	int[] b = new int []  { 2,3};
	swap(a,b);
	System.out.println("a = " + Arrays.toString(a));
	System.out.println("b = " + Arrays.toString(b));

Ausgabe:
a = [42, 1]
b = [2, 3]


Allgemein gilt:
Werte werden mit call-by-value übergeben.
Arrays und Klassen werden mit call-by-reference übergeben, wobei die Reference selbst wiederum ein value ist, was heißt, dass du die reference nicht ändern kannst.


irgendwie macht mir das noch zuschaffen folgendes habe ich im skript gelesen

"Werden statische Variablen von einem Objekt verändert, ist diese
Veränderung auch in allen anderen Objekten der gleichen Klasse
sichtbar"

d.h in diesem bsp würde die statsiche variable vom objekt- verändernd?
Auf diesen Beitrag antworten »
eulerscheZahl

Der zitierte Auszug handelt von einem anderen Thema:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
public class Main {
	public Main() {
		MyClass instanz1 = new MyClass();
		MyClass instanz2 = new MyClass();
		instanz1.printX(); //1
		instanz2.setX(2);
		instanz1.printX(); //2
	}
	
	
	public static class MyClass{
		public static int x = 1;
		
		public void printX() {
			System.out.println(x);
		}
		
		public void setX(int x) {
			MyClass.x = x;
		}
	}
	
	public static void main(String[]args)
	{
		new Main();
	}
}

du siehst: instanz2 hat die Variable geändert, aber instanz1 zeigt plötzlich ein anderes Ergebnis an.
 
Neue Frage »
Antworten »


Verwandte Themen