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.

Previous Article
Next Article

2 Replies to “04.03.03 Methoden”

  1. RolandF

    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

  2. Stefan Kiesel

    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

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.