Java - Eine Einführung
Transcription
Java - Eine Einführung
Java - Eine Einführung Ole Schulz-Trieglaff 20. März 2004 2 Kapitel 1 Erster Tag 1.1 Einleitung Java wurde Anfang der 90er Jahre von der kalifornischen Firma SUN Microsystems entwickelt. SUN wollte damals ein System entwickeln mit dem sich die unterschiedlichsten technischen Geräte ansteuern lassen. Alle bisherigen Programmiersprachen waren zu unflexibel, d.h. es hätte einen sehr großen Aufwand erfordert, ein Programm, dass z.B. für einen PC entwickelt worden war, an einen Toaster anzupassen. (Der Fachbegriff dafür ist portieren) Java wurde im Rahmen dieses Projektes mit dem Ziel entwickelt möglichst einfach, zuverlässig und portabel zu sein. Das Projekt selbst war nicht besonders erfolgreich, nur Java blieb übrig und wurde weiter entwickelt. Eine kleine Anekdote: Java hieß ursprünglich Oak (engl. für Eiche), wie die Bäume, die vor dem Büro eines der Chef-Entwickler von Java, James Gosling, stehen. Es stellte sich jedoch heraus, das es bereits eine Programmiersprache mit diesem Namen gab. Um juristische Schwierigkeiten zu vermeiden, wurde schnell nach einem neuen Namen gesucht. Eine der Kaffesorten des Ladens, in denen das Team seinen Kaffee kaufte, hieß Java... Jetzt schnell noch ein Überblick über die wichtigsten Merkmale von Java: • Java ist objektorientiert. Das ist so ziemlich die wichtigste Eigenschaft. Sie sagt im Wesentlichen aus, dass man in Java versucht, Teile eines Programms in sog. Objekte oder Klassen zu strukturieren. Was dies genau heisst, werden wir erst morgen sehen. • Java unterstützt das Internet. Java ist auf Netzwerkanwendungen optimiert d.h. alle Programme, die Daten in Netzwerken übertragen müssen, lassen sich mit Java sehr leicht realisieren. • Java ist fexibel und robust. Wie oben schon erwähnt lassen sich in Java geschriebene Programme ohne große Mühe an verschiede Rechner anpassen. Außerdem wurde bei der Entwicklung großer Wert auf Datensicherheit gelegt. Alle Java Programme laufen in einer Art Schutzkäfig (engl. Sandbox), der sie vor anderen Programmen abschirmt. Dadurch wird verhindert, dass ein Java-Programm Schaden verursachen kann. • Java verfügt über viele Standardfunktionen Auch ein gutes Argument für Java: für viele häufig auftretenden Probleme besitzt Java schon 3 4 KAPITEL 1. ERSTER TAG vorgefertigte Lösungen, die kostenlos (wie auch die Programmiersprache selbst) mitgeliefert werden. Noch eine kleine Anmerkung: Die erste Version von Java wurde 1995 veröffentlicht und hatte die Versionsnummer 1.0. Ab der Version 1.2 spricht man kurioserweise vom Java 2 SDK ( = Software Development Kit). Die neuste Version heisst allerdings wieder Java 1.5.... 1.2 Jetzt geht es los Wir wollen uns jetzt ein Java-Programm mal etas genauer anschauen. Grundsätzlich unterscheidet man (und frau auch) zwischen sog. Applets, die fest in Webseiten eingebaut sind und Java-Programmen, die sich auch alleine ausführen lassen. /* Hallo.java Ein erstes Java-Programm Ole Schulz-Trieglaff, März 2004 */ // Hier geht es los public class Hallo { public static void main(String[] args) { System.out.println("Hallo!"); System.out.println("Ich ein Java-Programm!"); } } Was bedeutet das alles ? • Die ersten sieben Zeilen bilden Kommentare. • public class Hallo {..} Definiert alles, was zu (Haupt-)Klasse Hallo gehört. Die Inhalt der Klasse wird von geschweiften Klammern umrahmt: { und }. • public static void main(String[] args) {..} Beim Ausführen der Klasse wird dieser Abschnitt zuerst ausgeführt. Alles was zu diesem main-Abschnitt gehört, wird wieder von Klammern eingerahmt. • System.out.println("Hallo!"); Dieser Befehl gibt Hallo! auf dem Bildschirm aus. Alle Befehle müssen in Java mit einem Semikolon abgeschlossen werden. 1.3. JAVA-APPLETS 1.2.1 5 Ausführen des Programms Das Ganze läuft immer gleich: 1. Programm schreiben / abtippen mit Editor der Wahl und speichern. Der Dateiname muss dabei dem Namen der Hauptklasse entsprechen. (Im Beispiel oben Hallo.java ). 2. Für den Computer übersetzen (kompilieren) mit: javac Hallo.java Dieser Befehl erzeugt eine Datei Hallo.class, die Java-Bytecode enthält. 3. Ausgeführt wird dieser Bytecode dann mit dem Befehl java Hello. 1.3 Java-Applets Der Vollständigkeit halber möchte ich hier nochmal kurz ein Java-Applet vorstellen. Applets sind kleine Programme, die in eine Internetseite eingebaut sind und von einem Webbrowser (z.B. dem Internet Explorer) ausgeführt werden. Ein kurzes Applet kann z.B. so aussehen: import java.awt.*; import java.applet.Applet; public class FirstApplet extends Applet { public void paint (Graphics g) { g.drawString("Hallo! Ich bin ein Java-Applet.",50,50); } } 1.4 Variablen und Operatoren Variablen sind Platzhalter oder Container. Sie speichern Werte, mit denen ein Programm arbeiten soll. Um eine Variable verwenden zu können, muss man sie zuerst deklarieren und sie dann initialisieren. Beispiel: \\ Wir erstellen eine Variable vom Typ int mit Namen var int var; // Deklaration: Variable var hat Typ int var = 99; // Initialisierung: var hat jetzt den Wert 99 Deklaration und Initialisierung sind Anweisungen, deshalb werden sie auch mit einem Semikolon beendet. Java unterscheidt zwischen Groß- und Kleinschreibung. Deshalb sind var und Var unterschiedliche Variablen. Es gibt ebenfalls strenge Regeln, welche Zeichen Variablennamen (identifier) enthalten dürfen: 1. Die Zeichen des Alphabets (java letter), also a-z and A-Z 2. Der Unterstrich 3. Die Ziffern von 0-9 6 KAPITEL 1. ERSTER TAG 4. Ein identifier muss mit einem java letter oder $ beginnen. Es gilt die Konvention, dass eine Variable immer mit einem kleinen Buchstaben beginnen muss. Falls der Name aus mehreren Teilen besteht, wird jeder außer dem ersten Teil mit einem Großbuchstaben begonnen, z.B. : hoeheDerBox 1.4.1 Datentypen Man unterscheidet in Java (und in den meisten anderen Programmiersprachen auch) zwischen: • primitiven Datentypen. Sie sind nicht weiter unterteilbar. • und zusammengesetzten Datentypen. Sie bestehen aus mehren Teilwerten, die jeweils einzeln manipuliert werden können. Ein Beispiel dafür sind Arrays, die Ähnlichkeit zu Listen in Haskell besitzen. Hier eine Übersicht über die wichtigsten primitiven Datentypen: Name Grösse Wertebereich byte 8 -126 bis +128 short 16 -32768 bis 32767 int 32 −231 bis 231 − 1 long 64 −263 bis 263 − 1 float 32 −3.4 × 1038 bis +3.4 × 1038 double 64 −1.797 × 10308 bis +1.797 × 10308 boolean 1 true oder false char 16 Druckbare Zeichen: ‘a‘ bis ‘Z‘ auch Steuerzeichen Der wichtigste zusammengesetzte Datentyp ist String. Er sieht in Java genauso aus wie in Haskell. Er besteht aus einem oder mehreren Zeichen, eingefasst von doppelten Anführungsstrichen, wie z.B. “Java ist toll !! “. Man kann zwei Strings aneinanderhängen (konkatenieren) mit dem + Operator (Nicht ++ wie bei Haskell !!): string str = "Java" + " ist " + "toll!"; int i = 5; System.out.println("i hat den Wert: " + i); 1.4.2 Operatoren und Berechnungen Java kennt folgende Operatoren: arithmetische Operatoren: • binäre: +, −, ∗, / und % (Modulooperation, Rest bei Division) int x = 3 / 2; float z = 3.0 / 2; // ergibt 1 // ergibt 1.5 1.4. VARIABLEN UND OPERATOREN 7 • und unäre: ++ und −−. Beide gibt es in einer Präfix- und Postfix-Version. Sie können nur auf Variablen angewendet werden. int i = 5; int k = i++; int l = ++i; // k = 5, i = 6 // l = 7, i = 7 Vergleichsoperatoren: • == und ! = (ungleich) sind auf beliebige Typen anwendbar • <, <=, >, >= für Zahlen und Buchstaben Boolesche Operatoren: Auch Java kennt Lazy-Evaluation ! Es wird hier aber Short-Circuit-Evaluation genannt. • ! Nicht (not in Haskell) • && Und, || Oder mit Short-Circuit-Evaluation • & logisches und, | Oder, ∧ exklusives Oder (XOR) Bitoperatoren Mit diesen Operatoren kann direkt auf die Binärdarstellung von numerischen Datentypem zugegriffen werden. • bitweises Komplement: ∼ inervertiert jedes einzelne Bit • & bitweises Und, | bitweises Oder, ∧ bitweises XOR , << Linksshift, >> arithmetischer Rechtsshift, >>> logischer Rechtsshift // Mit dem Linksshift schnell potenzieren: byte potenz = 2 << 2; // ergibt 2^3 = 8, denn 00000010 wird zu 00001000 Zuweisungsoperatoren Der Zuweisungsoperator ist in Java einfach das Gleichheitszeichen =. (Wer hätte das gedacht!) Es gibt aber zusätzlich noch die Möglichkeit, Operationen mit dem Gleichheitszeichen zu kombinieren. Ein Beispiel: Wenn wir den Wert einer Variablen x um 5 erhöhen wollen, dann könnten wir schreiben: x = x + 5; // x hat jetzt den Wert 5 Viel kürzer ist jedoch: x += 5; // x hat jetzt auch den Wert 5 Das Gleiche geht auch mit: + =, − =, ∗ =, / =, % =, & =, | =, ∧ =, <<=, >>=, >>>= Was man auch noch wissen sollte: der Zuweisungsoperator liefiert das Ergebnis zurück. Es sind also auch Verkettungen möglich wie: float i,j,k; i = j = 7; k = 5 + 6*(i += j/2); Zum Schluss gibt es noch einen Operator, von dem man etwas gehört haben sollte, und zwar ?. Er wird auch als ternärer Auswahloperator bezeichnet: max = (i>j) ? i : j; 8 1.5 KAPITEL 1. ERSTER TAG Typecasts Oft gerät man in Situationen, in denen man verschiedene Datentypen ineinander umwandeln will oder muss. So einen Vorgang nennt man Typecast. Man unterscheidet zwischen expliziten und impliziten Typecasts: expliziter Typecast: float f = 2.5f; int i = (int) f; // Float wird zu Int, i hat den Wert 2 impliziter Typecast: 5/2.0 // double 2.5 int i = 5; System.out.println("i hat den Wert: " + i); // Typecast von int nach String Allgemein gilt, dass erweiternde Typecasts, bei denen keine Genauigkeit verloren geht, vom Compiler automatisch (implizit) durchgeführt werden. Also z.b. von short nach float o. ä. In die umgekehrte Richtung ist eine explizite Anweisung des Programmiers erforderlich.