Methoden Verständnis

Thomaskloea

Mitglied
Guten Tag,

Mir fällt das grundsätzliche Vertändnis von Methoden noch schwer.

Ich beschreibe mal wie ich das sehe und vielleicht hilft/korrigiert jemand:
Die Methode geteilt(3/y, x++) wird aufgerufen, ergo werden die Parameter in die Methode geteilt übertragen und 3/y wird der Wert für int x und xüü wird der Wert für int y.

Soweit so richtig?

Jetzt wird in der geteilt Methode gerechnet: x=x/y

Also x = 3/y / x++ bzw. 3/2 / x++

Was passiert jetzt aber mit dem x++? Für die Berechnung des x in der Methode bleibt x=8 oder?

Also x = 3/2 / 8

Stimmt das? und dann wird der Wert x um eins erhöht? Also das Ergebnis aus der Rechnung davor eine Zeile hiervor oder meine gesetzte x variable die ich auch als Parameter übertragen habe?

Vielen lieben Dank!


Javascript:
public class Aufgabe {
public static void main(String[] args) {
int y = 2;
int x = 2 + 2 * y;
int ergebnis = geteilt(3 / y, x++) + geteilt(y + 1, 2);
System.out.println(x);
System.out.println(ergebnis);
}
public static int geteilt(int x, int y) {
x = x / y;
return x;
}
}
 
K

kneitzel

Gast
Also bei dem Aufruf wird der Parameter x auf 3/y gesetzt und der Parameter y bekommt x zugewiesen.

Generell sind die Parameter call by Value, d. h. die veränderten Werte wirken sich nicht auf die Parameter aus.

x++ bedeutet, dass erst x genommen wird. Wenn die eigentliche Operation fertig ist, wird x erhöht.
bei ++x wäre es umgekehrt. Da würde erst x erhöht und dann der Wert übergeben.
==> Das ist etwas, das man wissen sollte, aber so Code sollte man nie schreiben. Damit es gut lesbar ist, sollte man pro Zeile nicht mehrere Sachen machen. Also statt f(x++) schreibt man erst f(x) und dann x++ auf der zweiten Zeile.
 

Thomaskloea

Mitglied
Danke. Was x++ grundsätzlich bewirkt, ist mir verständlich.

Aber wann wird der x wert denn erhöht? Also die Rechnung in der geteilt Methode von x = x / y findet statt mit x = 3/2 / 8;
und dannach müsste x ja erhöht werden, richtig? Wird also dann das ergebnis der Rechnung um 1 erhöht?
 
K

kneitzel

Gast
Du wirfst einiges durcheinander! Einfach einmal den Code mit Kommentaren von mir - da verstehst Du hoffentlich, was abgeht:
Code:
public class Aufgabe {
public static void main(String[] args) {
int y = 2;  // lokale Variable y, wird auf 2 gesetzt. y := 2.
int x = 2 + 2 * y; // lokale Variable x - wird auf 6 gesetzt (2 + 2*2)! x := 6 (nicht 8!)

int ergebnis = geteilt(3 / y, x++) + geteilt(y + 1, 2);
// Hier wird jetzt ausgewertet von links nach rechts:
// -> ergebnis (3/2, 6) + geteilt(2+1, 2) sind die Aufrufe. Danach wird x erhöht.
// 3/2 = 1, 1/6 = 0 (Da Integer!), 3/2 = 1. 0+1 = 1 daher: ergebnis := 1
// Da x++ wird x noch erhöht, d.h. x:=7

System.out.println(x);  // 7
System.out.println(ergebnis); // 1
}
public static int geteilt(int x, int y) {
x = x / y;
return x;
}
}
 

Thomaskloea

Mitglied
achso, danke! Ich hatte es zuerst zusammengefasst.

Das return x liefert ja den x wert zurück in die Zeile mit dem int = Ergebnis, ja?

