Advanced   Java   Services Erster Kontakt mit Klassen Back Next Up Home

Klassen als Funktionsbibliotheken

Ein bekannter Spruch bei Programmieren lautet "Man muß das Rad nicht neu erfinden". Das bedeutet, man will auf Programme zurückgreifen, die bestimmte Teilprobleme lösen, die immer wieder vorkommen und für die bereits Lösungen existieren. Schon vor der Objektorientierung gab es sogenannte Unterprogrammbibliotheken, in denen man Lösungen von Standardproblemen sammelte und bereitstellte. Solche Unterprogramme nannte man Funktionen oder Prozeduren. Die Ausgabe auf der Konsole mit Hilfe von System.out.println() etwa ist so ein Unterprogramm, d.h. genau genommen ist println() das Unterprogramm, der Rest des Namens ist eine Art Rahmen oder Behälter für die Unterprogramme darstellt. Man kann bei objektorientierten Sprachen Unterprogramme sammeln und ihnen einen gemeinsamen Namen voranstellen. Sie können dann nur noch im Zusammenhang mit diesem Namen verwendet werden. Diese Unterprogramme bilden dann eine Klasse (oder einen Teil davon). Unterprogramme, die Teil einer Klasse sind heißen Methoden oder Memberfunktionen. Leider ist der Name Memberfunktionen aus der Mode gekommen, denn er ist sprechender als das Wort Methode, das zudem im deutschen in den verschiedensten Zusammenhängen verwendet wird. Unterprogramme, die keiner Klasse angehören heißen Funktionen. In Java gibt es nur Methoden. In C gibt es nur Funktionen. In C++ gibt es Funktionen und Methoden.

Natürlich ist damit der Begriff Klasse bei weitem nicht vollständig erklärt, aber wir haben einen wichtigen Teilaspekt erklärt.


Eingaben an der Konsole

Halbwegs vernünftige Programme erwarten eine Eingabe von Daten durch den Benutzer, die dann verarbeitet werden und zu einem Resultat führen, das dem Benutzer bekanntgegeben wird. Java ist im Grunde nicht für Konsoleingaben entworfen worden. Das ist wohl auch der Grund, warum Konsoleingaben ganz allgemein unter das Kapitel Dateiverarbeitung fallen. Es gibt in Java kein Gegenstück zur scanf()-Funktion, die ja ein Spezialfall von fscanf() ist und die jedem C-Programmierer gut bekannt ist. Auch ein Gegenstück zu cin von C++ gibt es nicht. Da Dateiverarbeitung aber kein Thema für Beginner ist, habe ich eine Hilfsklasse Stdin geschrieben, die im gewissen Sinn ein Pendant zu den Ausgaben mit System.out.println() darstellt. Ich verwende diese Klasse seit Jahren in meinen Schulungen und habe damit gute Erfahrungen gemacht.


Die Klasse Stdin

Die Klasse Stdin ist von der eingangs erwähnten Art und stellt eine Sammlung von Methoden dar. Diese Methoden ermöglichen eine einfache Dateneingabe an der Konsole. Für jeden (primitiven) Datentyp und für Zeichenketten (String) gibt es Methoden, mit denen man die an der Konsole eingegebenen Daten ins Programm aufnehmen kann.

Die komplette Dokumentation (sie wurde mit dem utility javadoc erstellt und ein wenig händisch bearbeitet) zu dieser Klasse folgt auf der nächsten Seite. Sie können sich die Klasse Stdin auch herunterladen:

Dokumentation von Stdin

Download von Stdin.class.


Wir wollen die Klasse verwenden und ein Programm schreiben, das Dollar in Euro umrechnet. Dazu soll der Benutzer den Dollarbetrag und den Umrechnungskurs eingeben und als Ergebnis den Wert in Euro erhalten. Unser Programm sieht folgendermaßen aus.

public class DollarToEuro
{
   public static void main(String args[])
   {
      System.out.print("Dollarbetrag eingeben : ");     // 1
      int dollar = Stdin.intEingabe();                  // 2
      System.out.print("Umrechnungskurs eingeben : ");  // 3
      double kurs = Stdin.doubleEingabe();              // 4
      double euro = dollar/kurs;                        // 5
      System.out.println("Der Betrag in Euro : "+euro); // 6

   } // end main

} // end main class

