Informatiker Board (http://www.informatikerboard.de/board/index.php)
- Themengebiete (http://www.informatikerboard.de/board/board.php?boardid=1)
-- Praktische Informatik (http://www.informatikerboard.de/board/board.php?boardid=6)
--- Parameteruebergabe (http://www.informatikerboard.de/board/thread.php?threadid=1991)
Geschrieben von neuling96 am 09.12.2014 um 22:32:
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?
Geschrieben von eulerscheZahl am 10.12.2014 um 14:29:
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.
Geschrieben von neuling96 am 10.12.2014 um 16:09:
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!?
Geschrieben von eulerscheZahl am 10.12.2014 um 16:24:
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.
Geschrieben von neuling96 am 10.12.2014 um 17:30:
kannst du bitte ein bsp/code geben für
"Klassen werden mit call-by-reference übergeben"
Geschrieben von eulerscheZahl am 10.12.2014 um 17:38:
| 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.
Geschrieben von neuling96 am 10.12.2014 um 18:37:
danke
Geschrieben von neuling96 am 19.12.2014 um 17:39:
| 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?
Geschrieben von eulerscheZahl am 19.12.2014 um 18:52:
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.
Forensoftware: Burning Board, entwickelt von WoltLab GmbH