Wie kann ich aber nachvollziehen, dass das erhöhen von x um 1 wegen dem x++ zum Wert int x = 6 dazugezählt wird?

Das x++ ist doch nur ein Parameter, welcher in die Methode übertragen wird.

Oder besagt das x++ als Parameter in der Main, dass quasi zuerst das x normal in die methode übergeben wird und nach dem durchlaufen der Methode, wird int x um 1 erhöht?
 

LimDul

Top Contributor
Was dir glaub ich im Verständnis fehlt - das x in der geteilt Methode hat gar nix mit dem x in der main Methode zu tun.

Java:
public class Aufgabe {
public static void main(String[] args) {
  int y = 2;
  int x = 2 + 2 * y;
  int ergebnis = geteilt(3 / y, x++) + geteilt(y + 1, 2);
  System.out.println(x);
  System.out.println(ergebnis);
}
public static int geteilt(int a, int b) {
  int c = a / b;
  return c;
}
}
Das heißt, vor dem ersten Aufruf von geteilt hat x den Wert 6 - danach den den Wert 7 - egal was in der geteilt Methode passiert (Exceptions mal ausgenommen - da wüsste ich gerade auch nicht 100% was passiert)
 
K

kneitzel

Gast
Egal was passiert. In Java ist alles Call By Value. Daher werden Werte vor dem Aufruf der Methode kopiert. Egal was in der Methode passiert: Der Inhalt der Variablen, aus denen die Werte kopiert wurden, ist immer unverändert. Auch bei Exceptions und so.
 

mihe7

Top Contributor
Oder besagt das x++ als Parameter in der Main, dass quasi zuerst das x normal in die methode übergeben wird und nach dem durchlaufen der Methode, wird int x um 1 erhöht?
Richtig.
x++ = liefert den Wert von x vor dessen Erhöhung
++x = liefert den Wert von x nach dessen Erhöhung

D. h. würde man
Code:
int x = 10;
int y = x++;
int z = ++x;
ausführen, dann wäre y == 10 und z == 12.
 

mihe7

Top Contributor
Vielleicht nochmal im Zusammenhang:
Java:
 1 public class Aufgabe {
 2     public static void main(String[] args) {
 3         int y = 2;
 4         int x = 2 + 2 * y;
 5         int ergebnis = geteilt(3 / y, x++) + geteilt(y + 1, 2);
 6         System.out.println(x);
 7         System.out.println(ergebnis);
 8     }
 9     public static int geteilt(int x, int y) {
10         x = x / y;
11         return x;
12     }
13 }

Wir rufen auf: java Aufgabe, d. h. die Java Virtual Machine wird gestartet und springt in die statische main-Methode der Klasse Aufgabe.

In Zeile 3 wird eine lokale Variable y vom Typ int deklariert und mit dem Wert 2 initialisiert.
In Zeile 4 wird eine lokale Variable x vom Typ int deklariert und mit dem Wert initialisiert, der sich durch den Ausdruck 2+2*y ergibt. Dazu wird zunächst 2*y berechnet (Punkt vor Strich), was 4 ergibt, anschließend wird 2+4 gerechnet, was insgesamt 6 ergibt. Die 6 wird abschließend der Variablen x zugewiesen.

In Zeile 5 wird eine lokale Variable ergebnis vom Typ int deklariert und mit dem Wert initialisiert, der sich durch den Ausdruck geteilt(3/y, x++) + geteilt(y+1,2) ergibt.

Bevor die Addition durchgeführt werden kann, müssen die Werte der Teilausdrücke berechnet werden, d. h. geteilt(3/y, x++) und geteilt(y+1,2) - und zwar in der Reihenfolge (grundsätzlich von links nach rechts).

Also wird erstmal geteilt(3/y, x++) berechnet. Hier gibt es wieder zwei Teilausdrücke, nämlich 3/y und x++. Dabei wird 3/y zu 3/2, was - wegen ganzzahliger Division - 1 ergibt. Für das x++ wird x verwendet (gleichzeitig wird x erhöht).