Wir fordern den Benutzer dazu auf, einen Dollarbetrag einzugeben und anschließend den Umrechnungskurs. Da wir in Euroland sind, besagt der Kurs wieviel Dollar wir für einen Euro bekommen, deswegen müsen wir den Dollarbetrag durch den Kurs teilen. Wir verzichten hier auf eine Deklaration der Variablen am Anfang des Blocks und führen sie an der Stelle ein, wo wir sie brauchen. Das Programm besteht fast nur aus Aufrufen von Methoden, nur die Zuweisung  // 5  ist eine Berechnung.

Statt lediglich class haben wir diesmal public class geschrieben und lernen damit ein neues reserviertes Wort kennen. Der Unterschied der beiden Varianten ist hier noch nicht erkennbar und wird später behandelt. Hier finden Sie eine Liste der reservierten Wörter.

Hier ein Durchlauf des obigen Programms:

Dollarbetrag eingeben : 123
Umrechnungskurs eingeben : 0.9786
Der Betrag in Euro : 125.68976088289392


Die Klasse Scanner

Erst seit der Javaversion 1.5 gibt es eine Klasse die die Funktionalität der Klasse Stdin beinhaltet. Die Klasse Scanner aus dem Package util ermöglicht eine Eingabe von der Konsole ähnlich wie die Klasse Stdin. Natürlich ist die Klasse deutlich mächtiger und vielseitiger, trotzdem ist es erstaunlich, daß erst mit der sogenannten Tigerversion von Java eine Klasse zur Verfügung steht, die eine ähnliche Funktionalität aufweist wie die von mir entworfene Klasse Stdin, die zu Zeiten der Version 1.1 entstand. Hier also nochmal das DollarToEuro-Programm, das aber diesmal die Klasse Scanner verwendet. Um diese Klasse verwenden zu können brauchen wir eine import Anweisung am Anfang des Programmes, da diese Klasse nicht zum Grundstock der Klassen gehört, die der Compiler von Hause aus kennt. Dieser Grundstock besteht aus allen Klassen aus dem Package java.lang. .

import java.util.*;

public class DollarToEuro
{
   public static void main(String args[])
   {
      System.out.print("Dollarbetrag eingeben : ");     // 1
      Scanner sc = new Scanner(System.in);              // 2
      int dollar = sc.nextInt();                        // 3
      System.out.print("Umrechnungskurs eingeben : ");  // 4
      double kurs = sc.nextDouble();                    // 5
      double euro = dollar/kurs;                        // 6
      System.out.println("Der Betrag in Euro : "+euro); // 7

   } // end main

} // end main class

Bei der Klasse Scanner kann es aber zu kleinen Überraschungen kommen. Über System.in wird nämlich von Scanner die lokale Einstellung des Betriebssystems abgefragt und die liefert für Deutschland etwa, daß man Dezimalstellen mit einem Komma angibt. Obwohl es mittlerweile durchaus auch üblich ist den (amerikanischen) Punkt zu verwenden. Das aber akzeptiert Scanner nicht. So führt die Eingabe von z.Bsp. 1.44 als Dollarkurs zu einem Programmabbruch mit der Fehlermeldung

Nicht so bei der Klasse Stdin. Diese akzeptiert sowohl das Komma als auch den Punkt als Dezimaltrennzeichen.


Parameter und Returntyp einer Methode

