7 Bibliotheken 7- 1 Bibliotheken (Java API) Inhalt Pakete Strings Übungsaufgaben Pakete Die vordefinierten Klassen von Java sind in Pakete organisiert. Die Gesamtheit dieser Pakete bildet die API (Application Programming Interface). Jedes Paket entspricht im Prinzip einem Directory. Daher sind die Pakete auch hierarchisch angeordnet. Das Paket, in dem unsere Programme bisher die Klassen ablegten, war das default -Paket. Die Klassen wurden im aktuellen Directory vom Compiler abgelegt, und dort vom Interpreter gefunden. Außerdem lädt jedes Programm das Paket java.lang, das der Compiler an einem vordefinierten Platz findet. Um diese Details muß sich der Programmierer nicht kümmern, da das aktuelle Directory und das Directory, wo sich lang befindet, im normalen Klassenpfad enthalten sind. Dieser Pfad kann übrigens durch Setzen der Environment-Variablen CLASSPATH geändert werden. Java kann auch mit komprimierten Paketen umgehen. So sind etwa alle Klassen lang.* in eine Datei classes.zip gepackt. Eine solche Datei muß ebenfalls im Klassenpfad sein, damit sie gefunden wird. Man spricht von archivierten Klassen. Insbesondere beim Laden über das Internet ist eine solche Komprimierung nützlich. Man verwendet allerdings den Komprimierer jar, der ganz in Java geschrieben ist, und Archive mit der Endung .jar erzeugt. Es folgt eine Übersicht über wichtige Pakete, die in Java 1.1 definiert sind. java.awt java.beans java.io Dies ist das abstract windowing toolkit. Es enthält Klassen zur Grafikausgabe und zur Erzeugung von graphischen Benutzeroberflächen (GUI). Die Beans-Technologie soll fertige Elemente zur Programmierung, insbesondere von graphischen Benutzeroberflächen, liefern. Der Zweck ist, visuelle Programmierung zu ermöglichen. Klassen zur Ein- und Ausgabe von Dateien, vom Netz oder von 7 Bibliotheken 7- 2 anderen Quellen. java.lang java.math java.net java.rmi java.security java.text java.util Dieses Paket wird automatisch geladen. Es enthält wichtige Dinge, wie die String-Klasse. Java unterstützt den Umgang mit langen Zahlen in diesem Paket in Form von großen Dezimalzahlen und großen Ganzzahlen. Java unterstützt mit diesem Paket die Kommunikation über das Internet. Es gibt in diesem Paket eine Klasse, die es erlaubt Methoden von Klassen an entfernten Rechnern über das Netz oder von anderen parallel laufenden Programmen aufzurufen. Da Java von vornherein eine Sicherheitsphilosophie verfolgt, unterstützt es in diesem Paket Verschlüsselung. Da Java schon Unicode benutzt, bietet dieses Paket Schnittstellen für die Entwicklung internationalisierter Programme. Enthält einige Datenstrukturen, wie wachsende Arrays oder auch Stapelspeicher, sowie andere nützliche Dinge. Man kann auch sein eigenes Programm in Pakete organisieren. Dazu muß man die Klassendateien in Unterverzeichnisse abspeichern, aber vom Hauptverzeichnis aus kompilieren. Dies sieht so aus javac MyPackage/Test.java wenn Test.java eine Datei im Verzeichnis MyPackage ist. Außerdem muß die Datei Test.java gleich zu Beginn das Kommando package MyPackage; enthalten, also noch vor der ersten Klassendefinition. Drittens müssen alle Dateien, die Test.java verwenden wollen (außer den Dateien in MyPackage), die Klasse importieren. import MyPackage.Test; oder auch import MyPackage.*; Diese Anweisung importiert gleich alle Klassen im Paket MyPackage. Die importAnweisungen müssen vor den Klassen-Definitionen stehen, aber nach der packageAnweisung. Insbesondere müssen Klassen aus den vordefinierten Paketen importiert werden (außer aus java.lang ). Alternativ kann man die Klasse auch mit vollem Namen ansprechen. MyPackage.Test t=new MyPackage.Test(); 7 Bibliotheken 7- 3 Strings Strings sind in java.lang definiert. Die String-Klasse hat in Java einen Sonderstatus. Z.B. wurden für sie eigene Konstanten eingeführt, nämlich "...". Man kann daher schreiben String s="Dies ist eine String-Konstante"; Außerdem gibt es den speziellen Operator + für Strings. Dieser Operator kann sogar Strings mit elementaren Datentypen addieren, die dann in Strings umgewandelt werden. String s="Hallo"; s=s+'!'; // s ist nun "Hallo!" Hier wurde ein char-Wert an einen String gehängt. Wir haben bei der Ausgabe schon mehrfach double- oder int-Werte mit Strings verkettet. In der Tat kann + jedes Objekt verarbeiten, das eine sinnvolle toString() Methode hat. class Winkel { double Alpha; public Winkel (double alpha) { Alpha=alpha; } public String toString () { return ""+Alpha; // einfache Umwandlung von double zu String } } public class Test { static public void main (String args[]) { String s="Wert "; Winkel a=new Winkel(Math.PI); s=s+a; System.out.println(s); // druckt: Wert 3.141592653589793 } } Das Beispiel zeigt auch, wie man einen double-Wert zu einem String umwandeln kann. Man addiert ihn einfach zu "". Natürlich hat die String-Klasse auch eine Reihe von Methoden. Am besten informiert man sich darüber in der Java-Dokumentation. Strings lassen sich nicht nur mit Hilfe von ="..." initialisieren, sondern auch über den Inhalt eines Arrays von char-Werten oder von byte-Werten. Dies wird über Konstruktoren erreicht. Dazu ein Beispiel: public class Test { static public void main (String args[]) { char c[]={'H','a','l','l','o'}; String s=new String(c); // char-Array nach String umwandeln System.out.println(s); } } Natürlich ist auch der umgekehrte Weg möglich. public class Test 7 Bibliotheken { 7- 4 static public void main (String args[]) { String s="Hallo"; char c[]=s.toCharArray(); // Umwandeln in char-Array for (int i=0; i<c.length; i++) System.out.print(c[i]); System.out.println(); } } Hier wird der String Buchstabe für Buchstabe ausgegeben. Der String bietet außerdem Methoden zum Bilden von Teilstrings und zum Suchen. Wir haben Strings bisher, außer in Konstanten, schon in dem args-Parameter von main kennengelernt. Dieser Parameter enthält ein Array von Strings. Dazu folgendes Beispiel, das ein Wort aus der Kommandozeile entgegennimmt und rückwärts wieder ausgibt. public class Test { static public void main (String args[]) { if (args.length==1) { char c[]=args[0].toCharArray(); for (int i=c.length-1; i>=0; i--) System.out.print(c[i]); System.out.println(); } } } Das Programm funktioniert folgendermaßen: D:\java\kurs>java Test hallo ollah Übungsaufgaben 1. Informieren Sie sich in der Dokumentation über die Klasse BitSet. Schreiben Sie ein Primzahlsieb für die Primzahlen bis 1000000. Dazu initialisieren Sie alle Bits mit true und streichen dann die Vielfachen aller Zahlen (Bit auf false setzen), die bisher noch nicht gestrichen wurden (die Primzahlen). Zählen Sie die Primzahlen bis 1000000 auf diese Weise. 2. Machen Sie das Sieb aus 1. effektiver, indem Sie nur die nötigen Vielfachen streichen und nur Bits für ungerade Zahlen setzen. 3. Schreiben Sie ein Unterprogramm, das testet, ob ein String ein Palindrom ist (das ist ein Wort, das vorwärts wie rückwärts gleich lautet). Nutzen Sie dazu die Methode charAt() von String. 4. Informieren Sie sich in der Dokumentation über die Klasse StringBuffer, die einen String darstellt, der dynamisch wachsen kann. Schreiben Sie ein Programm, das in einem String jedes Vorkommen von Doppelbuchstaben streicht, indem Sie den String in einen dynamisch wachsenden Stringbuffer kopieren. 7 Bibliotheken 7- 5 Lösung. Aufgaben ohne Lösung 1. Nützen Sie die Vector-Klasse, um die ersten 100000 Primzahlen abzuspeichern. 2. Schreiben Sie Programm, das aus einem String den Teil zwischen den beiden Klammern ( und ) ausschneidet, bzw. den leeren String "", wenn diese Klammern im String nicht vorkommen. Falls Sie dabei die Methode indexOf() von String verwenden, beachten Sie Sonderfälle wie "a)(avc)". 3. Schreiben Sie 2., indem Sie ein char-Array von dem String anlegen. 4. Schreiben Sie ein Unterprogramm, das einen String umkehrt. Benutzen Sie dazu ein char-Array oder den StringBuffer (aber nicht seine Methode reverse()!).