D. h. geteilt(3/y, x++) wird zu geteilt(1, 6). Die beiden Werte werden nun als Kopie an geteilt übergeben.

Die Methode geteilt hat zwei Parameter x und y, die haben mit den Variablen aus main nichts zu tun, auch wenn ihre Namen gleich lauten. Vielmehr werden diese Parameter bei jedem Aufruf als eine Art lokaler Variablen der Methode geteilt eingerichtet.

In Zeile 10 wird nun x/y berechnet, also 1/6 und das Ergebnis (0) der lokalen Variablen x zugewiesen. In Zeile 11 wird der Wert der lokalen Variablen zurückgegeben.

Zu dem Zeitpunkt haben wir in Zeile 5: 0 + geteilt(y+1,2). Bevor wir die Addition durchführen können, müssen wir wissen, was geteilt(y+1, 2) ergibt. Gleiches Spiel wie vorhin: wir haben zwei Teilausdrücke, nämlich y+1 und 2. Die werden ausgewertet, so dass geteilt(3, 2) aufgerufen wird.

In Zeile 10 wird wieder x/y berechnet, also 3/2 und das Ergebnis (1) der lokalen Variablen x zugewiesen. In Zeile 11 wird der Wert der lokalen Variablen zurückgegeben.

Zu dem Zeitpunkt haben wir in Zeile 5: 0 + 1 stehen. Jetzt kann die Addition durchgeführt und der Variablen ergebnis zugewiesen werden.

In Zeile 6 wird nun x (lokale Variable der Methode main) ausgegeben. Die wurde zuvor um 1 erhöht (x++), so dass deren Wert nun 7 ist.

In Zeile 7 wird abschließend noch der Wert von ergebnis, also 1, ausgegeben.

