You are on page 1of 12

Plattformunabhängigkeit

- Ein Applet läuft auf allen gängigen Rechnern und
Betriebssystemen (PC, Workstation, UNIX, Windows...)
- Entsprechend auch: Graphische Interfaces (GUI)
- Zeit- / Kostenersparnis in der Softwareindustrie
- Hier aber noch gewisse Probleme mit den APIs

Einführung in das Java-Source
Programmieren
Java-
mit Java Compiler

Java- Maschinensprache einer
Praktikum zur Vorlesung Verteilte Systeme Bytecode virtuellen Maschine (VM)

Browser mit Betriebssy- VM in speziel-
integrierter VM stem mit VM lem VLSI-Chip

Network- Spiel-
Computer Console Handy Waschmaschine

- VM ist ein Bytecode-Interpreter
- programmierter Simulator der virtuellen Maschine
- relativ einfach für verschiedene Plattformen realisierbar

- Effizienzverlust durch Interpretation?
- ggf. in Zielsprache (weiter-) übersetzen

- Prinzip an sich ist nicht neu (vgl. Pascal-P-Maschine)
Java-Einführung, 0 Java-Einführung, 1

Hello World Java-Programmstruktur
- Das "Programm" (eine Klasse!): import ... - Mit import werden anderweitig vorhandene
Pakete von Klassen verfügbar gemacht
class A {
class Hallo {
Klassenkörper - Der Klassenkörper enthält
// Mein erstes Java-Programm!!
- statische Klassenvariablen ("Attribute")
public static void main (String args[]) {
- benannte Konstanten
System.out.println("Hello Java-World!"); Konstruktor {
... - klassenbezogene Methoden
} }
} ein ’;’ beendet jede Anweis- - Konstruktoren sind spezielle Methoden
ung und jede Deklaration
Method_M1 { - Methoden können bestehen aus
- Unix Shell: ... - Parametern
}
%ls - lokalen Variablen
Hallo.java - Anweisungen
Method_M2
... ...
%javac Hallo.java - Bei eigenständigen Programmen
(=/= Applets) muß es eine "main"-
} Methode geben, die so aussieht:
%ls
Hallo.java Hallo.class public static void
class B { main (String args[]){...
%java Hallo
Hello Java-World! - Jede Klasse kann eine (einzige) solche
... ... main-Methode enthalten; sie wird ausge-
führt, wenn der entsprechende Klassen-
- Datei sollte gleich wie die Klasse heißen name beim "java"-Kommando genannt wird

- Klassen können getrennt übersetzt werden
- Kommentare:
// bis Zeilenende - Es gibt keine globalen Variablen etc.
/* oder
so über mehrere
Zeilen */

Java-Einführung, 2 Java-Einführung, 3

ererbte Attribute. int i = 1.14159.mit {.auch einfache Datentypen können in Klassen gepackt werden Java-Einführung. if (fiffi instanceof Hund) h = (Hund)fiffi. malloc (aber: arrays und new) Floating Point. 6 Java-Einführung.Implizite Typkonvertierung Referenzen auf Objekte ("Zeiger") Außerdem neu gegenüber C++ . float [][] matrix. "in Form bringen") .} wird kein neuer Namensraum festgelegt (aber: for-Schleife etc!) .) .B.Statt dessen explizite Typumwandlung: Person p = new Person ("Hans Dampf".. . int --> float) geht auch implizit .B. 5 Variablen. sondern Hund h.Beispiele für Deklarationen: double myFloat = 3.Konvention: --> Typecast (to cast --> hier: "formen".benannte Konstanten ganz mit Großbuchstaben .So geht es nicht (-->Fehlermeldung durch Compiler): int myInt. .Typumwandlung ist gelegentlich bei Referenzen sinnvoll: .Klassennamen beginnen mit einem Großbuchstaben . byte (8 Bits) Antoine de Saint Exupery short (16 Bits) int (32 Bits) long (64 Bits) . Not when you have nothing more to add.Variablen und Methoden beginnen mit einem Kleinbuchstaben . int j.h-Dateien (aber: Pakete) boolean (true/false) . . . "Removed from C/C++" Einfache Datentypen You know you've achieved perfection in design. 4 Java-Einführung.alle nicht-einfachen Datentypen sind Objekte (als Instanzen .zwei im gleichen Namensraum deklarierte Variablen müssen verschieden heißen ."voll qualifizierte" Namen: Paketname.) sind in Namen zulässig .Threads in der Sprache (als Objekte) . union (statt dessen: Klassen) . finalize) .Attributname Java-Einführung. einige "grobe" Regeln: myInt = (int)myFloat. IEEE 754-Standard . Bezeichner...Bezeichner müssen sich von keywords unterscheiden . importierte Typen) . können mit Anweisungen "gemischt" werden . String.Datentyp "boolean" von vorgegebenen oder eigenen Klassen) .Java ist eine streng typisierte Sprache ...lokal deklarierte Bezeichner können andere Bezeichner verdecken (z. . exceptions) Wahrheitswerte (nicht mit Integer kompatibel!) .es gibt Standardklassen und -methoden (z. . Deklaration Typkonvertierung . .Sonderzeichen (Umlaute etc.Namensräume.Klassenname.es gibt keine (absolut) globalen Variablen etc. class..Deklarationen müssen nicht am Anfang stehen.. String s = "Hallo".B.Gelegentlich muß dies jedoch durchbrochen werden . // mit Initialisierung float x_koordinate.Strukturen.Funktionen (statt dessen: Methoden) float (32 Bits) . double myFloat = 3.Mehrfachvererbung (statt dessen: interfaces) double (64 Bits) .. free (aber: Garbage-Collecor. Tier fiffi.Komplexere Datentypen lassen sich mit Klassen bilden .Umwandlung hin zu einem größeren Wertebereich . File. Stack. 50 keywords (int.. while..es gibt ca. #ifdef.Präprozessor: #define. Zeichen (Unicode! --> "Internationalisierung") . 1974).Destruktoren.Es gibt natürlich auch arrays und strings (--> später) . Integer (Zahlen im 2er-Komplement): But when you have nothing more to take away.goto (statt dessen: break/continue.Zeigerarithmetik.14159.Überladen von Operatoren .#DEFINE (statt dessen: final static) char (16 Bits) . myInt = myFloat.typische Namensräume: Methoden und Klassenrümpfe (z.Character im 16-Bit-Unicode ("Internationalisierung") ..) --> Compiler kann viele Typfehler entdecken . #include. 7 .. // 2-dimensionales array int myInt. y_koordinate.

in.) bitwise AND & op-.Binäre arithmetische Operatoren postfix operators [] . ggf.print("Feb"). Java-Einführung. while..do-while (Auswertung erst am Ende der Schleife.out.print("Fehler"). op2 creation or cast new (type)expr * op1 * op2 multiplicative * / % / op1 / op2 + - % op1 % op2 (Rest bei Division) additive shift << >> >>> . Zahlen in 1. .return (Methode beenden. wenn op1 größer als op2) assignment = += -= *= /= %= ^= &= ..Shortcut ++ und -.(Inkrementieren / Dekrementieren) relational < > <= >= instanceof equality == != op++ (Wert vor Inkrementierung auswerten) ++op (.. i++) case 3: System.. for(int i=2. break ohne label beendet den innersten switch (monat) { ohne break wird mit dem näch- } sten case-Zweig fortgefahren Kontrollblock (for.Logische Operatoren .out. logical AND && logical OR || .. (params) expr++ expr-- + op1 + op2 (auch für Stringkonkatenation!) unary operators ++expr --expr +expr -expr ~ . Terminierung..out.out.continue (Sprung an das Ende einer ggf. >= op1 >= op2 < op1 < op2 <= op1 <= op2 . 10 Java-Einführung. op1 .println(i).print("Jan").nach. Konstanten definiert int monat.. Test: Blockes nicht (schon) deklariert sein default: System. { int j=2.exception-handling .Bit-Operatoren: & | ^ ~ >> << >>> Java-Einführung. i <= last.print("März").. numDays = 31. while (j*j <= i) { } Anweisungsblöcke in {..Ansonsten (und in Zweifelsfällen) Klammern verwenden! == op1 == op2 (gleich) != op1 != op2 (ungleich) . . nicht ausgewertet! Java-Einführung. } case 7: case 8: } case 10: // Hier sind i und j nicht mehr sichtbar case 12: //.) case 1: else case 3: else-Teil ist natürlich optional case 5: j++.} if (i%j == 0) { System. . Operatoren Priorität der Operatoren ... //. . .Relationale Operatoren ? : conditional > op1 > op2 ("true". Schleifen- körper wird mindestens ein Mal ausgeführt) do { statements } while (booleanExpression). break Test.. mitRückgabewert) } . i und j dürfen außerhalb des for. break. 8 hier wird der zweite Operator von && ggf. . break.. .read() != -1)). . break. 11 . . ..es werden alle Operanden vor Ausführung der Operation ausgewertet && op1 && op2 ("und") . Inkrement case 1: System. . 9 Kontrollstrukturen Switch class CompNum { so werden benannte static final int last=100.last*/ case 2: System. . . break.switch . benannten Schleife) . .Weitere Kontrollkonstrukte: case 4: . bitwise exclusive OR ^ --op | bitwise inclusive OR .out.Ausnahme bei && und | | : || op1 || op2 ("oder") if((count > NUM_ENTRIES) && ! !op (Negation) (System. switch (monat) { /* Zusammengesetzte for-Kontrolltripel: Initialisierung. switch...Auswertungsreihenfolge von links nach rechts . break.weitere Abkürzungen: i = i+7 ersetzen durch i += 7 etc.

System."valueOf" ist eine Methode von Integer. 13 Objektorientiertes Programmieren Klassen Weltsicht: Die Welt besteht aus verschiedenen inter. float.out.valueOf(Zeile)..Strukturierung und Implementierung der Methoden (= "Klasse" gleichartiger Objekte) Java-Einführung.Festlegung der einzelnen Dienstleistungen . Rechner) Der InputStream muß beim Aufruf des while(true) Konstruktors angegeben werden . templates. .es gibt noch einige weitere Methoden (skip.intValue(). .io.erst abgeleitete Typen von InputStream enthalten Methoden. liefert -1 bei Dateiende.* . System.sind von einem bestimmten Typ .sind autonome gekapselte Einheiten (= Module) kooperierender Objekte . 15 . public static void main (String args[]) throws java. 14 Java-Einführung. Verallgemeinerung. zu lesen (z.readLine().in).Strukturierung der Problemlösung in eine Menge . Festlegung .Entsprechend kann man floating-point-Zahlen Java-Einführung.System ist eine Klasse mit Schnittstellenmethoden zum new DataInputStream(System.println(i). Spezialisierung. "readLine()" für "Zeile" um ganze Zeilen etc..Allgemein: "Reaktion" auf Aufruf einer "Methode" ..Entwurf der Objekttypen (= Klassen) . Anfang einer Methode . Prototypen. Methoden (innerhalb von "Dateiklassen") count++.System..println erzeugt zusätzlich noch ein newline .print gibt das übergebene Argument aus und daraus einen String konstruiert .Die Klasse DataInputStream enthält die Methode .enthalten Methoden als Anweisungskomponenten Typ A Ding 5 Typ B realisieren die Funktionalität der Objekte sichtbare / verborgene Methoden Ziel: Betrachteten Weltausschnitt strukturkonsistent mit .in ist der Standard-Eingabestrom (vom Typ InputStream) { . Ein. ansonsten einen Wert zwischen 0 und 255 für das Zeichen i += Integer.Zurückliefern von Variablenwerten oder Berechnungsergebnissen . string.. in diesem Paket stehen die Ein-Ausgabe- while (System. .und Ausgabe Einlesen von Zahlen int count = 0.Herausfaktorisierung gemeinsamer Aspekte verschie- dener Klassen ==> Hierarchie.Durchführung von Berechnungen .println("Eingabe hat " + count + " Zeichen. Muster. enthält ."Integer" ist eine Wrapper-Klasse.können zu Objekten "instanziiert" werden agierenden "Dingen".out: Standard-Ausgabestrom readLine.haben einen eigenen Zustand (= lokale Variablen) .bieten anderen Objekten Dienstleistungen an . . welche Konver- tierungsroutinen etc..realisieren abstrakte Datentypen Ding 2 Typ A Typ B .out. class X { System. String Zeile. close. boolean.besitzen ein Verhalten (wenn sie aktiviert werden) .read() != -1) import java. int.B. .Entwurf der Objektbeziehungen ("Protokoll") .enthalten Variablen ("Attribute") machen den Zustand der zugehörigen Objekte aus sichtbare ("public") / verborgene ("private") Variablen Ding 3 .sind hierarchisch (= baumartig) organisiert kommunizierenden Objekten abbilden und modellieren.a.in: DataInputStream ein = genannt werden .Klasse DataInputStream) substituieren . . ausführenden System (Betriebssystem.besitzen eine Identität der Klassenattribute etc.IOException die auftretbaren exceptions { müssen nach throws am int i = 0.) } man könnte hier auch .. die einen String nach Integer konvertiert . welche sich klassifizieren lassen. Klassenbibliothek .").Änderungen des lokalen Zustandes . einlesen Java-Einführung."intValue" ist eine Methode..Feinplanung der einzelnen Methoden. die aus einem Integer-Objekt den int-Wert "herausholt" . ausgegeben werden .System.read liest ein einzelnes Zeichen. 12 etc.sind daher Schablonen. Vererbung ==> Klassenhierarchie Simulationssprache SIMULA war die erste objektorientierte Programmiersprache (1967) Objektorientiertes Programmieren = Objekte: .stellen den Typ der daraus erzeugten Objekte dar Ding 1 Typ B Ding 4 . welche alle Zeichen bis Zeilenende liest .es können u.io. Zeile = ein.in.

{ return Jahr<d.println("Es gibt " + /* true */ liefert 32 Datum. public Datum() /* Datum mit Wert 0.0." + Jahr). richtet sich nach der Signatur beim new-Aufruf. liefert 31. Jahr==d.56).0. ..frueher_als(d1)). }. Zahl++.Klassen können also abstrakte Datentypen implementieren Java-Einführung.. System.Statische Variablen in Klassen wirken also ähnlich wie "globale Durch diese in der Klasse "Datum" definierten Operationen kann man Variablen" in anderen Sprachen. } System. andere Konstruk.97 mit einer unterschiedlichen Signatur. man kann (nur) damit die neuen Objekte (deren Variablen) initialisieren. Er wird bei Erzeugen eines Objektes auto. Januar[i]. Monat = M.).Datenstrukturen mit zugehörigen Operationen }.Drucken().referenzierte Objekte damit "by reference" private int Tag.. int M. 17 Statische Klassenvariablen Methoden mit Parameter static-Variablen existieren für alle Instanzen einer . { Tag = T.ganz immer den gleichen Wert ==> Kann zur Kommunikation zwischen analog.56). liefert 0.03.56 Jahr==d. Monat.Setzen(31. .Jahr && Monat==d. Ostermontag.Wertübergabesemantik ("by value") public static int Zahl =0. Operator ’<’ vergleichen kann! Java-Einführung.0 Wert 0. i++) class Beispiel { Januar[i] = new Datum(i. boolean frueher_als(Datum d) Datum Geburtstag = new Datum(23.Drucken().out.03.println(Tag + ". Monat = M. wie man beispielsweise ganze Zahlen ("int-Objekte") mit dem diesen Objekten benutzt werden. . . i<=31.01.Bei Aufruf von Methoden kan man Parameter übergeben Klasse nur ein einziges Mal! class Datum { .03.Auch Referenzen "by value" .Drucken().genauer: eine Referenz. die auf Datum-Objekte zeigen kann .97). class Beispiel { .Drucken().println("Datum mit Ostermontag.Zahl + " Datum-Objekte").. meter vom Typ "Datum" wie vorhin tor verwendet { .Objekte werden mit new erzeugt. ist also nicht void Datum[] Januar = new Datum[32]. } public Datum(int T.out... System. 19 . Jahr. Datum d2 = new Datum(27. Statt Datum hätte man auch "Geburtstag" /* false */ oder "Glueckstag" schreiben können } Hier wird die Funktion "frueher_als" aus dem Objekt d2 aufgerufen.. Diese Klasse hat einen zweiten Konstruktor Ostermontag. 16 Java-Einführung.. .out.97). for (int i=1.0. Zuweisung von Referenzen && Tag<d. dabei wird eine Referenz Monat + ".Monat Glueckstag = Geburtstag. Welcher } Konstruktor genommen wird.. gegründet"). 18 Java-Einführung.Drucken().Tag. }. }.Eigentlich sollte "Setzen" zumindest einen Plausi- bilitätstest machen (Monat ≤ 12.Jahr || Geburtstag. int M. --> abstrakte Datentypen . liefert 23. nicht sichtbar hier wird der erste Konstruktor aufgerufen Eine Metode mit dem gleichen Namen wie class Beispiel die Klasse selbst stellt einen "Konstruktor" dar.Zugriff auf Methoden und Variablen ("Attribute") sind von außerhalb eines Objektes mit Punktnotation { private int Tag.Jahr && Monat<d. Jahr. { Datum Ostermontag = new Datum().alle Referenzen haben den Defaultwert null public void Drucken() { System. } auf das neu erzeugte Objekt zurückgeliefert Dies sind zwei Methoden . liefert 23.56 }.} hier wird der class Datum d ist ein formaler Para- . { public static void main (String args[]) matisch aufgerufen.println(d2. Datum d1 = new Datum(23.3.3. Glueckstag.Monat || Datum Glueckstag.frueher_als(d2)). Monat.. Tag ≤ 31 etc. Alle Objekte einer Klasse sehen nun also Datum-Objekte bezüglich früher / später vergleichen . public void Setzen (int T.56). und zwar mit Objekt d1 als Parameter." + .0. int J) .out. { .println(d1. Jahr = J. gegründet */ { System. Methode liefert einen Boole’schen } Wert zurück.03."Ostermontag" ist eine Variable vom Typ "Datum". public Datum() {. Jahr = J. Eine Beispiel-Klasse in Java Verwendung von Klassen class Datum Der Name der Klasse Diese 3 Attribute .3.out. int J) { Tag = T.0...

56).. "Autoteil" eines PKW Beifahrer p.Radzahl public static void main (String args[]) { .PS = 70.Zuladung geht faktorisieren und in eine überge- spezielle Fahrzeuge (z.PS Auto a = new Auto().Gleichheit ist keine "natürlich gegebene" Eigenschaft./*false*/ "is-a"-Relation Datum d3 = new Datum(23."gleich" ließe sich natürlich auch direkter. sen Einschränkungen (--> später) void print() Heißen noch genauso.Eine abgeleitete Klasse kann zusätzliche Attribute Auf "weiter oben" definierte Attribute und Methoden definieren. }.Ein VW ist ein PKW ist ein Auto ist ein Fahrzeug . Methode anders definieren.out. gehört damit public float Hubraum.3 d2 56 56 name 56 .56). .was würde ein Vergleich mit dem Operator "==" bringen? Klassenhierarchie: Basisklasse (auch: class Datum. Zugriff auf Variablen p.B.. { public int Beifahrerzahl.km-Stand Fahrzeug f = new Fahrzeug(). .mit gewis- oder einige Methoden redefiniert.B.03. ==> Man würde z. in "Fahrzeug" dekla- alle "Methoden" der Basisklassen.print().Radzahl .Eine Trompete ist ein Blasinstrument ist ein Musikinstrument . Elektroautos) diese natürlich nicht! ordnete Klasse einbringen. VW Ford phase beim objektorien- Datum d2 = new Datum(27.out. zugegriffen werden - diese sind Teil der Fahrzeug: Auto: PKW: class Beispiel { abgeleiteten Klasse! .Radzahl = 4.. Eigenschaften der zugehörigen Basisklasse(n).56). Hier wird die Funktion "frueher_als" aus dem Objekt d PKW LKW aufgerufen. p.Außer: Es werden einige davon unsichtbar gemacht class PKW extends Auto Methoden) . 21 Abgeleitete Klassen Ein Beispiel in Java class Fahrzeug . Hierarchiestufen erzeugt.PS .. {System.Beifahrerzahl = 5. nicht für alle Fahrzeuge gleichermaßen definieren.Beachte: "this" ist ein Schlüsselwort. }.03.03.km-Stand .. mit dem stets ein Zeiger auf das aktuelle Objekt zurückgeliefert wird . Gleichheit und "this" Vererbung ("inheritance") .Eine Methode "Berechne_KFZ_Steuer" läßt sich p. in "Auto" eine Standardmethode Idee: Gemeinsame Aspekte heraus- vorsehen (Benutzung von "Hubraum").Anzahl LKW l = new LKW().gleich(d3)). und Methoden des . Erweiterung der Klasse class Auto extends Fahrzeug "Fahrzeug": Alles. und zwar mit "einem selbst" als Parameter! Entwurf eines Klassen- baumes ist wichtige class Beispiel . Aufgabe der Entwurfs- Datum d1 = new Datum(23.println(d1..println(d1. Objekte) der verschiedensten eines Autos .Eine abgeleitete Klasse besitzt automatisch alle { public int Radzahl }.. System. 22 Java-Einführung.out. abgeleitete Klassen boolean gleich(Datum d) von "Fahrzeug" (auch: { return !frueher_als(d) && Fahrrad Auto “Unterklassen” oder !d./*true*/ . tierten Programmieren! System. . p. 20 Java-Einführung.km-Stand .Radzahl .Hubraum = 1794.} }.welche der Paare von Referenzen sollen als gleich gelten? . was . ohne Eigenschaften werden ("von oben nach Rückgriff auf "frueher_als" realisieren unten") an abgeleitete Klassen vererbt! Java-Einführung. Hier werden Instanzen (also "Fahrzeugteil" .Ein Fahrzeug hat Räder ==> ein PKW hat Räder . auch zu "Auto" (sowohl Attribute als auch .gleich(d2)).}.. mit ’p’ bezeichneten PKW-Objektes. “erweiterte Klassen”) .Hubraum . Java-Einführung.Konkret: Sie besitzt alle "Attribute" und { public int PS.Hubraum PKW p = new PKW().frueher_als(this) . riert ist. 23 . class LKW extends Auto kann ohne weiteres { public float Zuladung.println("Radzahl: "+ Radzahl tun aber etwas anderes! + Beifahrerzahl: " + Beifahrerzahl). jedoch für p. “Oberklasse”) Fahrzeug boolean frueher_als(Datum d).Idee: Vorhandene Klasse zur Definition einer Sie muß erst geeignet definiert werden (Abstraktion!) neuen "ähnlichen" Klasse verwenden Erweitert oder angepaßt an spezifi- d1 27 27 d4 12 Objekt sche Bedürfnisse ("Spezialisierung") 3 3 d3 Referenz.

Radzahl = 3. new .} class PKW extends Auto .i" die obere Variable aus PKW und LKW erreicht werden } } class LKW extends AUTO { int i... f = a.Die Umkehrung gilt jedoch nicht! f = p. Auto p.out.Radzahl).println("AUTO: " Auto Auto Auto + i + " " + j). k.. */ . Java-Einführung. a.Hubraum = 1702. Zuweisung von den "temporären" AUTO(int ii) { Variablen des Konstruktors an i = ii.Variable f kann Fahrzeugobjekte speichern.out..println(f. int Radzahl.Hubraum). j = ii+1. eine Variable Werte untersch.println("PKW: " + i + " " + j + " " + k). "permanente" Variablen Ein_Auto Ein_PKW Ein_LKW } void Meldung() { System. Allerdings kann mit "super. class Fahrzeug {. Zuweisungskompatibilität Ein Java-Beispiel . */ .println ist aber über f nicht zugreifbar! einem Parkplatz für Fahrräder jedoch keine beliebigen Fahrzeuge! (f..f.. . als auch zeitweise auf LKW-Objekte zeigen. k= m= PKW(int ii) { hier wird der Konstruktor Anderes_Auto super(ii*2).} len vom Typ der Basisklasse zugewiesen werden.println(((Auto)f).. /* incompatible types for =. 27 .. 26 Java-Einführung.a = f.println("LKW: " + i + " " + j + " " + m). Typs haben kann. class Auto extends Fahrzeug {. else System. . */.out.Fahrzeug f. Man nennt diese Eigenschaft auch Polymorphismus. 24 Java-Einführung.Merke also: auf Basisklasse .out.Durch Umtypen kommt man aber notfalls auch über f an den Hubraum des Auto-Objektes: System.. .println("kein Auto. die in einer Unterklasse i = ii.. .. "Gleichnis" zur Zuweisungskompatibilität: Auf einem Parkplatz für f = a.println(((Auto)f).Hubraum)..out. da . 25 PKW/LKW-Beispiel (1) PKW/LKW-Beispiel (2) class AUTO { int i.Daher kann f auch Autoobjekte speichern. abgestellt werden. Radzahl . Ein PKW ist ein Auto .Variable a kann Autoobjekte speichern. System.) .Hubraum). Objekte und Auto-Objekte speichern PKW . (Variable "m" statt "k") i = ii. PKWs.. kein Hubraum!"). } ist eine überdefinierte Variable (hier: i) void Meldung() { verdeckt und nicht direkt zugreifbar. Auf raum zugewiesen.. zur Laufzeit sowohl zeitweise auf PKW-Objekte. Auto a.Radzahl = 4.out. /* System. . Es wurde zwar Radzahl und Hub- Fahrzeuge dürfen Autos.Hubraum = 1100. } void Meldung() { System. und ein Fahrzeug Hubraum a = p. Fahrräder.Hubraum ist aus gutem Grund verboten: Auf f könnte Eine Variable vom Typ "Basisklasse" darf ja zufällig ein Fahrrad (ohne Hubraum!) "parken"! ! auch auf ein Objekt der abgeleiteten Klasse zeigen! . der Oberklasse aufgerufen Für Methoden. ist verboten! /* a = f.Ein Fahrzeug ist aber kein Auto! Andersherum geht es nicht! a. m = ii+1. (hier: PKW bzw. /* No variable Hubraum defined in Fahrzeug */ genauer: Zeiger . } die Variable "i" existiert i= i= i= } auf allen Ebenen! j= j= j= PKW LKW class PKW extends AUTO { i= i= int i. LKW) definiert sind. j. LKW(int ii) { LKW ganz analog zu PKW super(ii*2)..Aber wenn dort "gerade" kein Auto (sondern ein Fahrrad) parkt? ein Zeiger auf Objekte verschiedenen Typs zeigen kann.Ein Auto ist ein Fahrzeug. Auto a. auf Hubraum System. PKW p.out..float Hubraum. Eine Fahrzeug-Variable darf PKW- f = a.Objekte von abgeleiteten Klassen können an Variab.out. } } Java-Einführung. Fahrzeug Fahrzeug f. k = ii+1. Dann gibt es einen Laufzeitfehler "ClassCastException"! (Bzw. m. p.Dem kann man wie folgt vorbeugen: if (f instanceof Auto) Beispiel: Eine Variable vom Typ "Zeiger auf Fahrzeug" kann System.

StringBuffer : veränderbare Zeichenketten .out.out. // y zeigt auf das gleiche Objekt Ein_AUTO.length()).append(source. 29 Zeichenketten (Strings) Noch mehr Strings. ..toString()..i).println(Ein_PKW.println(Anderes_AUTO.1996).Umwandlung von Zeichen (z.1). /* AUTO: 2 6 */ Januar[1] = new Datum(01. // x[3] ist daher jetzt auch 9 Ein_PKW = new PKW(22). Can't convert PKW to LKW */ Java-Einführung.Statt dessen Wertevergleich: s1. */ /* Incompatible type. oder >0) int i = 7.i). Anderer_PKW. // Die Verweise sind zunächst null. // Konkatenation . // Die 7 Zwerge .2/ for (i = (len . /* 2 */ Anderes_AUTO.und byte-Felder in Strings msg = null.out. Anderes_AUTO = Ein_AUTO.out.println(Ein_PKW. for (int i=0.println(Ein_PKW.Gibt es online an verschiedenen Stellen und in Büchern...01.out. /* 45 */ 03 01 1996 Datum[1] Januar System.i).out. null System. class ReverseString { . /* AUTO: 5 6 */ y[3] = 9. len = source. Januar[27].println(msg. z.Teilstrings System. /* LKW: 333 667 334 */ // Zugriff: .01.out.println(Ein_AUTO. LKW Ein_LKW = new LKW(333). Ein_AUTO.Mehr dazu in der API-Beschreibung zu java. /* 44*/ System. /* 5 */ System.out.B.println(Ein_AUTO.out.out. Januar[2] = new Datum(02.length()./ Kleinschreibung) .lang String reverseIt(String source) { int i. // String-Objekt wird (liefert einen int <0.Meldung().println(((AUTO)Ein_PKW). System..com/products/jdk/1. es gibt eine Vielzahl } von hübschen Methoden } Java-Einführung.1996)... 30 Java-Einführung. // array of int PKW Ein_PKW. 28 Java-Einführung.. Groß.String : Zeichenkette selbst kann nicht verändert werden . Anderes_AUTO. i < x.Umwandlung von char.. System. /* 6 */ int [] w = new int[7]. /* 23 */ Ein_PKW. PKW/LKW-Beispiel (3) Felder (arrays) AUTO Ein_AUTO. .j).compareTo(s2) String msg = "Die".Vergleich mit == ist oft nicht sinnvoll (Referenzvergleich) . =0. /* Ein_LKW = Ein_PKW . */ /* No variable k defined in class AUTO */ y = x. // Länge 7 (Indexbereich 0.. } return dest.Vergleich von Strings: . int [] x.j). // Erst so zeigen sie auf ein Datum-Objekt: System.out.k). // 12 .B. i >= 0. Ein_LKW. System.println(((AUTO)Ein_PKW).Meldung(). .6) Ein_AUTO = new AUTO(5).charAt(i)). // So ginge es auch msg = msg + " " + i. i--) { docs/api/overview-summary.: StringBuffer dest = new StringBuffer(len).equals(s2) .out.i = 2. // automatisch erzeugt msg = new String("Die").Meldung().println(Ein_AUTO.html dest. System.01..i).sun. x = new int[7].println(msg).Es gibt eine Vielzahl von Methoden und Konstruktoren msg = msg + " Zwerge".1996). .Umwandlung von anderen Datentypen in Strings (und umgekehrt) String b = msg. Januar[31]= new Datum(31.j).. /* PKW: 22 45 23 */ 07 01 1996 Datum[2] null durch "casting" ("Typkonversion") kann auf die null verdeckte Variable "i" dennoch zugegriffen werden Datum[] Januar = new Datum[32]. 31 .length. // Die 7 Zwerge .k).Meldung(). // so geht es auch /* System.Lexikographische Anordnung mit s1.Zeichenketten sind durch 2 Standardklassen realisiert: .println(b). i++) x[i]=17. http://java. /* 45*/ // Damit wird ein array mit 32 Verweisen // auf potentielle Datum-Objekte angelegt. /* 22 */ System.Jahr .

} int f(Auto x) { return 6.kleiner(Tab[j])) { class Zug {. length of the argument string is zero. j++) class Bus extends Auto {. (und getestet) werde. // 6 . public int indexOf(int ch).Das Sortierverfahren kann also bereits implementiert Bus b = . // 7 dazu.. int count). auf den Objekten! . // 3 f(double x) gibt! zum Sortieren anderer Datentypen verwenden! i=t.. 32 Java-Einführung. a value public String(char value[]. j<Tab. Returns: public String(char value[]).Einmal entwickelt. wie die Relation "kleiner" int i.Gleicher Methodenname bei unterschiedlicher abstract class Sort { Signatur (=Typ und Anzahl der Parameter) möglich abstract boolean kleiner (Sort y).) i=t. public int indexOf(String str.Auszug aus der API-Beschreibung (1) Auszug aus der API-Beschreibung (2) Class String compareTo public final class java. // 5 keine Objekte erzeugt werden. wird die speziellste genommen . Parameters: public String(byte ascii[]. // 2 Fehler. // 5 (int. Object o = . data . }. int j = 0. . Achtung: Es wird class Test { Tab[j] = swap.lang. public boolean endsWith(String suffix). Zug z = . funktioniert unser Sortierverfahren! Test t = .length.auch Konstruktoren können überladen werden static void sort(Sort[] Tab) { wieso static? for (int i=0. public String concat(String str)..Object public int compareTo(String anotherString) { // Constructors Compares two strings lexicographically...14). int fromIndex).Wir fordern.. } .14). Returns: public int lastIndexOf(int ch. float.f(a). int hibyte). public int hashCode(). i++) class Auto {. public String(byte ascii[]. // Methods public char charAt(int index). bevor überhaupt die Daten 2..In der abgeleiteten Klasse muß außerdem Als totale Ord. } } Das einfache Sortierverfahren ("deletion sort") ist ineffizient! // char f(char z) { return 4.. A string that represents the concatenation of this object's characters public void getChars(int srcBegin. int dstBegin). concat public int compareTo(String anotherString).the String which is concatenated to the end of this String public void getBytes(int srcBegin.Sort ist eine abstrakte Klasse (von solchen können i=t.. public int lastIndexOf(int ch). public static String Concatenates the string argument to the end of this string. char dst[]. and a value greater than 0 if this string is public String(StringBuffer buffer). lexicographically greater than the string argument. class Beispiel {. i<Tab.wenn sich mehrere Methoden qualifizieren. ... followed by the string argument's characters. daß die zu sortierenden Objekte vom Typ // with a different return type einer von Sort abgeleiteten Klasse sind... Auto a = .f(i).f(z). // 1 i=t. if (Tab[i]. hiervon abgeleitete Klassen zu definieren). int f(Object x) {return 5.. 34 Java-Einführung. Alle Klassen erweitern (direkt oder . } } int f(double y) { return 2. int offset. int dstBegin). int fromIndex)..String extends java.. int srcEnd.length. wenn es kein f(int x) gibt! selbst bekannt sind! i=t..f(5. sie dienen nur i=t.f('c'). The value 0 if the argument string is equal to this string... string argument... wenn es kein . public int indexOf(int ch. int fromIndex). double y){ return 7. anotherString . 35 . 33 Abstrakte Methoden und Klassen Überladen von Methoden .Unabhängig davon. . less than 0 if this string is lexicographically less than the string public String(String value).... absteigend sortiert! int f(int x){ return 1. int count). } // ERROR: Methods can't be redefined . Java-Einführung. short f(int x. str .f(3. . int count). kann man den Algorithmus auch i=t. public int lastIndexOf(String str). int offset.. a String that contains the characters of the character array. Parameters: public int lastIndexOf(String str. Brüche als rationale Zahlen... wenn es kein f(char x) gibt! i=t. public String concat(String str) public static String copyValueOf(char data[]). public boolean equals(Object anObject). for (int j=i+1. Sort swap = Tab[i]. int hibyte. then this object is returned. If the copyValueOf(char data[]. Zeichenketten. Java-Einführung. public String(). copyValueOf public int indexOf(String str). 3.f(b)...the String to be compared int offset.the character array public int length(). Tab[i] = Tab[j]. nungsrelation die Funktion "kleiner" realisiert werden. Parameters: public boolean equalsIgnoreCase(String anotherString). // 6 1. } } int f(char z) { return 3. int srcEnd. Returns: byte dst[].f(o).lang. public static String copyValueOf(char data[]) public String intern(). int fromIndex). indirekt) die Standardklasse Object definiert ist..

Bsp: interface Menge { int cardinal()...io ...lang . and grabbing .I "enthält" alle Methoden von A und B (und zusätzlich M) ..spiegelt sich in der Verzeichnishierarchie wieder java. "diamond inheritance problem" so manchmal lösbar: . system properties.Paket = (zusammengehörige) Menge von Klassen (API.Der Typ des Interfaces (hier: "Menge") kann mit seinen Methoden anderswo benutzt werden .Namenskonflikte beim Erben von mehreren Eltern müssen allerdings gelöst werden. and other sources. IP addresses.lang. checkboxes. string manipulation..image .Interface muß von anderen Klassen implementiert werden class Z extends Y implements X {. buttons. Java-Einführung.. including URLs..und Interfaces und Unterpakete java. strings. objects.. random number genera- . W void remove (Object x).B. dialog boxes.} X Y class Y implements W {. return i.das sogen.String.enthält also nur (implizit) abstrakte Methoden (und Konstanten) . compiler.z. security.. aber nicht implementiert . 38 Java-Einführung. Paket Klasse Methode menus.: java. strings.Attribute / Methoden von Klassen können vollquali.applet Package that enables the creation of applets through the Applet class. and threads.util .Klassen können nicht von mehreren Eltern erben nur deklariert. . cropping.oder import java. ..die von Z ererbten Attribute und Methodenimplementierungen .h.Wichtig für Strukturierung und Zugriffskontrolle Package that provides classes to manage input and output streams to read data from and write data to files. time. } ."lang" im Paket "java" --> "java. i++ . mit dem Paketnamen) benannt werden java. Schnittstellen ("Interfaces") Mehrfachvererbung ..eine Klasse dagegen kann nur eine einzige Klasse erweitern Java-Einführung.} . (es wird alles aus diesem Paket importiert) java... date.Importieren von Klassen (als Namensabkürzung) java. Standard-Pakete) . TCP sockets. interface W {. 36 Java-Einführung.B. lists.awt . runtime.Bsp: Menge M.Falls package-Deklaration fehlt: "unnamed package" java. bit sets.awt. tion. including numerics.lang" package that is automatically imported into every Java program.. notification. fiziert (d. UDP sockets. z. B { int M(). setting pixel values. scrollbars. . import java.Klassen und Attribute von Klassen (z. package abc..B.Klassen befinden sich immer in Paketen Package that contains miscellaneous utility classes.util..B.substring Package that provides an integrated set of classes to manage user interface components such as windows. and enumeration of data structures.Random Package that provides classes for managing image data.Paketdeklaration direkt am Anfang einer Quelldatei.Hierarchischer Aufbau Package that contains essential Java classes.. including (es wird diese Klasse importiert und kann als "Random" benutzt werden) color models. . die alle Methoden . including generic data structures.} .Bsp: interface I extends A.. public int cardinal().z.* snapshots.util. } .. .) .insert(. ..).net Package that provides classes for network support.Interface = (abstrakte) Klasse. color filtering. 37 Pakete Die Java-Umgebung . and text fields.Bsp: class S implements Menge { Z . { . M. void insert (Object x). Methoden) sind ohne weitere Angaben nur im eigenen Paket sichtbar / zugreifbar java.} } interface X extends W {. 39 .Interfaces dienen als (teilweise!) Ersatz dafür . This is the only ..Interfaces können mehrere andere erweitern . (AWT = Abstract Window Toolkit. können nur aus Y (und nicht indirekt doppelt aus W stammen) while .

final: no sub-classes remove. The Variable Modifiers: Properties can be saved to a stream or loaded from a stream.Ausnahmen sind Fehlerereignisse import java. 40 Java-Einführung. in denen man die anzugebenden Modifikatoren vidual bits can be examined. System.. void readFile() { // Attempt to open the file. java. empty."private protected": nur in Unterklassen (und eigener Klasse) sichtbar . the size of a Vector can grow or shrink as Method Modifiers: needed to accommodate adding and removing items after the Vector final: no overriding has been created. However. try { // determine its size. which maps keys to values.es gibt Tabellen..Vielzahl von Methoden etc.) public: usable from other packages abstract: no instances.werden oft vom System ausgelöst ("throw") public class EA_Beispiel Da wir Fehler selbst abfangen. . // doSomething. catch (Throwable e) oben in der Hierarchie und { fängt damit alles ab } catch (fileOpenFailed) { // doSomething. protected: like variables. set. . public. volatile (beide bei Threads) und transient (bei persistenten Objekten. . .Bessere Strukturierung durch "try" und "catch": FileOutputStream out = null. } // read the file into memory. it contains components that can be accessed using an integer index. { } catch (fileCloseFailed) { ps. size.out. (Methods: put.. können . // doSomething.Fehlerbehandlung muß auf diese Weise nicht mit dem "normalen" System.Das Paket "java. static: class method abstract: implement in subclass native: implemented in C private.h.println("Error in opening file"). Any Class Modifiers: non-null object can be used as a key or as a value. verzichten! .Reihenfolge der einzelnen Modifikatoren beliebig Klassen zur Verwaltung von Daten: .util" enthält einige interessante .nicht einfach zu benutzen . only sub-classes Class Properties (extends Hashtable) The Properties class represents a persistent set of properties." // specified by the first parameter.awt*) sind komplex . Diese Fehlerklasse ganz // close the file. out = new FileOutputStream(args[0]). get.*. // allocate that much memory.leider etwas verwirrend This class implements a vector of bits that grows as needed. } catch (readFailed) { try Fehler hierbei würden nicht abgefangen! // doSomething. Each key final: constant and and its corresponding value in the property list is a string.es gibt weitere Modifikatoren: synchronized. Indi.exit(1). pop.ein E/A-Beispiel .. } Z.io. // doSomething.out. contains.. out. 43 ..util Zugriffsmodifikatoren .exit(1). 42 Java-Einführung.println("I/O Error"). } } Über diese Variable kann man } catch(IOException e) mehr über den Fehler erfahren { . Programmcode verwoben werden System. } catch (sizeDeterminationFailed) { System. if we try { // can't display error and quit // open the file. protected: + sub-classes Class Vector public: anywhere Like an array.Einige Standardpakete (z. or cleared. peek.B. java.println("Hello World").w.können aber auch explizit im Programm ausgelöst werden // Prints "Hello World" to a file wir auf "throws. derzeit noch nicht benutzt) Java-Einführung.: Zugriffsrechte "falsch" } catch (memoryAllocationFailed) { PrintStream ps = new PrintStream(out).Durch Modifikatoren wird i. static: class variable private: use only inside class Class Stack (no modifier): + in Package Methods: push. } } Shortcut zum Verlassen des Programms } Java-Einführung.können abgefangen und behandelt werden ("catch") { public static void main(String args[]) { . je nach gewünschter Situation nachsehen kann Class Hashtable This class implements a hash table. Sichtbarkeit des Namens) geregelt Class BitSet . 41 Ausnahmen (Exceptions) Ausnahmen .B. der Zugriff (d.close().

printStackTrace oder getMessage (letzteres für genauere Fehlermeldungen): .. read .println("Fehler: " + e./ Ausgabe (IOException) . 44 Java-Einführung. aber was dann? .Kann dann mit "throw" ausgelöst werden class IllegalesDatum extends Throwable { IllegalesDatum (int Tag..oder durch Angabe. int M.int Monat." + Jahr). .Suche eines passenden "error handlers" try { value = value / x.B..Beispiele: Zugriff über Null-Referenz.."passend" entsprechend der Hierarchie der Fehlerklassen System.Eigener Ausnahmetyp muß von java.. . z.B.B.out.B.Ein.3. . } class Beispiel ..).sucht den nächsten passenden handler catch(ArithmeticException e){ .) throws java.main(Datum.Wichtige Fehlerklasse: Laufzeitfehler System.03.Erzeugen von Objekten mit "new" Methoden zur Verfügung.Meldung an den Benutzer (wenn es einen gibt.. der } als Fehlermeldung (mit dem Stack-Trace) ausgegeben wird class Datum ." + Monat + ". if (Tag > 31) throw new IllegalesDatum (Tag.Throwable (indirekt) abgeleitet sein .. // Zeile 49 in der Datei .io.Sockets.. Jahr). Monat.Alle anderen Fehlerarten müssen behandelt werden NoSuchMethodError ArithmeticException .Hierarchie der Fehlerklassen (Auszug): . } .. daß die Methode diese Ausnahme selbst Throwable IndexOutOfBoundsException RuntimeException wieder auslöst (und damit weiterreicht).lang. müssen aber nicht abgefangen werden . 46 .. 45 Definieren eigener Ausnahmen . int J) throws IllegalesDatum { Tag = T.Setzen(47.. Fehlerhaftes Datum ist:47. } Der Konstruktor von Throwable erwartet einen String. void Setzen (int T. z.int Jahr) { super ("Fehlerhaftes Datum ist:" + Tag + ".Typkonvertierung (z. FileNotFoundException IOException public Eine_Methode (.java:49) Java-Einführung. d. URL-Verbindungen (z. in denen Ausnahmen . int / 0.*.97 at Datum.Setzen(Datum.. Indexfehler bei arrays . Jahr = J..getMessage()).err.entweder durch try / catch in der Methode Error .} Java-Einführung.: EOFException Exception import java..was auch sonst..io.Fehlerbehandlung ist nicht immer einfach auftreten können: .java:27) at Beispiel.können. Monat = M. Fehlerarten Fehlerbehandlung . .Ausnahmen sind Objekte! ..println("Division durch 0?").. // und E-mail an den Boss schicken..Die oberste Fehlerklasse "Throwable" stellt einige sinnvolle .Laufzeitsystem durchsucht den Laufzeitkeller (rückwärts) } .Oft ist es dann ratsam. } catch (Exception e) { .97).Typische Situationen..IOException SocketException {. NumberFormatException) try { .MalformedURLException) . reservierte Ressourcen wieder freizugeben .