Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
public class tst {
public static void main(String[] args) {
// TODO Auto-generated method stub
int m = 1;
int[] n = { 1 };
mod(m, n);
System.out.println(m);
}
static void mod(int a, int[] b) {
a = 2;
b[0] = 0;
}
}
Kann mir vielleicht jemand erklären warum nach dem Methodenaufruf mod das m nicht zu einer 2 wird sondern bei der 1 bleibt. Das n Array verändert sich ja auch.
Kann mir vielleicht jemand erklären warum nach dem Methodenaufruf mod das m nicht zu einer 2 wird sondern bei der 1 bleibt. Das n Array verändert sich ja auch.
In Java gilt grundsätzlich call by value. int ist ein primitiver Typ. Hier wird also eine Kopie des Wertes übergeben. Ein Array ist ein Referenztyp - hier wird eine Kopie der Speicheradresse des Arrays übergeben.
Ich habe doch noch eine Frage zu dem Thema. Das obige Beispiel ist ja eine Klassenmethode. Kann es sein, dass wenn ich die Funktion mod eine Objektmethode gewesen wäre, also an einer Instanz ausgeführt worden wäre, dass m in diesem Fall direkt eine 2 geworden wäre? Ich habe nämlich nun folgenden Code:
Java:
Bruch(int z, int n) { //Klasse
zaehler = z;
nenner = n;
}
void multipliziere(int f) {
zaehler*=f;
nenner*=f;
}
public static void main(String[] args) { //main
// TODO Auto-generated method stub
Bruch b = new Bruch(-3, 4);
b.multipliziere(4);
System.out.println(b.zaehler);
Was mich hier nun gewundert hat war die Tatsache, dass bei b.zaehler -12 rauskommt da ja mit 4 multipliziert wird. Hängt dies damit zusammen, dass mit der Objektmethode multiplizieren die Multiplikation quasi direkt in der Instanzvariable (b.zaehler) gespeichert wird? Denn aufgrund des Call by Value Prinzips wird ja bei einer Methodenausführung eine "Kopie" erstellt, welche nach Beendigung der Methode ja erlischt (deswegen wird im obigen Beispiel nach der mod Methode das m ja auch nicht verändert sondern bleibt bei der 1), sofern man die Änderung nicht in einer neuen Variable speichert. Ist meine Annahme richtig, dass dies der Unterschied zwischen Objekt und Klassenmethoden ist (abgesehen davon, dass bei Klassenmethoden keine Instanz für die Ausführung der Methode benötigt wird)?
Erstens:
Call by Value bezieht sich auf den Methodenaufruf. Da spielt es keine Rolle, ob es sich um eine Klassen- oder eine Objektmethode handelt, es wird immer ein Wert als Kopie an die Methode übergeben. Das hat einfach zur Folge, dass der Wert des Parameters in der Methode zwar geändert werden kann, diese Änderung sich aber nicht auf die aufrufende Stelle auswirkt.
Hängt dies damit zusammen, dass mit der Objektmethode multiplizieren die Multiplikation quasi direkt in der Instanzvariable (b.zaehler) gespeichert wird?
Ja. Beim Erzeugen des Objekts werden die Werte -3 und -4 an den Konstruktor übergeben und dort den Instanzvariablen zaehler und nenner zugewiesen. Die Objektmethode ändert den Wert dieser Variablen um den Faktor f.
Ist meine Annahme richtig, dass dies der Unterschied zwischen Objekt und Klassenmethoden ist (abgesehen davon, dass bei Klassenmethoden keine Instanz für die Ausführung der Methode benötigt wird)?
Nein. Es geht einfach darum, dass der übergebene Wert gespeichert wird. Als Speicher könnte man auch Klassenvariablen verwenden - sollte man aber nicht machen. Bei Instanzvariablen erhält jedes erzeugte Objekt seinen eigenen "Satz" an Variablen. Klassenvariablen gelten für die Klasse. Man braucht kein Objekt dazu und dem entsprechend teilen sich auch alle Objekte die gleiche Variable.
Okay vielen Dank, zumindest lag ich dann in der Annahme richtig, dass die Multiplikation mit dem Faktor f direkt in der Instanzvariable gespeichert wird, das beruhigt mich 😄
Neben der Frage, was da passiert, die @mihe7 bereits beantwortet hat, möchte ich noch feststellen, dass die Methode "multipiziere" falsch implementiert ist; so, wie sie implemnetiert ist, müsste sie "erweitere" heißen.