Programmieren mit JAVA Teil II Zusammenfassung • Applikation vs. Applet • sequentiell vs. objektorientiert • Klasse, instanziieren, Objekt, Methode, Attribut • • • • • if ... else Blockanweisung {} Bedingungsoperator switch ... case while, do ... while, for Schleifen abstrakte Klasse • keine direkten Instanzen • darf keine Implementierung von Methoden enthalten • charakterisiert durch Schlüsselwort abstract • dienen der Strukturierung und Vereinbarung von Methodenschnittstellen Vererbung • ~ ist die Beziehung zwischen Superklasse und Subklasse (auch: abgeleitete Klasse) • immer streng hierarchisch • Methoden werden NICHT kopiert ! Nur formale Verknüpfung. Vererbung • • • • Attribute hinzufügen neue Methoden spezifizieren vorhandene Methoden überladen geerbte Methoden ergänzen • JAVA unterstützt nur Einfachvererbung ! Überschreiben • ~ bedeutet, dass bei Namensgleichheit von Methoden der Superklasse und abgeleiteter Klasse die Methoden der abgeleiteten Klasse die der Superklasse verdecken Polymorphismus • Lässt sich ein und dieselbe Operation auf Objekte unterschiedlicher Klassen anwenden, so ist diese Operation polymorph. Bsp.: – Bei Objekten der Klasse Strecke bewirkt die Operation inc ein kontinuierliches Inkrementieren bis zum Maximum des Wertebereichs. – In einer Klasse Blickrichtung könnte die inc Operation so definiert sein, dass nach 359 auf 0 gesprungen wird. Grundprinzipien der OOP • Objekte heben die Trennung von Daten und Anweisungen auf • Objekte tauschen Nachrichten aus und reagieren darauf. Anderen Kommunikationswege gibt es nicht • Objekte erben Methoden und Attribute des Objektes in der zugehörigen Superklasse • Objekte können ererbte Methoden und Attribute erweitern und verändern • Wenn Objekte zu verschiedenen Klassen gehören, werden sie auf die gleiche Nachricht unterschiedlich reagieren (Polymorphismus) Überladen, Überschreiben, Überschatten Überladen: – nur bei Methoden, NICHT bei Operatoren (++) – mehrere Methoden mit identischem Namen aber unterschiedlichen Parameterlisten – Methoden mit dem Schlüsselwort static können nicht überladen werden ! Überladen, Überschreiben, Überschatten Überschreiben: – Name UND Parameterliste sind gleich – ermöglicht Spezialisierung von Objekten Überschatten: – Variablen können überschattet werden – Definition einer Variable mit anderem Typ als in der Superklasse Hauptbestandteile der Sprache • • • • • • • • • Token Typen Ausdrücke und Operatoren Anweisungen Klassen Methoden Schnittstellen Pakete Variablen Token • Zeichen, Merkmal in JAVA gibt es fünf Arten von Token: – – – – – Schlüsselworte Bezeichner Literale Operatoren Trennzeichen Die JAVA Token Schlüsselworte: – alle Wörter, die essentieller Teil der JAVA-Sprachdefinition sind – Groß- und Kleinschreibung werden unterschieden ! Bsp.: public, class, static, void Die JAVA Token Bezeichner: – Namen für Klassen, Objekte, Variablen, Konstanten, Methoden ... – an erster Stelle darf KEINE Zahl stehen ! – Bezeichner sollten nicht mit Namen von JAVA-Paketen identisch sein Bsp.: HelloWorld, main, args, System, out, println, j, n32e20 Die JAVA Token Bezeichner: – Namenskonflikte werden über die Namensräume aufgelöst Hierarchie: • Namensraum des Paketes • Namensraum der Klasse • Namensräume der Methoden (Bezeichner der Methodenparameter überdecken Attribute der Klasse !) • Innerhalb der Methoden Namensräume in Blöcken Die JAVA Token Literal: – mit einem ~ können Variablen und Konstanten Werte zugewiesen werden – Ganzzahlliterale, Gleitpunktliterale, Zeichenliterale, Zeichenkettenliterale, Boolesche Literale Bsp.: „HelloJava“, 42, false, true Die JAVA Token Trennzeichen: – alle Symbole für die Trennung und Zusammenfassung von Code Bsp.: (){}[];,. /* JAVA kennt nur diese 9 TZ */ Die JAVA Token Operatoren: – Zeichen oder Zeichenkombination, die eine Operation mit einer oder mehreren Variablen oder Konstanten angibt +, -, *, /, % Arithmetische ~ +=, -=, *=, /=, %=, = Arithmetische Zuweisungs~ ++, -Inkrement-/Dekrement ~ &, |, ^, ~ Bit~ <<, >>, >>> Bitweise Verschiebe~ &=, |=, ^=, <<=, >>=, >>>= Bitweise Zuweisungs~ ==, !=, <, >, <=, >= Vergleichs~ &&, ||, ! logische Vergleichs~ Die JAVA Token Leerraum: – Zeichen zur übersichtlichen Gestaltung des Quelltextes Bsp.: [Space], [Tab], [Zeilenende] Die JAVA Token Kommentar: – zur übersichtlichen Gestaltung des Quelltextes und zur Dokumentation Bsp.: /* Kommentar */ // Kommentar /** Kommentar */ Typen • Ein Typ gibt in der Computersprache an, wie ein einfaches Objekt (wie z.B. eine Variable) im Speicher des Computers dargestellt wird. • Er enthält normalerweise ebenfalls Hinweise darüber, welche Operationen mit und an ihm ausgeführt werden können. Typen • JAVA besitzt 8 primitive Datentypen: – – – – 4 Ganzzahldatentypen einen logischen Datentyp zwei Gleitzahltypen einen Zeichentyp • primitiv bedeutet, dass diese Datentypen im System integriert und nicht als Objekte zu verstehen sind Typen • Datentypen sind in JAVA plattformunabhängig !! • besitzen immer einen wohldefinierten defaultAnfangswert, müssen also nicht zwingend initialisiert werden Typen Bezeichnung byte short int long float double char boolean Typ 8 Bit 16 Bit 32 Bit 64 Bit 32 Bit 64 Bit 16 Bit 1 Bit Default-Wert 0 0 0 0 0.0 0.0 \u000 false Typen Datenfelder: int antwort[];int[] antwort; int antwort [] []; int[] antwort = new int [5]; /* erzeugt fünfelementiges Array vom typ int */ oder int[] antwort = {41, 42, 43, 44, 45}; int [] [] antwort = {{41, 42}, {43, 44}}; Typen Datenfelder: – Indizierung beginnt bei 0 ! – Zugriff auf Elemente ausserhalb der Arraygrenzen erzeugt Kompilierungs-/Laufzeitfehler Zugriff auf Elemente mehrdimensionaler Felder: antwort [1][1] = 44; Achtung: antwort [1,1] erzeugt Fehler ! Anweisungen Anweisungsart Leere Anweisung Blockanweisungen Bezeichnete Anweisung Deklaration Ausdrucksanweisung Auswahlanweisung Iterationsanweisung Sprunganweisungen Synchronisationsanweisung Schutzanweisung Unerreichbare Anweisung Beschreibung dient nur als Platzhalter Zusammenfassen von Quelltext werden als Ziel für Sprungbefehle genutzt Einführung von Datentyp, Klasse, Objekt ... 7 verschiedene verfügbar => if, if .. else, switch .. case while, do, for break, continue, return, throw für Multithreading, synchronized, threadsafe try, catch, finally erzeugt Fehler beim kompilieren Anweisungen Anweisungsart Leere Anweisung Blockanweisungen Bezeichnete Anweisung Deklaration Ausdrucksanweisung Auswahlanweisung Iterationsanweisung Sprunganweisungen Synchronisationsanweisung Schutzanweisung Unerreichbare Anweisung Beschreibung dient nur als Platzhalter Zusammenfassen von Quelltext werden als Ziel für Sprungbefehle genutzt Einführung von Datentyp, Klasse, Objekt ... 7 verschiedene verfügbar => if, if .. else, switch .. case while, do, for break, continue, return, throw für Multithreading, synchronized, threadsafe try, catch, finally erzeugt Fehler beim kompilieren Anweisungen Anweisungsart Leere Anweisung Blockanweisungen Bezeichnete Anweisung Deklaration Ausdrucksanweisung Auswahlanweisung Iterationsanweisung Sprunganweisungen Synchronisationsanweisung Schutzanweisung Unerreichbare Anweisung Beschreibung dient nur als Platzhalter Zusammenfassen von Quelltext werden als Ziel für Sprungbefehle genutzt Einführung von Datentyp, Klasse, Objekt ... 7 verschiedene verfügbar => if, if .. else, switch .. case while, do, for break, continue, return, throw für Multithreading, synchronized, threadsafe try, catch, finally erzeugt Fehler beim kompilieren Blockanweisungen • Eine Folge von Anweisungen kann zu einem Anweisungsblock zusammengefasst werden. • Dieser Block verhält sich dann wie eine einzelne Anweisung. if (day == “Sunday”) tidyUpComputer (); if (day == “Sunday”) { clearTempDirectory(); makeBackup (); scanDisk(); } Anweisungen Anweisungsart Leere Anweisung Blockanweisungen Bezeichnete Anweisung Deklaration Ausdrucksanweisung Auswahlanweisung Iterationsanweisung Sprunganweisungen Synchronisationsanweisung Schutzanweisung Unerreichbare Anweisung Beschreibung dient nur als Platzhalter Zusammenfassen von Quelltext werden als Ziel für Sprungbefehle genutzt Einführung von Datentyp, Klasse, Objekt ... 7 verschiedene verfügbar => if, if .. else, switch .. case while, do, for break, continue, return, throw für Multithreading, synchronized, threadsafe try, catch, finally erzeugt Fehler beim kompilieren Bezeichnete Anweisungen Bsp.: endOfLoop: for (c1=0; c1<10; c1++) { for (c2=0; c2<50; c2++) { newchar = instream.read (); // read a char if (newchar == ‚\0‘) break enfOfLoop; System.out.println (newchar); } System.out.println (“\n”); } System.out.println (“The end”); Anweisungen Anweisungsart Leere Anweisung Blockanweisungen Bezeichnete Anweisung Deklaration Ausdrucksanweisung Auswahlanweisung Iterationsanweisung Sprunganweisungen Synchronisationsanweisung Schutzanweisung Unerreichbare Anweisung Beschreibung dient nur als Platzhalter Zusammenfassen von Quelltext werden als Ziel für Sprungbefehle genutzt Einführung von Datentyp, Klasse, Objekt ... 7 verschiedene verfügbar => if, if .. else, switch .. case while, do, for break, continue, return, throw für Multithreading, synchronized, threadsafe try, catch, finally erzeugt Fehler beim kompilieren Deklaration • • • • • Klassendeklarationen Schnittstellendeklarationen Datenfelddeklarationen Objektdeklarationen Deklaration primitiver Typen Klassendeklarationen • Eine ~ besteht immer aus 6 Teilen welche in folgender Reihenfolge zusammengesetzt werden Bestandteil Klassenmodifier Class Bezeichner Super Status optional zwingend zwingend optional Schnittstellen optional Klassenkörper zwingend Beschreibung abstract, final, public class ein normaler Bezeichner extends gefolgt von Typname, Typ muss Klasse sein, die nicht final ist implements gefolgt von durch Kommata getrennter Liste mit Schnittstellen Schnittstellendeklarationen • Eine ~ besteht immer aus 5 Teilen welche in folgender Reihenfolge zusammengesetzt werden Bestandteil Schnittstellenmodifier Interface Bezeichner Schnittstellenerweiterung Status optional zwingend zwingend optional Schnittstellenkörper zwingend Beschreibung abstract, public interface ein normaler Bezeichner extends gefolgt von Typname, Typ muss Klasse sein, die nicht final ist Datenfelddeklarationen • Eine ~ besteht immer aus 5 Teilen welche in folgender Reihenfolge zusammengesetzt werden Bestandteil Datenfeldmodifier Status optional Typenname zwingend Klammern Initialisierung Semikolon zwingend optional zwingend Beschreibung public,protected, private, synchronized Name des Typen oder der Klasse, die aufgestellt werden [] ; Objektdeklarationen • Ein Objekt zu deklarieren bedeutet, eine Referenz zu erstellen Bestandteil Objektmodifier Status optional Typenname zwingend Initialisierung Semikolon optional zwingend Beschreibung public, protected, private, synchronized Name der Klasse, deren Instanz dieses Objekt ist ; Deklaration primitiver Typen • Reservierung von Speicherplatz • Initialisierung mit explizit angegebenem Wert oder default-Wert Bestandteil Datenfeldmodifier Status optional Typenname zwingend Initialisierung Semikolon optional zwingend Beschreibung public, protected, private, synchronized boolean, char, byte, short, int, long, float, double ; Anweisungen Anweisungsart Leere Anweisung Blockanweisungen Bezeichnete Anweisung Deklaration Ausdrucksanweisung Auswahlanweisung Iterationsanweisung Sprunganweisungen Synchronisationsanweisung Schutzanweisung Unerreichbare Anweisung Beschreibung dient nur als Platzhalter Zusammenfassen von Quelltext werden als Ziel für Sprungbefehle genutzt Einführung von Datentyp, Klasse, Objekt ... 7 verschiedene verfügbar => if, if .. else, switch .. case while, do, for break, continue, return, throw für Multithreading, synchronized, threadsafe try, catch, finally erzeugt Fehler beim kompilieren Anweisungen Ausdrucksanweisung Zuordnung Prä-Inkrement Prä-Dekrement Post-Inkrement Post-Dekrement Methodenaufruf Zuweisungsausdruck Beispiel a = 42 ++wert --wert wert++ wert-System.out.println(„Hello World!“); byte wert = new byte; Anweisungen Anweisungsart Leere Anweisung Blockanweisungen Bezeichnete Anweisung Deklaration Ausdrucksanweisung Auswahlanweisung Iterationsanweisung Sprunganweisungen Synchronisationsanweisung Schutzanweisung Unerreichbare Anweisung Beschreibung dient nur als Platzhalter Zusammenfassen von Quelltext werden als Ziel für Sprungbefehle genutzt Einführung von Datentyp, Klasse, Objekt ... 7 verschiedene verfügbar => if, if .. else, switch .. case while, do, for break, continue, return, throw für Multithreading, synchronized, threadsafe try, catch, finally erzeugt Fehler beim kompilieren Anweisungen Anweisungsart Leere Anweisung Blockanweisungen Bezeichnete Anweisung Deklaration Ausdrucksanweisung Auswahlanweisung Iterationsanweisung Sprunganweisungen Synchronisationsanweisung Schutzanweisung Unerreichbare Anweisung Beschreibung dient nur als Platzhalter Zusammenfassen von Quelltext werden als Ziel für Sprungbefehle genutzt Einführung von Datentyp, Klasse, Objekt ... 7 verschiedene verfügbar => if, if .. else, switch .. case while, do, for break, continue, return, throw für Multithreading, synchronized, threadsafe try, catch, finally erzeugt Fehler beim kompilieren Anweisungen Anweisungsart Leere Anweisung Blockanweisungen Bezeichnete Anweisung Deklaration Ausdrucksanweisung Auswahlanweisung Iterationsanweisung Sprunganweisungen Synchronisationsanweisung Schutzanweisung Unerreichbare Anweisung Beschreibung dient nur als Platzhalter Zusammenfassen von Quelltext werden als Ziel für Sprungbefehle genutzt Einführung von Datentyp, Klasse, Objekt ... 7 verschiedene verfügbar => if, if .. else, switch .. case while, do, for break, continue, return, throw für Multithreading, synchronized, threadsafe try, catch, finally erzeugt Fehler beim kompilieren