Programmierung in Java Primitive Datentypen von Java sind: boolean byte char short int long float double P raktische Inf ormatik entweder true oder false Zahlen von −128 bis 127 (8 Bit) 16-Bit (2 Byte) Unicode-Zeichen Zahlen von −32768 bis 32767 (16 Bit) Zahlen von −231 bis 231 − 1 (32 Bit) Zahlen von −263 bis 263 − 1 (64 Bit) Fließkommazahlen Fließkommazahlen mit doppelter Genauigkeit 2, SS 2005, F olien Java;2, (27. April2005) Seite 1 Strings in Java Strings sind vordefinierte Klasse; nicht primitiv Methoden für Strings: + length(), charAt(int), substring(anfangsindex, endindex), equals(String other). Zwei Strings werden verbunden Test der Inhalts-Gleichheit. Bei s == t wird Objektidentität geprüft! P raktische Inf ormatik 2, SS 2005, F olien Java;2, (27. April2005) Seite 2 Umlaute, Unicode-Darstellung, Escape-Sequenzen ä ö ü ß Ä Ö Ü \u00E4 \u00F6 \u00FC \u00DF \u00C4 \u00D6 \u00DC P raktische Inf ormatik 2, SS 2005, F olien Java;2, \n \r \“ \’ \\ (27. April2005) Seite 3 Zeilenumbruch (newline) carriage return Doppeltes Anführungszeichen Einfaches Anführungszeichen ergibt \ Operatoren auf primitiven Daten ∗, /, +, − Infix-Ops (für mehrere Typen) % modulo-Rechnung 7%3 ergibt 1 ++ addiere 1: z.B. i++ (erst verwende i; addiere 1) ++i (addiere 1; verwende i ) subtrahiere 1: i-- (verwende i; subtrahiere 1) -- --i <, <=, > >=, ==, ! = P raktische Inf ormatik 2, SS (subtrahiere 1; verwende i ) arithmetische Infix Vergleiche 2005, F olien Java;2, (27. April2005) Seite 4 Operatoren auf primitiven Daten (2) ! Negation (Prefix) &, | striktes und, oder für Boolesche Ausdrücke (werden auch für bitweise Operation verwendet) &&, || lazy und, oder ^ exklusives oder += x += y entspricht x op= Abkürzung für: x op= a entspricht x = x op a andere op sind möglich = x + y Es gibt weitere Operationen, . . . P raktische Inf ormatik 2, SS 2005, F olien Java;2, (27. April2005) Seite 5 Ausdrücke Ausdruck = Programmfragment, das nach Ausführung einen Wert hat (analog zu Haskell) Zum Beispiel arithmetische Ausdrücke; Boolesche Ausdrücke. Funktionsausdrücke; Methoden-Anwendungen Methoden müssen dazu Rückgabetyp haben und mittels return den Wert zurückgeben. Auswahloperator: a ? b : c wirkt wie ein if mit Wertrückgabe In Haskell: if-then-else leistet beides P raktische Inf ormatik 2, SS 2005, F olien Java;2, (27. April2005) Seite 6 Beispiel für Boolesche Ausdrücke (a == b) (a != b) (a > b) Zusammengesetzte Boolesche Ausdrücke: (a > 0 && a <= 10) (3*a +5 < 20 P raktische Inf ormatik 2, SS || b == c) 2005, F olien Java;2, (27. April2005) Seite 7 Anweisungen Anweisung P raktische Inf ormatik 2, SS = Programmfragment, das den Zustand ändert (Befehl, Kommando) 2005, F olien Java;2, (27. April2005) Seite 8 Anweisungen if . then . else . Syntax: if (hAusdrucki) hAnweisungi else hAnweisungi • • • Hinter if muss ein Boolescher Ausdruck stehen. Mehrere Anweisungen, mit { und } geklammert, zählen als eine Anweisung. Das else kann weggelassen werden. P raktische Inf ormatik 2, SS 2005, F olien Java;2, (27. April2005) Seite 9 switch Syntax: (Einrückung zur besseren Lesbarkeit) switch (hAusdrucki) { case hKonstantei: hAnweisungeni break ; ... case hKonstantei: hAnweisungeni break ; default: hAnweisungeni } Nebenbedingungen: • • • Typ des Ausdrucks: elementar Konstanten müssen zur Kompilierzeit bekannt sein. break’s sollten jeden Fall abschließen, P raktische Inf ormatik 2, SS 2005, F olien Java;2, (27. April2005) Seite 10 while Syntax: while (hAusdrucki) hAnweisungi Der Rumpf der Schleife wird ausgeführt, solange der hAusdrucki den Wert true hat. Besondere Anweisungen: continue: break: P raktische Inf ormatik Sprung ans Ende des Rumpfes Beenden der Schleife 2, SS 2005, F olien Java;2, (27. April2005) Seite 11 do-while Syntax: do hAnweisungi while (hAusdrucki) Der Rumpf der Schleife wird ausgeführt, bis der Ausdruck den Wert false hat. Der Rumpf wird auf jeden Fall einmal ausgeführt. P raktische Inf ormatik 2, SS 2005, F olien Java;2, (27. April2005) Seite 12 for Syntax: for (hIniti; hBedingungi; hAusdrucki) hAnweisungi Der Rumpf (Anweisung) der for-Schleife wird ausgeführt, solange der Bedigungs-Ausdruck den Wert true hat. Man kann mit der continue Anweisung ans Ende des Rumpfes springen. P raktische Inf ormatik 2, SS 2005, F olien Java;2, (27. April2005) Seite 13 Beispiel for (int i = 0; i <= 10; i++) <Anweisung>; Diese Schleife wird für i = 0, . . . , 10 durchlaufen. Alternativ zu i++ : i = i+1 oder i += 1 P raktische Inf ormatik 2, SS 2005, F olien Java;2, (27. April2005) Seite 14 Marken, Labels Anweisungen sind markierbar mit Marken (Labels): marke1: while (i < 0) i--; Bei geschachtelten Schleifen: beenden mit break marke1, ans Ende mit continue marke1 P raktische Inf ormatik 2, SS 2005, F olien Java;2, (27. April2005) Seite 15 Felder (Arrays) Folgen von Objekten gleichen Typs, die mit Index angesprochen werden können. Felder können mehrdimensional sein. Beispiel int [] a; // a = new int [10] ; integer feld a ist erkl\"art // integer feld a ist jetzt ansprechbar // und hat 10 Eintraege: von 0 bis 9 // nicht initialisiert for (int i = 0; i < a.length; i++) { a [i] = i ; } P raktische Inf ormatik 2, SS 2005, F olien Java;2, (27. April2005) Seite 16 Felder (Arrays): mehrdimensional Beispiel für ein zweidimensionales Feld mit direkter Initialisierung: String[][] matrix = { {"AA","AB","AC","AD"}, {"BA","BB","BC","BD"}, {"CA","CB","CC","CD"} }; P raktische Inf ormatik 2, SS 2005, F olien Java;2, (27. April2005) Seite 17 Kommentare Es gibt drei Arten von Java-Kommentaren: • Kommentar bis Zeilenende // • Kommentare zwischen /* und */. Schachtelung ist jedoch nicht erlaubt. • Kommentare zwischen /** und */ Die letzeren können mit javadoc extrahiert und bearbeitet werden. P raktische Inf ormatik 2, SS 2005, F olien Java;2, (27. April2005) Seite 18 Konstruktoren Beispiel: class Rechteck extends geometrischesObjekt { Rechteck (int x, int y, int b, int h) { this.x = x; this.y = y; this.b = b; this.h = h; } int x, y, b, h; void move (int xd; int yd) { this.x = x + xd; this.y = y + yd; } } P raktische Inf ormatik 2, SS 2005, F olien Java;2, (27. April2005) Seite 19 Konstruktoren • • new hClassi konstruiert neues Objekt. new ruft die Konstruktor-Methode (den Konstruktor) von hClassi auf. • • • • Name des Konstruktors = Name der Klasse Verschiedene Konstruktoren sind erlaubt Auswählen der Bindung genau wie beim Überladen. this(...) ruft Konstruktor der gleichen Klasse auf. P raktische Inf ormatik 2, SS 2005, F olien Java;2, (27. April2005) Seite 20 Konstruktoren: Aufrufprinzipien • Bei konkreter Klassenhierarchie: Aufruf der Konstruktoren von oben nach unten Notwendig: Aufruf super() am Anfang Aufruf super() und this() nicht gleichzeitig im Konstruktor Grund: geordnetes Abarbeiten der Konstruktoren. P raktische Inf ormatik 2, SS 2005, F olien Java;2, (27. April2005) Seite 21 Klassenkonversion, Typkonversion, cast Die Syntax des cast-Operators ist: hClassi Objekt Beispiel: varfloat = (float) vardouble Die umgekehrte Zuweisung kann Java automatisch richtig umsetzen, da keine Information verlorengeht. vardouble = (float) varfloat ist erlaubt. P raktische Inf ormatik 2, SS 2005, F olien Java;2, (27. April2005) Seite 22 Beispiel Klassenkonversion Sei geoObj Oberklasse von Rechteck. ist erlaubt; der Inhalt wird nicht verändert. vargeoobj = varrechteck varechteck = vargeoobj ist verboten, denn : vargeoobj könnte ein Kreisobjekt sein Erlaubt: varrechteck = (Rechteck) vargeoobj Exception zur Laufzeit, wenn vargeoobj ein Kreis ist. Typkonversion und Typangaben: • • unterstützen die Typsicherheit und den Typcheck zur Kompilezeit geben Flexibilität beim Programmieren Z.B. Zusammenfassen von Objekte verschiedener Klassen (Vector, Liste) P raktische Inf ormatik 2, SS 2005, F olien Java;2, (27. April2005) Seite 23 Ausnahmen, Exceptions Exceptions (Ausnahmen) sind Laufzeitfehler bzw. unerwartete Reaktionen: • • • Fehler bei externen Aufrufen, Division durch 0 usw. try, catch, throw: Umgang mit Exceptions catch try throw Abfangen von Exceptions Einpacken von Anweisungen als Vorbereitung für catch Erzeugen von programmierten Ausnahmen. Abbruch des Programms, wenn keine Ausnahmebehandlung programmiert ist. P raktische Inf ormatik 2, SS 2005, F olien Java;2, (27. April2005) Seite 24 Ausnahmen, Exceptions . . . throws Exception1, ...: zeigt an, dass die Methode Ausnahmen erzeugen kann. Verwendung von try und catch: Nach dem try-Block : try Ausdruck folgen catch-Blöcke: catch (Exception exception) Anweisung P raktische Inf ormatik 2, SS 2005, F olien Java;2, (27. April2005) Seite 25 Zugriffsrechte public, private. Seltener verwendet: protected Beispiel .... class Rechteck extends geometrischesObjekt { private int x, y, b, h; public void move (int xd; int yd) { this.x = x + xd; this.y = y + yd; } } P raktische Inf ormatik 2, SS 2005, F olien Java;2, (27. April2005) Seite 26 Zugriffsrechte public Methode move darf von außerhalb benutzt werden die Nachricht move(10,10) ist immer erlaubt. private Attribute x,y,b,h dürfen nicht von außen abgefragt/ geändert werden (Wie lokale Variablen) protected Dürfen innerhalb des Packages aufgerufen werden Attribute dürfen nur von Methoden der Unterklassen geändert werde keine Angabe: Alle Methoden des Packages haben Zugriff P raktische Inf ormatik 2, SS 2005, F olien Java;2, (27. April2005) Seite 27 Modifikatoren static: final: P raktische Inf ormatik kennzeichnet Klassen-Attribut bzw. -Methoden Definiert globale Variablen der Klasse z.B. die Anzahl aller Objekte einer Klasse kann man so definieren Klassen-Attribute sind aufrufbar mittels Klasse.attribut. Klassenmethoden kann man benutzen ohne Objekt d.h. die Variable this ist nicht verwendbar. Aufruf: Klassenname. Methodenname(params). Z.B. main ist in einer Applikation stets eine Klassenmethode. nicht überschreibbare Attribute bzw. Methoden. Zur Definition von festen Konstanten; verwendbar in Bibliotheken / Standard Pakete. 2, SS 2005, F olien Java;2, (27. April2005) Seite 28 Fahrzeugbeispiel: Beispiel zu Klassendefinition Erzeugung von Objekten Ist Java-Applikation Demonstriert verschiedene Techniken: u.a. static Attribut. P raktische Inf ormatik 2, SS 2005, F olien Java;2, (27. April2005) Seite 29 Fahrzeugbeispiel: Quellkode // abgewandeltes Beispiel aus Hannover Skript class Fahrt { private double Geschwindigkeit; public String Fahrtrichtung; private Fahrzeug Benfahrzeug; public Fahrt (double Geschwindigkeit, String Fahrtrichtung, Fahrzeug Benfahrzeug) { this.Geschwindigkeit = Geschwindigkeit; this.Fahrtrichtung = Fahrtrichtung; this.Benfahrzeug = Benfahrzeug; } P raktische Inf ormatik 2, SS 2005, F olien Java;2, (27. April2005) Seite 30 Fahrzeugbeispiel: Quellkode(2) public double beschleunigt_5() { Geschwindigkeit = Geschwindigkeit +5; return Geschwindigkeit; } public double Geschwindigkeit () { return this.Geschwindigkeit ; } } P raktische Inf ormatik 2, SS 2005, F olien Java;2, (27. April2005) Seite 31 Fahrzeugbeispiel: Quellkode(2) class Fahrzeug { public double Hoechstgeschwindigkeit; private String Eigentuemer; private static long Anzahl; static { Anzahl = 0; } public static long Anzahl() { return Anzahl; } public Fahrzeug() { Anzahl = Anzahl + 1; } P raktische Inf ormatik 2, SS 2005, F olien Java;2, (27. April2005) // Seite 32 Konstruktur: Fahrzeugbeispiel: Quellkode(3) public Fahrzeug(double Hoechstgeschwindigkeit, String Eigentuemer) { Anzahl = Anzahl +1; this.Eigentuemer = Eigentuemer; this.Hoechstgeschwindigkeit = Hoechstgeschwindigkeit; } public double Hoechstgeschwindigkeit () { return Hoechstgeschwindigkeit ; } public void loesche_Fahrzeug() { Anzahl = Anzahl - 1; } public String Eigentuemer () { return Eigentuemer; } } P raktische Inf ormatik 2, SS 2005, F olien Java;2, (27. April2005) Seite 33 Fahrzeugbeispiel: Quellkode(4) class Auto extends Fahrzeug { public String Autokennzeichen; public Auto(double Hoechstgeschwindigkeit, String Eigentuemer, String kennzeichen) { super(Hoechstgeschwindigkeit, Eigentuemer); this.Hoechstgeschwindigkeit = Hoechstgeschwindigkeit; this.Autokennzeichen = kennzeichen; } } P raktische Inf ormatik 2, SS 2005, F olien Java;2, (27. April2005) Seite 34 Fahrzeugbeispiel: Quellkode(4b) class Boot extends Fahrzeug { public double Tiefgang; public Boot(double Hoechstgeschwindigkeit, String Eigentuemer, double tiefgang) { super(Hoechstgeschwindigkeit, Eigentuemer); this.Hoechstgeschwindigkeit = Hoechstgeschwindigkeit; this.Tiefgang = tiefgang; } } P raktische Inf ormatik 2, SS 2005, F olien Java;2, (27. April2005) Seite 35 Fahrzeugbeispiel: Quellkode(5) class FahrzeugProg2 { public static void main(String[] args) { System.out.println("Anzahl Args: " + args.length); for (int i = 0; i < args.length; i=i+1) System.out.println(args[i] + " "); System.out.println(); System.out.println("Anzahl Fahrzeuge: " + Fahrzeug.Anzahl()); Auto MeinGolf = new Auto(180.0, "myself","B-SE-1"); System.out.println("Neues Auto, maxkm:" + MeinGolf.Hoechstgeschwindigk + " Besitzer:" + MeinGolf.Eigentuemer() + " AutoKZ:" + MeinGolf.Autokennzeichen) Boot boot = new Boot(20.0,"Gaby",2.5); P raktische Inf ormatik 2, SS 2005, F olien Java;2, (27. April2005) Seite 36 Fahrzeugbeispiel: Quellkode(6) System.out.println("Neues Boot, maxkm:" + boot.Hoechstgeschwindigkeit + " Besitzer:" + boot.Eigentuemer() + " Tiefgang:" + boot.Tiefgang ) ; System.out.println("Anzahl Fahrzeuge nach 2 X new: " + Fahrzeug.Anzahl Fahrt bootsfahrt = new Fahrt(12.0,"Norden",boot); System.out.println("Geschwindigkeit(boot): " + bootsfahrt.Geschwindigkeit()); System.out.println("Richtung(boot): " + bootsfahrt.Fahrtrichtung); bootsfahrt.beschleunigt_5(); System.out.println("Geschwindigkeit(boot): " + bootsfahrt.Geschwindigkeit()); P raktische Inf ormatik 2, SS 2005, F olien Java;2, (27. April2005) Seite 37 Fahrzeugbeispiel: Quellkode(7) System.out.println("MaximalGeschwindigkeit (MeinGolf): " + MeinGolf.Hoechstgeschwindigkeit()); System.out.println("Eigent\u00FCmer (boot): " + boot.Eigentuemer()); bootsfahrt = null; boot.loesche_Fahrzeug(); boot = null; MeinGolf.loesche_Fahrzeug(); MeinGolf = null; System.out.println(); System.out.println("Anzahl Fahrzeuge nach L\u00F6schen: " + Fahrzeug.Anzahl()); } } P raktische Inf ormatik 2, SS 2005, F olien Java;2, (27. April2005) Seite 38