04.03.03 Methoden
this
Die Verwendung von this
ist nicht immer zwingend vorgeschrieben. Eigentlich dient es dazu Attribute, welche von Methodenparametern überdeckt werden, weiterhin ansprechen zu können. Hier einmal ein Beispiel mit unserer Klasse Punkt
.
public class Punkt { private int x; private int y; public void setX(int x) { this.x = x; } public void setY(int aY) { y = aY; } }
Bei der Methode setX(int x)
besitzt der Methodenparameter den gleichen Bezeichner wie ein bereits vorhandenes Attribut der Klasse Punkt
. Verwendet man hier nun kein this.x = x;
, sondern x = x;
, dann arbeiten wir lediglich mit dem Methodenparameter. Durch this.x
wird aber sicher gestellt, dass das Attribut x
der Klasse Punkt
gemeint ist. Wie man dies umgehen kann, sieht man an der Methode setY(int aY)
. Durch Verwendung eines Präfixes kann man das Verdecken eines Klassenattributes durch einen Methodenparameter verhindern. Die Verwendung von this
ist in diesem Fall nicht mehr zwingend notwendig. Aus Gründen der Übersichtlichkeit empfiehlt sich aber dennoch die durchgehende Verwendung von this
. In Kapitel 04.03.08 Konstruktoren sehen Sie wie man this
für den Aufruf von Konstruktoren verwenden kann.
Überladen von Methoden
Ein weitere wichtiger Punkt bei der Erstellung von Methoden ist die Möglichkeit Methoden zu überlagern. Dies wird dadurch erreicht, dass man innerhalb einer Klasse mehrere Methoden mit dem gleichen Bezeichner und Rückgabetyp deklariert, welche sich aber hinsichtlich ihrer Parameterliste unterscheiden.
public class Addition { public int add(int a, int b) { return a + b; } public int add(int a, int b, int c) { return a + b + c; } public static void main(String[] args) { Addition calc = new Addition(); System.out.println(calc.add(2, 3)); System.out.println(calc.add(2, 3, 4)); } }
Die Klasse Addition
enthält zweimal die Methode add()
– einmal jedoch mit zwei und einmal mit drei Parametern. Verwendet man nun die Methode wird entsprechend der Parameterliste die zugehörige Methode ausgewählt. Eine zusätzliche Methode
public String add(int a, int b) { return "" + a + b; }
führt zu einer Fehlermeldung – Duplicate method add(int, int) in type Addition. Hieran kann man erkennen, dass alleine die Änderung des Rückgabewertes bei der Überschreibung einer Methode nicht ausreicht. Es wird immer eine Änderung der Parameterliste gefordert.
Varargs
Nun könnte man für beliebig viele Summanden auch beliebig viele sich überlagernde Methoden schreiben. Dies wird aber recht schnell sehr unübersichtlich. Seit Java 1.5 gibt es aber die Möglichkeit sogenannte varargs zu verwenden.
public int add(int... aNumbers) { int sum = 0; for(int a : aNumbers) { sum += a; } return sum; }
Dieser Methode kann man nun beliebig viele durch Kommata getrennte int Werte mitgeben. Dies entspricht der alten Vorgehensweise ein int
-Array als Parameter zu übergeben (public int add(int[] aNumbers)
).
System.out.println(calc.add(2, 3, 4, 5, 6, 7));
Intern passiert nichts anderes, als dass die Parameterliste bei einem Aufruf in ein entsprechendes int-Array konvertiert wird. Man muss jedoch beachten, dass ein solcher varargs Parameter nur an letzter Stelle innerhalb der Parameterliste stehen darf.
public int method(int... aParameter) //funktioniert public int method(String aString, int... aParameter) //funktioniert public int method(String aString, int... aParameter, double aDouble) //funktioniert nicht public int method(int... aParameter, String aString) //funktioniert nicht
Macht man dies nicht erscheint für vorangegangene Beispiele folgender Fehler:
The variable argument type int of the method add must be the last parameter.
Damit endet das Kapitel zu den Methoden. Weitere wichtige Informationen finden sich unter Kapitel 04.03.05 Sonderfall main, Kapitel 04.03.06 Sichtbarkeitsmodifizierer und Kapitel 04.03.08 Konstruktoren.
Hi Stefan
Es würde die Lesbarkeit erhöhen wenn Referenzen auf die angegebenen Codelistings, die entsprechende Zeilennummer des Codes enthalten…
(dann muss man nicht erst lange suchen)
also statt
1. public int getX()
eben
14. public int getX()
Gruss Roland
Hi Roland,
danke für die Anmerkung/Kritik. Die Codeformatierung wird von einem externen Plugin übernommen. Da wir keinen Einfluss auf die Features haben und damit wir es ggf. leicht austauschen können (gab schon mal Probleme damit), verzichten wir auf solche „Spielereien“.
Gruß
Stefan