Eine Methode erledigt eine Teilaufgabe eines Programms. Sie kann dazu Daten aus dem Programm übergeben bekommen oder auch Daten (Ergebnisse) an das Programm zurückgeben. Im obigen Beispiel bekommt die Methode println() jeweils Strings übergeben. Die Methode intEingabe() arbeitet in einer gewissen Weise genau umgekehrt, sie bekommt keine Daten aus dem Programm (leere runde Klammern), liefert aber einen Wert an das Programm zurück, nämlich die vom Benutzer eingegebene Zahl. Natürlich gibt es auch Methoden, die Daten erhalten und Daten zurückliefern. Es gibt auch Methoden, die mehrere Daten erhalten. Die Daten, die man in den runden Klammern übergibt nennt man Parameter. Hier sind Anzahl, Typ und Reihenfolge zu beachten. Zurückgelieferte Daten werden in der Regel einer Variablen zugewiesen. Der zugewiesene Wert heißt Returnwert, sein Typ folgerichtig Returntyp. Eine Methode kann keine oder (beliebig) viele Parameter erwarten. Methoden haben (bis auf einen Spezialfall, den wir hier noch außer Acht lassen) immer einen Returntyp und dazu keinen oder genau einen Returnwert. Für Methoden ohne Returnwert gibt es einen eigenen Returntyp, er heißt void . Wir fassen zusammen:

Der Returntyp void existiert nur im Zusammenhang mit Methoden. Eine Deklaration der Form  void x ;  existiert nicht.


Statische Methoden und die Klasse Math

Die Ausgabe des Eurobetrages in obigem Beispiel hat 14 Stellen hinter dem Komma. Das ist entschieden zuviel. Wir wollen das Ergebnis runden und verwenden dazu die Standardklasse Math aus der Klassenbibliothek der JFC. Diese Klasse ist ebenso wie die Klasse Stdin eine Sammlung von Methoden. Im Unterschied zu Stdin enthält Math aber noch zwei Konstanten, die Kreiszahl pi und die Euler'sche Konstante e, die uns aber hier nicht interessieren. Math enthält u.a. Methoden zur Berechnung des Absolutbetrages, der trigonometrischen Funktionen und von Potenzen und Wurzeln. Zudem gibt es einen Zufallsgenerator und verschiedene Rundungsmethoden. Wir wählen die Methode

static double rint(double a)

Sie erhält die zu rundende Zahl als double und gibt die Rundung als ganze Zahl vom Typ double zurück. Eine Rundungsmethode, die auf eine bestimmte Anzahl von Stellen hinter dem Komma rundet, gibt es in der Klasse Math nicht. Wir wollen trotzdem auf zwei Stellen hinter dem Komma runden und behelfen uns folgendermaßen :

public class DollarToEuro2
{
   public static void main(String args[])
   {
      System.out.print("Dollarbetrag eingeben : ");         // 1
      int dollar = Stdin.intEingabe();                      // 2
      System.out.print("Umrechnungskurs eingeben : ");      // 3
      double kurs = Stdin.doubleEingabe();                  // 4
      double euro = dollar/kurs;                            // 5
      double r_euro = Math.rint( 100*euro ) ;               // 6
      r_euro = r_euro/100 ;                                 // 7
      System.out.println("Der Betrag in Euro : "+ r_euro);  // 8

   } // end main

} // end main class

Wir runden also das Hundertfache des Ergebnisses (// 6) und dividieren hernach r_euro dafür durch 100 (// 7). Dadurch erhalten wir eine Rundung auf zwei Stellen hinter dem Komma.

static (statisch)

Die Verwendung der Methode rint() ist ganz analog wie der Methodenaufruf von intEingabe() oder doubleEingabe(). Man beginnt mit dem Namen der Klasse, die die Methode enthält, setzt einen Punkt und danach erscheint der Name der Methode. Diese Art von Aufruf einer Methode heißt statisch. Man erkennt statische Methoden daran, daß in der Dokumentation vor dem Returntyp das Wort static erscheint. Statische Methoden werden in der Regel mit dem Klassennamen aufgerufen. Methoden, bei denen in der Dokumentation das Wort static nicht erscheint, heißt nicht statisch. Ihr Aufruf folgt einem anderen Schema, das wir später vorstellen.

Aufrufschema für statische Methoden :        Klassenname.methodenName()

Theoretisch können statische Methode auch noch anders aufgerufen werden, dies ist jedoch nicht üblich.


Übung
Verwendung der Klasse Stdin
Zinseszins

Valid XHTML 1.0 Strict top Back Next Up Home