11.1.7 Alternative Zuweisung und überladen einer Methode

 

Zuweisung von Alternativen Math.abs(x) ist eine Java-Klassenmethode der Klasse Math,  die den Absolutbetrag des Wertes der Variablen x zurückgibt. Wir wollen diese Methode selber programmieren. Die Variable x soll dabei vom Typ double sein. Ist ihr Wert größer oder gleich 0, so soll absx den Wert von x haben sonst, wenn also der Wert von x negativ ist, soll absx den positiven Wert -x haben. Mit unserem bisherigen Kenntnisstand könnte die Lösung (Auszug) so aussehen.
if (x>=0){
   absx = x;
}
else {
   absx = -x;
}
Download
Betrag1.java
Das Programm
import info1.*;
public class Betrag1 {

  public static void main (String args[]) {
    System.out.print("Geben Sie eine Zahl an: ");
    double x = Console.in.readDouble();
    double absx;
    if (x>=0) absx = x;
    else absx = -x;
    System.out.println(absx);
  }
}

Da in den if- und else- Zweigen nur jeweils eine Anweisung steht, haben wir auf die Blockklammern verzichtet.

Java bietet eine kürzere Variante dieser Routine an:

absx = (x>=0)?x:-x;

Die Syntax dieser Routine (gelb unterlegt) ist 
boolescher Ausdruck?Ausdruck_1TypA:Ausdruck_2TypA  
Falls der boolesche Ausdruck (vor dem ?-Zeichen) mit
true ausgewertet wird, wird der den Ausdruck_1 (zwischen ?-Zeichen und :-Zeichen) ausgewertet Wird er boolsche Ausdruck dagegen zu false ausgewertet, wird der Ausdruck_2 (hinter dem :-Zeichen) ausgewertet. Damit die anschließende Zuweisung funktionieren kann muss diese Variable (hier absx) vom gleichen Typ sein, wie der Wert, zu dem Ausruck_1 bzw. Ausdruck_2 ausgewertet wurde.

 

Download:
Betrag2.java
import info1.*;
public class Betrag2 {

 public static void main (String args[]) {
   System.out.print("Geben Sie eine Zahl an: ");
   double x = Console.in.readDouble();
   double absx = x>=0?x:-x;
   System.out.println(absx);
 }
}

Will man den Betrag nur ausgeben, den seinen Wert also nicht speichern, so kann man auf die Deklaration der Variablen absx verzichten und folgende Ausgabe schreiben:

System.out.printl(x>=0?x:x);

 

Download:
Mathematik.java
Wir können die Berechnung des Absolutbetrags aber auch als Methode schreiben und unserer Klasse Mathematik zufügen:
public static double abs(double x){
   return x>0 ? x : -x;
}

Nun wollen wir aber nicht nur von double-Zahlen den Absolutbetrag bestimmen, sondern auch von int-, long- und float-Zahlen. Wir fügen also drei weitere Methoden unserer Klasse zu:

 

Überladen einer Methode    
public static float abs(float x){
   return x>0 ? x : -x;
}
public static int abs(int x){
   return x>0 ? x : -x;
}
public static long abs(long x){
   return x>0 ? x : -x;
}

Tatsächlich dürfen alle drei Methoden den gleichen Namen tragen. Der Compiler unterscheidet sie in ihrer unterschiedlichen Signatur: ihre Parameterlisten unterscheiden sich in den Typen der übergebenen Werte. Wir sagen: Die Methode abs(...) ist überladen.

 

Vergleich mit Math.abs(..)

Download:
Betrag3.java

import info1.*;
public class Betrag3 {
 public static void main (String args[]) {
   System.out.print("Geben Sie eine Zahl an: ");
   double x = Console.in.readDouble();
   System.out.println(Mathematik.abs(x));
   System.out.println(Math.abs(x));
 }
}

Ersetzt man

double x = Console.in.readDouble();

durch
int
x = Console.in.readInt();

so ergibt sich die neue Ausgabe:

An der Formatierung der Ausgabe erkennt man übrigens auch den Datentyp.

 

zur Startseite

 

www.pohlig.de (C) MPohlig 2003