Die letzten 9 Beiträge |
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. |
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? |
neuling96 |
danke
|
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. |
neuling96 |
kannst du bitte ein bsp/code geben für
"Klassen werden mit call-by-reference übergeben" |
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. |
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!? |
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. |
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? |
|
|