Ich hoffe, mich nirgends verhauen zu haben :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Java Verständnis Problem Methoden etc. Java Basics - Anfänger-Themen 22
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
G Methoden Methoden mit versch. Datentypen Java Basics - Anfänger-Themen 1
T Ich habe eine Variabel die nicht Methoden übergreifend ist. Kann mir jemand Helfen :) Java Basics - Anfänger-Themen 5
Junger_Basileus Celsius -> Fahrenheit / Strukturierung in statischen Methoden Java Basics - Anfänger-Themen 7
J Verschachtelte Methoden Java Basics - Anfänger-Themen 9
H Methoden in anderen Methoden aufrufen Java Basics - Anfänger-Themen 6
Kawastori Hilfe bei Methoden Übung Java Basics - Anfänger-Themen 6
veryck Methoden Rekursive Methoden mit Rückgabeparameter Java Basics - Anfänger-Themen 9
C Methoden können nicht auf Instanzvariable der Klasse zugreifen Java Basics - Anfänger-Themen 3
P Methoden aufrufen - Fehler Java Basics - Anfänger-Themen 20
M konzeptuelle Frage: In welcher Klasse definiert man am Besten Methoden, die die Kommunikation mit dem User regeln? Java Basics - Anfänger-Themen 8
C eigene Methoden erstellen (Instanzmethoden) Java Basics - Anfänger-Themen 7
P Klasse hat keinen Zugriff auf getter/setter-Methoden eines Objektes Java Basics - Anfänger-Themen 9
B Methoden Methoden haben kein Zugriff auf variablen Java Basics - Anfänger-Themen 4
M Gettter/Setter Methoden Klassenfelder kapselung und zugriff? Java Basics - Anfänger-Themen 1
C Fernseher-Aufgabe (Methoden, Klassen und Objekte) Java Basics - Anfänger-Themen 63
C Taschenrechner (switch) in Taschenrechner mit Methoden umwandeln Java Basics - Anfänger-Themen 115
H Methoden in großen Klassen gruppieren oder auslagern? Java Basics - Anfänger-Themen 10
G Generics Methoden Java Basics - Anfänger-Themen 7
L Test-Methoden schreiben Java Basics - Anfänger-Themen 13
S throws bei Methoden Java Basics - Anfänger-Themen 4
L Best Practice Code Refactoring für Methoden mit fast gleicher Aufbau Java Basics - Anfänger-Themen 6
I Greedy Methode Methoden nutzen Java Basics - Anfänger-Themen 3
C Methoden-Parameter ist Interface Java Basics - Anfänger-Themen 5
A Klassen und methoden Java Basics - Anfänger-Themen 15
S Übergabe von Arrays an Methoden Java Basics - Anfänger-Themen 20
L Methoden Wie Löse ich ext Methoden Aufruf Fehler? Java Basics - Anfänger-Themen 3
A Bankweverwaltung mit Klassen und Methoden Java Basics - Anfänger-Themen 14
B Methoden Ausgeben Aufgabe Java Basics - Anfänger-Themen 15
M Aufsplitten von Methoden in andere Klassen Java Basics - Anfänger-Themen 2
M Feste Reihenfolge von dem Ablauf von Methoden Java Basics - Anfänger-Themen 7
G Java Abstrakte Methoden Java Basics - Anfänger-Themen 2
N Klassen Warum kann meine Klasse nicht auf Methoden der anderen Klasse zugreifen? Java Basics - Anfänger-Themen 6
Ich lerne Java. Methoden Mehrere Methoden mit Punkt Java Basics - Anfänger-Themen 45
Kirby.exe Methoden Aufrufe Java Basics - Anfänger-Themen 4
G Objekte in Methoden? Java Basics - Anfänger-Themen 13
W OOP Warenlager mit Array(Konstruktor, Methoden) Java Basics - Anfänger-Themen 39
B Variablen von Methoden übertragen Java Basics - Anfänger-Themen 2
M Unterklasse soll nicht alle Methoden erben Java Basics - Anfänger-Themen 3
Curtis_MC Parameter-Übergabe bei Klassen und Methoden Java Basics - Anfänger-Themen 12
H Aufruf von Methoden durch Methoden Java Basics - Anfänger-Themen 3
W Methoden Verständnisfrage Vererbung von Methoden Java Basics - Anfänger-Themen 14
H Wie kann ich durch Methoden definiren? Java Basics - Anfänger-Themen 8
D Methoden Scannervariablen in static Methoden Java Basics - Anfänger-Themen 5
P Verzweigungen und Methoden Java Basics - Anfänger-Themen 10
C Methoden/Klassen Übergabewerte Java Basics - Anfänger-Themen 8
B Methoden Mehrere ähnliche Methoden zusammenfassen Java Basics - Anfänger-Themen 24
C Java Klassen/Methoden/Übergabeparameter Java Basics - Anfänger-Themen 4
C Java Methoden "Parameter" Problem Java Basics - Anfänger-Themen 16
B Polymorphie Warum funktionieren polymorphe Referenzvariablen bei überschriebenen Methoden und bei nicht überschriebenen nicht? Java Basics - Anfänger-Themen 3
B Methoden Java Basics - Anfänger-Themen 1
T Körper Brechnung - Lokale Variablen in Methoden übergeben Java Basics - Anfänger-Themen 10
P Methoden richtig anwenden Java Basics - Anfänger-Themen 3
C Zusammenfassen von Methoden in einer Hilfsmethode Java Basics - Anfänger-Themen 19
A Methoden Serialisieren Java Basics - Anfänger-Themen 17
N JUnit und private Methoden testen. Java Basics - Anfänger-Themen 9
H Datenkapselung (get und set Methoden) Java Basics - Anfänger-Themen 2
H if bedinung in methoden umändern Java Basics - Anfänger-Themen 33

Ähnliche Java Themen

Neue Themen


Oben