08.01.2013 Vorlesung „Programmieren“ Nachweihnachtliche Zusammenfassung und Wiederholung Dr. Dennis Pfisterer Institut für Telematik, Universität zu Lübeck http://www.itm.uni-luebeck.de/people/pfisterer Themenüberblich • • • • • • • • • • Zahlendarstellung Funktionsweise von Computern Algorithmen und Berechenbarkeit Java Grundlagen Programmierparadigmen Speicherverwaltung und Parameterübergabe Objektorientierte Programmierung Java: Packages, Classpath, JARs Vererbung und Polymorphismus Abstrakte Klassen und Methoden & Interfaces Security - 04 Cryptology #2 Zahlendarstellung Security - 04 Cryptology #3 1 08.01.2013 Dezimalsystem • Normal rechnen wir im Dezimalsystem 0+1= 1 1+1= 2 – Basis 10 2+1= 3 3+1= 4 • 10 verschiedene „Symbole“ (0 bis 9) zur Zahlendarstellung vorhanden 4+1= 5 5+1= 6 6+1= 7 7+1= 8 • Größere Zahlen werden durch Sequenz von Symbolen gebildet 8+1= 9 9 + 1 = 10 – „Stelle“ bestimmt Wertigkeit des Symbols Security - 04 Cryptology #4 Dezimalsystem • Darstellung von Zahlen in Summenform möglich 1 100 1 ·100 10 101 1 ·101 100 102 1 ·102 1.000 103 1 ·103 10.000 104 1 ·104 100.000 105 1 ·105 • Beispiele – 20 – 1024 = 2 ·101 + 0 ·100 = 1 ·103 + 0 ·102 + 2 ·101 + 4 ·100 Security - 04 Cryptology #5 Umrechnung: Dezimal- nach Binärsystem • Horner-Schema 14 2 = 7 R0 7 2 = 3R1 3 2 = 1R1 1 2 = 0 R1 Least significant bit (LSB) Most significant bit (MSB) 1110 MSB LSB 6 2 08.01.2013 Hexadezimalsystem (zur Basis 16) • Neben dem Binärsystem gibt es für den Programmierer noch ein weiteres wichtiges Zahlensystem – Das Hexadezimalsystem, kurz: hex • 16 Ziffern: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f – a bis f stehen für die Zahlen 10 bis 15 – Groß-/Kleinschreibung unerheblich (a = A) • Umrechnung zwischen Dezimal und Hex analog zum Binärsystem 7 Rechnen mit verschiedenen Basen • Alle Grundrechenarten funktionieren auch im Binärsystem – Natürlich auch in allen anderen Zahlensystemen – Insbesondere auch im Hexadezimalsystem • Bisher: Nur positive ganze Zahlen • Wie geht man mit vorzeichenbehafteten ganzen Zahlen um? – Wie stellt man -7 im Computer dar? 8 Negative Zahlen • Variante 1: Höchstes Bit als Vorzeichen – Höchstes Bit 0: Positive Zahle – Höchstes Bit 1: Negative Zahl • Variante 2: 1er-Komplement – Zur Vorzeichenumwandlung (+ jedes Bit invertiert - bzw. - +) wird • Variante 3: 2er-Komplement – Invertiere bitweise und addiere 1 – Alternativ: 1er-Komplement + 1 Security - 04 Cryptology #9 3 08.01.2013 Höchstes Bit als Vorzeichen • Prinzipiell wäre das so verwendbar • Nachteile – Zwei Nullen (+0 und -1) – Vorzeichen-Bit muss beim Rechnen ausgewertet werden – Das ist für Maschinen nicht optimal und die Schaltungen werden recht komplex Security - 04 Cryptology #10 1er-Komplement • Beispiel (4-Bit Zahlen): – 410 = 01002 und 210 = 00102 – Negative Zahl: Invertieren aller Bits: – -410 = 10112 und -210 = 11012 • Nachteile – Zwei Nullen (0000 und 1111) – Round Carry (Übertrag muss noch addiert werden) Security - 04 Cryptology #11 2er-Komplement • Beispiel: -710 -01112 – invertiere(01112) +12 10002 + 12 10012 • Vorteile – Kein Round Carry (direkte Addition, Übertrag kann ignoriert werden) – Nur eine Null (-0000 1111 + 1 0000) – Subtraktion kann auf Addition zurückgeführt werden – Praktische alle Computer verwenden es daher Security - 04 Cryptology #12 4 08.01.2013 Reelle Zahlen • Festkommadarstellung – Feste Anzahl von Bits für Vorkomma- und Nachkommateil – Getrennte Umrechnung beider Teile • Beispiel: 14,1 – 14 mit Horner-Schema (wiederholtes Teilen mit Rest durch 2, Reste ergeben Binärstellen von LSB nach MSB): 1110 – 0,1 mit Multiplikation statt Division: 0, 0001 1001 1001 1001... (Achtung: Periode) Security - 04 Cryptology #13 Fließkommadarstellung • Wertebereich und Genauigkeit von Festkommazahlen oft zu gering – Große Zahlen: Wunsch nach größerem Wertebereich Nachkommateil nicht so relevant – Kleine Zahlen: Wunsch nach mehr Nachkommastellen Dafür ist vor dem Komma nicht so viel Spielraum • Fließkommadarstellung – Darstellung einer Zahl als Mantisse und Exponent 101,1 * 1011 (Basis 2) – Normalisierung der Zahl: Verschieben des Kommas, bis die Form 1,xxx erreicht ist (außer bei der Zahl 0) • Darstellung nach IEEE 754: V Exponent (8 Bit) Mantisse (23 Bit, Nachkommateil) 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 Vorzeichen (1-Bit) Security - 04 Cryptology #14 Wert des Exponenten e • Wert des Exponenten eeffektiv definiert als – eeffektiv = e – 011111112 (= e - 12710) • Dadurch gilt – e = 0000 0001 (1 - 127 = -126) eeffektiv = -126 – e = 0111 1111 (127–127 = 0) Komma nicht verschoben – e = 1111 1110 (254–127 = 127) eeffektiv = +127 V Exponent e (8 Bit) Mantisse m (23 Bit, Nachkommateil) 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 15 5 08.01.2013 Rechnen mit Fließkommazahlen 1. Exponenten angleichen – Zahl mit kleinerem Exponenten wird denormalisiert – Grund: Kein Spezialfall für mehr als eine Stelle vor dem Komma! 2. Mantissen addieren, subtrahieren, multiplizieren oder dividieren 3. Ergebnis normalisieren 4. Fertig! 16 Fließkommazahlen: Vor- und Nachteile • Vorteile – Fühlen sich für Programmierer wie reelle Zahlen an – Großer Wertebereich, inkl. Werten für 0, +inf und –inf • Nachteile – Sind nur endlich genau! – Zahlen, die im Dezimalsystem exakt dargestellt werden können, müssen im Binärsystem u.U. gerundet werden – Durch diese Ungenauigkeit kommt es schon bei einfachen Rechnungen zu Rundungsfehlern 17 Funktionsweise von Computern Security - 04 Cryptology #18 6 08.01.2013 Von-Neumann-Architektur: Komponenten Steuert Programmfluss Auch: ALU (Arithmetic Logic Unit) Sagt Rechenwerk was zu tun ist. Addition, etc Verbindet Daten (Quelle und Ziel) mit ALU Steuert Übertragung (zur Ein- und Ausgabe) von Daten Interaktion mit Peripherie: Lochstreifenleser, Bildschirm, Keyboard, … Speichert Daten und Programm (RAM) 19 Central Processing Unit (CPU) • Agiert in Takten CPU – Gegeben durch Taktfrequenz • Hat interne Speicher: Register Steuerwerk Befehls-/Register-Speicher Programmzähler Befehlsdekoder steuert Rechenwerk • Arbeitet in vier Schritten 1. Fetch Befehl und Daten aus Speicher holen 2. Decode Befehl decodieren und Steuersignal an das Rechenwerk (ALU) anlegen 3. Execute Berechnung ausführen 4. Store Ergebnis in Speicher schreiben (Rechen-)Registerspeicher Rechenschaltungen 20 Algorithmen und Berechenbarkeit Security - 04 Cryptology #21 7 08.01.2013 Algorithmus • Vorschrift zur Lösung eines bestimmten Problems – z.B. Leerzeichen zählen, Daten sortieren, Routen planen, Schach spielen, … • Formulierung der Handlungsvorschrift so dass deren Befolgen – bei sinnvollen Ausgangsdaten (Eingabe) – zum angestrebten Ziel (Ausgabe) führt, – ohne dass dazu ein Verständnis des Problems notwendig ist • Sog. mechanisches Lösen – Eine solche Vorschrift heißt Algorithmus Security - 04 Cryptology #22 Algorithmus (präzisierte Definition) • Eindeutig beschriebenes Verfahren, das bestimmt, mit welchen Operationen welche Objekte (Daten) bearbeitet werden sollen – Ziel: Lösung eines Problems anhand einer Spezifikation • Elemente – Sprache (Umgangssprache, Programmiersprache, ...) – Objekte müssen klar umrissen sein – Operationen müssen eindeutig und ausführbar sein • Für Adressaten des Algorithmus Computer, Mensch, ... – Reihenfolge der Operationen muss feststehen 4-23 Aufbau von Algorithmen • Mehr als die genannten Elemente braucht man nicht, um alles, was überhaupt programmierbar ist, programmieren zu können! • Es reichen also – Elementare Rechenoperationen – Sequentielle Ausführung – While- und If- Anweisung 4-24 8 08.01.2013 Eigenschaften von Algorithmen • Terminierend – Für alle korrekten Eingaben hält der Algorithmus nach endlich vielen Schritten an • Vollständigkeit – Alle Fälle, die bei korrekten Eingabedaten im Verlaufe der Abarbeitung eines Algorithmus auftreten können, müssen berücksichtigt werden • Determiniert – Der Algorithmus liefert bei jedem Ablauf mit den gleichen Eingaben das gleiche Ergebnis • Deterministisch – Der Algorithmus liefert bei jedem Ablauf mit den gleichen Eingaben das gleiche Ergebnis und führt dabei dieselbe Berechnung aus Security - 04 Cryptology #25 Algorithmen und Programmieren • Programmiersprachen dienen zum Aufschreiben von Algorithmen • Algorithmen können mit Hilfe von Programmiersprachen so aufgeschrieben werden, dass ein Computer sie „versteht“ Security - 04 Cryptology #26 Java Grundlagen Security - 04 Cryptology #27 9 08.01.2013 Höhere Programmiersprache • Sprache mit eigener Syntax und Semantik • Syntax: Grammatikregeln der Sprache – „Walfische bereisen Indien, um Wolken zu klauen!“ • Semantik: Bedeutung einzelner „Worte“ und „Satzzeichen“ der Sprache – Der obige Satz ist syntaktisch korrekt – aber sinnlos. • Ziel: Sicheres Beherrschen beider Aspekte – Compiler prüfen Syntax aber keine Semantik Security - 04 Cryptology #28 Warum Java? • Besonderheiten von Java – Sprache i. W. neu entworfen, nur wenige „Altlasten“ – Daher vergleichsweise einfach zu erlernen – Write once, run everywhere • Technische Realisierung: Programm Programm Maschinencode Compiler Bytecode Compiler Interpreter Maschinencode 5-29 Erstes Sprachelement: Sequentielle Ausführung • Markierung des Endes einer Anweisung durch Semikolon – Zeichen ; – a1; a2; a3; a4; • Formatierung (für den Compiler) egal • Für Menschen macht es Sinn, sich an gewisse Konventionen zu halten Security - 04 Cryptology #30 10 08.01.2013 Variablen Adresse Inhalt ... • Eine Variable ist ein Speicherplatz – Eine (Start-)Adresse im Arbeitsspeicher – Programme verwenden Namen statt Adressen (z.B. jahr, i, hallo) – Compiler bzw. Betriebssystem kümmert sich um konkrete Zuordnung ... 1001 12 1002 123 1003 7 1004 7 1007 9 1008 11 ... • Größe des belegten Speichers bestimmt durch Datentyp ... 800023 800024 4 800025 – 32-Bit Ganzzahl – 8-Bit vorzeichenbehaftete Ganzzahl ... ... Primitive Datentypen in Java Datentyp Bemerkung byte 8 Bit, 2er-Komplement short 16 Bit, 2er-Komplement int 32 Bit, 2er-Komplement long 64 Bit, 2er-Komplement Min Max -128 +127 -32.768 +32.767 -2.147.483.648 +2.147.483.647 -9.223.372.036.854.775.808 +9.223.372.036.854.775.807 float 32-bit IEEE 754 floating point double 64-bit IEEE 754 floating point boolean Größe nicht spezifiziert char Ein 16-bit Unicode Zeichen false true '\u0000' (oder 0) '\uffff' (oder 65.535) Deklaration von Variablen • Eine Variable ist ein Speicherplatz – Repräsentiert einen Wert aus einem bestimmten Wertebereich – Wertebereich durch verwendeten Datentyp festgelegt – Speicherbereich wird über einen Namen referenziert • Eine Variable wird deklariert (d.h. erzeugt) – Syntax: <Typ> <Name>; – Dadurch wird Speicher reserviert • Beispiele – – – – int myInt; char c1; boolean flag; short myShort, myShort2; mehrere Variablen gleichen Typs 5-33 11 08.01.2013 Legale Identifier • Bestehen aus – Unicode Zeichen – Nummern – Währungssymbole – Verbindungszeichen (Bsp.: Unterstrich „_“) – Dürfen theoretisch beliebig lang sein • Einschränkungen – Muss mit Zeichen, Währungssymbol oder Verbindungszeichen starten – Also auf keinen Fall mit einer Nummer – Kein reserviertes Schlüsselwörter (class, public, etc.). Details unter http://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html – Keine Leerzeichen – Identifier sind case-sensitive (Unterscheidung von Groß- und Kleinschreibung) Security - 04 Cryptology #34 Typsicherheit • Alle Daten, die wir verarbeiten, sind immer von einem bestimmten Typ – Typ der Werte, die wir einer Variablen zuweisen, muss dem Typ der Variablen entsprechen – Alternativ müssen wir konvertieren (später) • Kann man einen Wahrheitswert (boolean) eine int-Zahl zuweisen (z.B. 123)? – Nein, das dient der „Sicherheit“ von Programmen – Sog. statische Typsicherheit – Diese wird vom Compiler überprüft Security - 04 Cryptology #35 Spezialfall: Arrays • Beispiel: Wir benötigen zehn Integer-Variablen – int i0, i1, i2, i3, i4, i5, i6, i7, i8 i9; • Einfacher: Verwendung sog. Arrays – int[] i = new int[10]; • Zugriff über Indizes – i[0], i[1], … , i[9] Erster Index (0) Achtes Element an Index 7 0 1 2 3 4 5 6 7 8 9 5 66 777 338 1 -56 4 0 1 4 Länge des Arrays: 10 5-36 12 08.01.2013 Datentypen von Literalen (Ganzzahlen) • Ganzzahlige Typen (standardmäßig vom Typ int) – 10 (Dezimal) – 012 (Oktal, Basis 8, wegen führender Null) – 0xA (Hexadezimal, Basis 16 wegen führendem 0x, Groß/Kleinschreibung egal) – 0b1010 (Binär, Basis 2, wegen führendem 0b) – Suffix “l“ oder “L“ Datentyp long statt int • Beispiel: – 12273; – 12733L; – int i = 10; – long l = 10L; Datentypen von Literalen (Floating Point) • Floating Point Werte sind standardmäßig vom Typ double – Durch Anhängen von f wird ein Literal vom Typ float – Optional kann ein d angehängt werden, um double explizit zu fordern • Schreibweise von Floating Point Literalen – Normale Schreibweise: 10.0 (alternativ: 10.) – Normale Schreibweise: 0.1 (alternativ : .1) – „Eng.“ Schreibweise: 1E1 (entspricht 1 * 101) – Float erzwingen: 10.0f – Double erzwingen: 10.0d Security - 04 Cryptology #38 Datentypen von Literalen (Zeichen) • Datentyp von Zeichen in Java: char • In einfachen Anführungszeichen eingeschlossen (') – Repräsentieren immer genau ein Zeichen – Mehr als ein Zeichen nicht möglich (dafür spezieller Typ: String später) – Beispiele: 'a' (das Zeichen a), 'ü' (das Zeichen ü) • Manche Zeichen werden mit Backslash (\) „escaped“ – '\n' Zeilenumbruch – '\'' Das Zeichen ' – '\\' Das Zeichen \ selbst – '\u00F1‘ Das Unicode-Zeichen mit der Nummer F116 (24110): ñ – Details unter: http://docs.oracle.com/javase/tutorial/java/data/characters.html 13 08.01.2013 Operatoren Operatortyp (sortiert nach Vorrang) Postfix expr++ expr-- • Unär ++expr --expr +expr -expr ~ ! Was können wir nun mit Variablen und deren Werten anfangen? – – – – – • Werte zuweisen Werte vergleichen Werte addieren Werte subtrahieren usw. Geschieht über Operatoren – Siehe auch http://download.oracle.com/j avase/tutorial/java/nutsandb olts/operators.html Multiplikativ * / % Additiv + - Shift << >> >>> Vergleich < > <= Gleichheit == Bitweises AND & Bitweises XOR ^ Bitweises OR | Logisches AND && >= instanceof != Logisches OR || Ternärer Operator ?: Zuweisung = += -= *= /= %= &= ^= |= <<= >>= >>>= 5-40 Operatoren • Berechnen neuen Wert (Ergebnis hat bestimmten Datentyp) • 1 + 1 – Ergebnis 2, Datentyp int • int i = 1; i = 2 * i; – Zwei Operatoren (= und *) – Ergebnis der Multiplikation: 2, Datentyp int; • 2.0 * 1; – Ergebnis: 2.0, Datentyp float • 3/2; – Ergebnis: 1, Datentyp int 5-41 Operatoren zur Typumwandlung • Explizite Typumwandlung (Casting) – – – – Syntax: (Datentyp) Wert Gibt Wert (der Variablen/Konstante) im angegeben Datentyp zurück Java handhabt Datentypen sehr strikt Typkonvertierungen müssen explizit angeben werden • Falsch – int i = 3.5f * 6; – int i = (int) 3.7f * 6; // Rechter Ausdruck: Typ float // Ergebnis: 3 * 6 = 18 • Richtig – int i = (int)(3.7f * 6); // Ergebnis: 3.5 * 6 = 22.2 22 5-42 14 08.01.2013 Ausdruck (engl.: expression) • Kann aus Operatoren, Variablen, Literalen und Funktionen (später) bestehen • Berechnet einen Wert eines bestimmten Datentyps • Beispiele – – – – – 1 1 + 2 1 + 2.0 3.098 * 12.7 + 8 / 7.0 (char) ( 'a' + 7 ) Wert: 1, Typ: int Wert: 3, Typ: int Wert 3.0, Typ: double Wert 40.48...,Typ double Wert ‘h’, Typ char Security - 04 Cryptology #43 Anweisungen (Statements) • Anweisungen müssen (anders als Ausdrücke) keinen Wert zurückgeben – Jeder Ausdruck ist auch eine Anweisung (Wert des Ausdrucks wird ignoriert) – Mehrere Ausdrücke werden durch ; getrennt (sequentielle Ausführung) • Beispiel: System.out.println(“Hallo“); – Gibt Hallo auf der Konsole aus, berechnet aber keinen Wert • Spezielle Anweisung: Blockanweisung – Gruppiert Menge von Anweisungen/Ausdrücken zu einer Anweisung – Syntax: { <keine oder mehrere Anweisungen> } – Beispiel: {} – Beispiel: { int i=1+2; System.out.println(“Hallo“); i=i*2; } Security - 04 Cryptology #44 Bedingte Ausführung: if • Syntax: if (boolescher-ausdruck) anweisung; – boolescher-ausdruck: Ausdruck, der zu boolean Wert evaluiert (true/false) – Anweisung: Einzelne Anweisung (kann auch eine Blockanweisung sein) • Beispiel für boolesche Ausdrücke – – – – true 1 > 2 i != 12 u – 2 > z - 3 • Beispiele für if-Anweisung – if (true) System.out.println(“Tautologie“); – int i = 3; if (2 * i > 1000) i = i / 2; Security - 04 Cryptology #45 15 08.01.2013 Variante der if-Anweisung (if...then...else) • Oft soll entweder das eine oder das andere gemacht werden – if (a > 100) a = a – 100; if (a <= 100) System.out.println(“a zu klein“); • Probleme – Gleiche Bedingung muss zweimal formuliert werden (1 x positiv, 1x negativ) – Wenn die erste Anweisung a modifiziert (wie hier geschehen), dann kommt es ggf. zu ungewolltem Verhalten • Daher Variante – if (boolescher-ausdruck) anweisung1; else anweisung2; – Wenn boolescher-ausdruck true ist, dann wird anweisung1 ausgeführt, ansonsten anweisung2 – if (a>100) a=a–100; else System.out.println(“a zu klein“); Security - 04 Cryptology #46 Alternative zu if: switch-Anweisung • Nach case kann nur eine Konstante stehen, keine Variable • Vorsicht: nicht das break vergessen • Kann z.B. anstelle von langen if-elseAnweisungen verwendet werden • Code wird dadurch kürzer und (evtl.) verständlicher Security - 04 Cryptology #47 Kontrollstrukturen: Wiederholung • While-Schleife – Wiederhole, solange Ausdruck wahr – Syntax: while (boolescher-ausdruck) anweisung1; • Beispiele – while (i > 10) i--; – while (i > 10) { System.out.println(i); i--; } 5-48 16 08.01.2013 Kontrollstrukturen: Wiederholung • Do-While-Schleife – Wie while, jedoch mindestens einmal ausgeführt – Syntax: do anweisung1; while(boolescher-ausdruck); • Beispiele • do i--; while (i > 10); • do { System.out.println(i); i--; } while (i > 10); 5-49 Kontrollstrukturen: Wiederholungen • Abseits von while und do...while gibt es eine weitere Wiederholungsanweisung: for – – – – • Ist wahrscheinlich die am meisten benutzte Variante while, do...while und for lassen sich ineinander überführen Welche Variante man nutzt ist daher egal Allerdings ist for expliziter als while/do-while und prägnanter Syntax – for(<initialization>; <termination>; <increment>) statement; – <initialization> – <termination> – <increment> Einmal zu Beginn der Schleife ausgeführt Abbruchbedingung (boolescher Ausdruck) Nach jedem Durchlauf ausgeführt 5-50 Programmierparadigmen Security - 04 Cryptology #51 17 08.01.2013 Prozedurale Programmierung • Zerlegung von Programmen in kleinere, wiederverwendbare Einheiten Monolithisches Programm – sog. Prozeduren • Vorteile – Kapselung einzelner Funktionalitäten – Bessere Wiederverwendbarkeit – Lesbarerer Code • „Was tut er?“ (z.B. Zeichen zählen) statt „Wie tut er es?“ (die ganzen Instruktionen) – Fehlerbehebung an einer Stelle #52 Prozedur (auch: Funktion) Eingabewerte • Eingabeparameter – Übergabe von Werten an die Funktion – Definiert als Menge von Variablen mit bestimmtem Datentyp • Rückgabe Prozedur / Funktion (Black Box) – Wert mit einem bestimmten Datentyp – Spezieller Datentyp für keine Rückgabe: void • Beispiele für Deklarationen (sog. Signatur) – – – – – Ausgabewert void main(String[] args); int zaehleLeerzeichen(char[] text); char[] rueckwaerts(char[] text); boolean istLeerzeichen(char zeichen); boolean istKontoGedeckt(int konto, int blz); #53 Signatur und Implementierung Signatur (auch: Deklaration) int zaehleLeerzeichen(char[] text) { // Hier steht die Implementierung der Funktion // (in einer Blockanweisung) } Implementierung (auch: Body oder Definition) #54 18 08.01.2013 Implementierung einer Funktion • Wie eine „Erweiterung“ der Blockanweisung – Es gibt ein paar weitere „lokale“ Variablen – Stellen die Parameter einer Funktion dar • Parameter werden wie normale lokale Variablen verwendet werden – Werte der Parameter werden beim Aufruf festgelegt Security - 04 Cryptology #55 Aufruf von Funktionen • Aufruf über Namen (Identifier) der Funktion • Übergabe von Parametern an die Funktion – Richtige Anzahl – Richtiger Datentyp Security - 04 Cryptology #56 Prozedurale Programmierung • Zerlegen des Programms in Prozeduren / Funktionen – Wesentlich: Übergabe von Parametern an Funktionen • Programm besteht aus Sequenz von Funktionsaufrufen – Erste Funktion: main • Prozeduren können auch globale Variablen verändern – „Zustand“ über mehrere Aufrufe hinweg Security - 04 Cryptology #57 19 08.01.2013 Funktionale Programmierung • Mathematische Funktionen sind wie eine große Tabelle • Abhängig von den Parametern, findet man das (immer konstante) Ergebnis in einer Tabelle • Wichtiges Prinzip: Termersetzung – f(2) – f(4) 4 16 Security - 04 Cryptology #58 Funktionale Programmierung • Vereinfacht dargestellt ist funktionale wie prozedural ohne globale Variablen • Denkweise ist sehr wichtig für gut testbare und wartbare Programme Security - 04 Cryptology #59 Speicherverwaltung und Parameterübergabe Security - 04 Cryptology #60 20 08.01.2013 Implizite Speicherverwaltung • Speicher wird durch Variablendeklarationen reserviert • Wichtig zum Verständnis: Zeitpunkte der Reservierung und Freigabe • Variablen existieren entweder – immer und genau einmal (statische Lebensdauer) – oder nur im aktiven Block Explizite (dynamische) Speicherverwaltung • Oft reicht implizite Reservierung nicht – Unbekannte Anzahl zur Compile-Zeit • Dann geht z.B. int[] x = new int[10]; nicht • Vielleicht ist dann so etwas notwendig: int[] x = new int[Integer.parseInt(args[0])]; – Langlebige aber nicht permanente Elemente • Wird z.B. über mehrere Funktionsaufrufe benötigt, aber nicht für die ganze Programmlaufzeit • Daher: dynamische Speicherverwaltung – Zu beliebigen Zeitpunkten Speicher anfordern und wieder freigeben – In Java: nur anfordern, Freigabe erfolgt automatisch 62 Explizite (dynamische) Speicherverwaltung • Erfolgt durch den Programmierer – Speicher kann nach Bedarf reserviert werden – Alle nicht-primitiven Datentypen müssen (in Java) so instanziiert werden • Variablen sind frei in Ihrer Gültigkeitsdauer – In vielen Sprachen muss Speicher explizit freigegeben werden – In Java erfolgt dies automatisch, wenn keine Referenz mehr auf diesen Bereich verweist Garbage Collection (später) • Wichtiges Schlüsselwort: new 21 08.01.2013 Schlüsselwort new • new reserviert so viel Speicher wie Datentyp benötigt • Beispiel: new int[100]; – Reserviert Speicherplatz für 100 int-Zahlen • Rückgabewert von new: Referenz auf erzeugtes Objekt – Datentyp der Rückgabe: wie angegeben (hier: int[]) Referenzen auf Speicherbereiche • a1, a2 und b sind Variablen, die auf ein int-Array verweisen können – Es werden zwei int-Arrays erzeugt und je eins wird a1 und a2 zugewiesen – Damit referenziert jede Variable den neu reservierten Speicherbereich • Die Variable b referenziert zunächst nichts – Für „nichts“ gibt es eine spezielle Adresse: null Beginn des Speicherbereichs Was bedeutet „null“? • Wörtlich: nichtig, ungültig – Bedeutet, dass diese Variable keinen Speicherbereich referenziert – Kann anstelle einer echten Speicherreferenz verwendet werden (Array, String, ...) – Nicht aber anstelle eines primitiven Wertes (boolean, int usw.) • Hinter null verbirgt sich kein Objekt im Speicher – Greift man denn darauf zu, wird ein Fehler erzeugt (NullPointerException später) 22 08.01.2013 Java: Reference Counting • Java: automatische Speicherfreigabe – Wird ein Speicherbereich nicht mehr über eine Variable referenziert, dann wird er freigegeben – Erfolgt periodisch und automatisch durch sog. Garbage Collector (GC) • Beispiel – int d1[] = new int[100]; // 1 Referenz int d2[] = d1; // 2 Referenzen d1 = null; // 1 Referenz d2 = null; // 0 Referenzen GC Call by Value vs. Call by Reference • Call by Value – – – – Übergabe von Werten an Funktionen Geschieht über den Stack Gilt für alle primitiven Datentypen in Java Veränderungen des Parameters wirken sich nur innerhalb der Funktion aus • Call by Reference – Übergabe von Referenzen auf den Speicherbereich – Veränderungen des Parameters wirken auch außerhalb der Funktion aus Security - 04 Cryptology #68 Objektorientierte Programmierung Security - 04 Cryptology #69 23 08.01.2013 Definition: Objekt • Repräsentation eines Gegenstandes/Sachverhalts der realen Welt oder eines rein gedanklichen Konzepts • Gekennzeichnet durch – Eindeutige Identität (Unterscheidung von anderen Objekten) (Dieser Punkt vs. der andere Punkt) – Zustand (in Form von Attributen) (also z.B. x- und y-Wert) – Methoden (bisher: Funktionen bzw. Prozeduren) (Manipulation des Zustands; definiert das Verhalten) (Beispiel: verschiebe und rotiere) 5-2-70 Beispiel: Objekt „Punkt“ • Besteht aus Zustand (Attributen) und Verhalten (Methoden) • Zustand eines Punktes – Definiert durch aktuelle x- und y- Werte Punkt Attribute: - double x = 1; - double y = 3; Methoden: - void setze(double x, double y); - void verschiebe(double dx, double dy); - void rotiere(double radians); • Verhalten eines Punktes – Definiert durch seine Methoden – z.B. Setzen der x- und y-Werte, verschieben, rotieren Security - 04 Cryptology #71 Methoden • Können Zustand eines Objektes verändern – Also die Werte der Attribute verändern – Beispielsweise verändert die Methode „rotieren“ die Werte der Attribute x und y – Natürlich können auch Methoden wie Funktionen Parameter haben Punkt Attribute: - double x; - double y; Methoden: - void setze(double x, double y); - void verschiebe(double dx, double dy); - void rotiere(double radians); Security - 04 Cryptology #72 24 08.01.2013 Objekte und Klassen • Muss jedes Objekt immer neu implementiert werden? – Nein, man fasst ähnliche Objekte zu einer Klasse zusammen • Klasse: Abstrakte Definition der Attribute und Methoden einer Menge ähnlicher Objekte Objekte Klasse Punkt X2 y2 X1 y1 Attribute: - double x; - double y; X3 y3 Methoden: - void setze(double x, double y); - void verschiebe(double dx, double dy); - void rotiere(double radians); Security - 04 Cryptology #73 Instanzen • Anstelle von Objekten spricht man oft von „Instanzen“ – Instanzen sind „Realisierungen“ einer Klasse – Instanzen existieren im Arbeitsspeicher – Klassen sind „nur“ abstrakte Definitionen Instanzen der Klasse „Punkt“ X1 y1 X2 y2 X3 y3 Instanzen der Klasse „Lampe“ • Beispiele – – – – Punkte vs. „Dieser Punkt“ Lampen vs. „Diese Wohnzimmerlampe“ Auto vs. „Mein 3er BMW“ Mensch vs. „Ich“ Instanzen der Klasse „Mensch“ Security - 04 Cryptology #74 Erzeugung von Instanzen • Instanzen von Klassen werden über new erzeugt • Bisher: double punkt[] = new double[2]; – new double[2]; liefert Adresse des neu erzeugten Arrays auf dem Heap • Jetzt: Punkt punkt = new Punkt(); – new Punkt(); liefert Adresse des neu erzeugten Punkts auf dem Heap – Reserviert einen Speicherbereich für die Attribute des Objekts Security - 04 Cryptology #75 25 08.01.2013 Identität von Objekten • Jedes Objekt besitzt eine eigene Identität • In Form einer Referenz auf den eigenen Speicherbereich Punkt Attribute: - Punkt this; - double x = 1; - double y = 3; Methoden: - void setze(double x, double y); - void verschiebe(double dx, double dy); - void rotiere(double radians); ... • Die sog. „this“-Referenz – Analog zum „ich“ bei Menschen – Quasi ein Verweis auf sich selbst – Im Prinzip ein implizit vorhandenes Attribut vom Typ der Klasse „this“-Pointer von p1 x1 y1 „this“-Pointer von p2 x2 y2 „this“-Pointer von p3 x3 y3 ... Security - 04 Cryptology #76 Umsetzung in Java • Jede (normale) Klasse wird in einer separaten Datei abgelegt – Dateiname entspricht Klassennamen – Konvention: Großschreibung für Klassenname – Beispiele: Punkt, Mensch, Lampe, Bus, String, ... • Konvention: Kleinschreibung für – primitive Datentypen – Variablen – Methodennamen (Beispiele: byte, short, boolean) (Beispiel: myInt, meinPrivatBus) (Beispiel: oelwechsel(), main(String[] args)) • Jede Klasse mit main()-Methode kann ausgeführt werden – Bisher: Immer eine Klasse ohne Attribute und Methoden 5-2-77 Umsetzung in Java: Klasse • Schlüsselwort: class – In unserem Fall immer: public class { ... } – In der Blockanweisung können Attribute und Methoden definiert werden (später) • Beispiel: – Datei “Punkt.java” : public class Punkt { } – Datei “Mensch.java”:public class Mensch { } Security - 04 Cryptology #78 26 08.01.2013 Umsetzung in Java: Attribute • Syntax: Typ Name; – Typ: Primitiver Datentyp, Array oder Name einer Klasse • Beispiel – public class Punkt { double x; double y; } • Zugriff auf Attribute über Objektreferenz.Attributname – Punkt p = new Punkt(); – p.x = 1; – System.out.println( “p.x = “ + p.x ); 5-2-79 Umsetzung in Java: Methoden • Rückgabetyp Methodenname(Typ1 Name1, T2 N2,…){…} – Wie Funktionen liefern Methoden einen Wert eines bestimmten Datentyps zurück – Ergänzend zu Funktionen können Methoden Attribute lesen und verändern – Vorsicht: Methoden sind nicht „static“ • Beispiel – public class Punkt { void setze(double x, double y) { … } void verschiebe(double dx, double dy) { … } void rotiere(double radians) { … } } Security - 04 Cryptology #80 Aufruf von Methoden • Wie Attribute werden Methoden über eine Objektreferenz angesprochen – Syntax: Objektreferenz.Methodenname(...) • Beispiel – Punkt p = new Punkt(); – p.verschiebe(1.2, 3.4); Security - 04 Cryptology #81 27 08.01.2013 Überladen von Methoden • Mehrere Methoden gleichen Namens in einer Klasse erlaubt – Prinzip der sog. „Überladung“ eines Identifiers / Namens – Gleicher Rückgabetyp, aber unterschiedliche Parameter • Beispiel – void gebeAus(int i); – void gebeAus(String s); – void gebeAus(double d); – gebeAus(1); //Aufruf von void gebeAus(int i); – gebeAus(“Hallo“); //Aufruf von void gebeAus(String s); – gebeAus(2.098); //Aufruf von void gebeAus(double d); Konstruktoren: Umsetzung in Java • Konstruktoren: Methoden mit speziellem Namen und Rückgabetyp – Name der Methode: Klassenname – Rückgabetyp: Keiner, nicht einmal void – Konstruktor sollte alle Attribute initialisieren (guter Stil) • Syntax: Klassenname(Typ1 Name1, Typ2 Name2, …) {…} – Beispiel: Punkt(double x, double y) {...} • Eine Klasse kann mehrere Konstruktoren haben – Gleiches Prinzip wie Überladen von Methoden • Ein Konstruktor kann als erstes anderen Konstruktor aufrufen – Syntax: this(...parameter...); Statische Methoden • Methoden verändern den Zustand einer Objektinstanz – bzw. liefern Informationen über deren Zustand • Manchmal praktisch, dieses Modell zu durchbrechen – Main-Methode (Programmstart: keine Instanzen) – Mathematische Funktionen (Wurzel, Sinus, Kosinus, etc.) • Primitive Datentypen sind keine Objekte • new Sinus(1).getWert() 1.sinus() funktioniert nicht zu großer Overhead • Beispiele http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html 28 08.01.2013 Statische Methoden und Attribute • Schlüsselwort static (unabhängig von Klasseninstanzen) – Es gibt keine „this“-Referenz (keine Instanz verfügbar) – Statische Elemente können nur andere statische Elemente verwenden – Aufruf anderer statischer Methoden oder verwenden statischer Variablen • Statische Methoden – Definition: static void statischeMethode(...) {...} – Verwendung: Klassenname.methodenname(Parameter) • Statische Attribute – Definition: static int statischesAttribut; – Verwendung: Klassenname.attributname; 5-3-85 Java: Packages, Classpath, JARs Security - 04 Cryptology #86 Namensräume • Alternative zu langen Namen • Eingruppieren von Klassen in verschiedene Namensräumen – Unterscheidung von Klassen durch Angabe des Namensraums – Beispiel: Punkt aus „Farbe“ vs. Punkt aus „Mathe“ • Namensräume in Java: sog. „packages“ Namensraum „Farbe“ Namensraum „Mathe“ Punkt Punkt Attribute: int rot; int gruen; int blau Attribute: double x; double y; Methoden: void setze(double x, double y); void verschiebe(double dx, double dy); void rotiere(double radians); Methoden: Security - 04 Cryptology #87 29 08.01.2013 Packages • Es ist üblich, Klassen in Packages zu gruppieren – Bessere Übersichtlichkeit – Vorbeugung von Namenskonflikten – Zusammengehörige Klassen kennzeichnen • Analogie – Klassennamen sind vergleichbar mit einem Vornamen – Package-Name entspräche dann dem Familiennamen • Package-Namen: Gleiche Einschränkungen wie Identifier – z.B. kein „-“ erlaubt – Konvention: Kleinschreibung (also „mathe“ statt „Mathe“) Nested Namespaces: Java Beispiel • Einzelne Bestandteile werden durch „.“ getrennt • Beginnt bei der höchsten Hierarchiestufe – Ähnlich wie im Dateisystem – Packages müssen immer „absolut“ angegeben werden (d.h. alle Namensteile müssen vorhanden sein) Security - 04 Cryptology #89 Packages: Dateisystem und Packages • Java-Dateien müssen im Dateisystem so abgelegt sein, dass deren Pfade die Package-Namen widerspiegeln • Beispiele für verschiedene Punkt-Klassen (alle jeweils in „Punkt.java“) – Im folgenden angenommen: Projektverzeichnis ist ~/coding/aufgabe2 – package farbe; – package farbe.rgb; – package farbe.rgb.version1; – package farbe.cmyk; – package mathe; – package de.uni_luebeck.itm. programmieren.ws1213.uebung1.aufgabe2; • • • • • • ~/coding/aufgabe2/farbe/Punkt.java ~/coding/aufgabe2/farbe/rgb/Punkt.java ~/coding/aufgabe2/farbe/rgb/version1/Punkt.java ~/coding/aufgabe2/farbe/cmyk/Punkt.java ~/coding/aufgabe2/mathe/Punkt.java ~/coding/aufgabe2/de/uni_luebeck/itm/programmieren/ws1213/uebung1/aufgabe2/Punkt.java 30 08.01.2013 Packages: Verwendung • Zwei Varianten zur Verwendung von Klassen aus anderen Packages • Angabe des voll-qualifizierten Namens (Klasse + Package) – package test; ... farbe.rgb.Punkt p = new farbe.rgb.Punkt(); • Importieren bestimmter Klassennamen – Um die Angabe des voll-qualifizierten zu ersparen (Lesbarkeit) – Schlüsselwort: import – import farbe.rgb.Punkt; ... Punkt p = new Punkt(); 5-3-91 Java Classpath • Über den Classpath kann man dem Compiler verschiedene „Startpunkte“ für die Suche mitteilen – Von diesen aus sucht Java nach Klassen in verschiedenen Packages – Das heißt, dass das Programm über viele Orte „zerstreut“ sein kann • Verschiedene Möglichkeiten – Standardverhalten – Umgebungsvariable CLASSPATH – Kommandozeilenparameter Security - 04 Cryptology #92 JAR Dateien - Motivation • Java-Programme bestehen aus vielen Klassen – Jede Klasse hat ein eigenes „.class“-File – Programme bestehen aus vielen Ordnern und Dateien – Ausliefern: Zippen, versenden, dort wieder entpacken und starten • Einfacher: Class-Dateien in JAR-Archiv zusammenfassen – JAR: Java Archive – Im JDK enthalten ist ein Programm namens „jar“ zum Anzeigen, Packen und Entpacken von Jar-Dateien • JAR-Dateien können direkt in den Classpath eingebunden werden – Keine Notwendigkeit, JAR-Dateien vor Verwendung auszupacken 31 08.01.2013 Vererbung und Polymorphismus Security - 04 Cryptology #94 Vererbung • Man versucht, zu ähnlichen Klassen eine gemeinsame Oberklasse zu finden • Fasst Ähnlichkeiten zusammen – In Form von Attributen, Verhalten (Methoden), Beziehungen zu anderen Klassen • Ergänzt in den Unterklassen lediglich die Unterschiede – Ergänzende Attribute, Methoden, Beziehungen zu anderen Klassen 5-2-95 Vererbung • Gemeinsamkeiten ähnlicher Klassen werden zu einer Oberklasse zusammengefasst Fahrzeug hersteller: String wechselintervall: int km_gefahren: int baujahr: int oelwechsel() Gemeinsame Oberklasse Bus PKW hersteller: String wechselintervall: int km_gefahren: int baujahr: int toilette: boolean hersteller: String wechselintervall: int km_gefahren: int baujahr: int Bauart: String oelwechsel() toiletteLeeren() Gemeinsamkeiten oelwechsel() cabrioDach() : boolean 5-2-96 32 08.01.2013 Vererbung in Java • Vererbung wird über Schlüsselwort extends angegeben Fahrzeug ... – Man kann von genau einer Oberklasse erben – Anderen Programmiersprachen erlauben auch von mehreren Oberklassen zu erben (C++, ...) • Syntax: class Unterklasse extends Oberklasse {...} • Beispiel ... Bus PKW ... ... ... ... – class Bus extends Fahrzeug {...} – class PKW extends Fahrzeug {...} 5-2-97 Vererbung in Java Object ... • In Java gibt es eine Oberklasse aller Klassen – java.lang.Object ... Gegenstand ... • Wenn keine Oberklasse angegeben ist, wird Object automatisch zur Oberklasse – Konsequenz: java.lang.Object ist Oberklasse jeder Klasse – Vielleicht nicht direkt, aber irgendwann auf jeden Fall • Dies ist nicht in allen Programmiersprachen so – z.B. nicht in C++ ... Fahrzeug ... ... Bus PKW ... ... ... ... Security - 04 Cryptology #98 Vererbung und Instanzen • Von jeder Klasse können Instanzen erzeugt werden • Diese können ganz normal verwendet werden • Beispiele – Fahrzeug f = new Fahrzeug(); f.oelwechsel(); Fahrzeug ... – Bus b = new Bus(); b.oelwechsel(); b.toiletteLeeren(); ... – PKW p = new PKW(); p.oelwechsel(); p.cabrioDach(); Security - 04 Cryptology Bus PKW ... ... ... ... #99 33 08.01.2013 Vererbung und Instanzen • Merkregel: Vererbungsbeziehung drückt eine „ist ein“ Beziehung aus – Beispiel: Ein PKW ist ein Fahrzeug – Aber: Nicht jedes Fahrzeug ist ein PKW • Variablen der Basisklasse können auf Referenzen der Subklassen verweisen – Fahrzeug f = new Fahrzeug(); – Fahrzeug f1 = new PKW(); Fahrzeug – Fahrzeug f2 = new Bus(); ... – Bus b = new Bus(); Fahrzeug f3 = b; • ... Aber nicht umgekehrt – Bus b = new Fahrzeug(); Bus PKW ... ... ... ... //Fehler Security - 04 Cryptology #100 Schlüsselwort „super“ • Jede Instanz hat eine Referenz auf „Ober-Instanz“ Gegenstand ... – z.B. um Attribute und Methoden explizit zu referenzieren super ... – Diese heißt „super“ Fahrzeug • • Erfüllt ähnlichen Zweck zum Zugriff auf Elemente der Oberinstanz wie „this“ für die aktuelle Instanz ... ... super Aufruf des super-Konstruktors (aus Child-Konstruktor), Aufruf von super-Methoden und Zugriff auf super-Attribute super Bus PKW ... ... ... ... Security - 04 Cryptology #101 Modifier • Wichtig bei Objektorientierung: „information hiding“ – Jeder soll nur das verwenden können, was relevant ist – Trägt zur Übersichtlichkeit und Fehlersicherheit bei • Zugriffsbeschränkung möglich für – – – – Klassen Attribute Konstruktoren Methoden • Wird über sog. Modifier gesteuert – Schlüsselwörter: public, protected, private, „nichts“ 34 08.01.2013 Modifier Klasse Package Unterklasse Überall public protected* (komisch) Keine Angabe: „package private“ private* *) Nicht für Klassen (nur für Attribute, Konstruktoren und Methoden) Polymorphismus • Methoden von Oberklassen können in Unterklassen redefiniert werden • Überladen (Overloading) – Methode mit gleichem Namen und unterschiedlichen Parametern – Rückgabetyp bleibt gleich • Überschreiben (Overriding) Polymorphismus – Gleiche Signatur einer Methode in einer Unterklasse – Nach außen gleiches Interface, aber anderes Verhalten Überschriebene Methoden • In Java entscheidet immer der Typ der referenzierten Instanz • Fahrzeug f = new Fahrzeug(); f.motorAn(); – Methode aus Klasse Fahrzeug • Fahrzeug f = new PKW(); f.motorAn(); – Methode aus Klasse PKW • Fahrzeug f = new Bus(); f.motorAn(); – Methode aus Klasse Bus Security - 04 Cryptology #105 35 08.01.2013 Abstrakte Klassen und Methoden & Interfaces Security - 04 Cryptology #106 Zusammenfassung der Probleme • Probleme – Implementierung der “Schnittstellen”-Methode in der Oberklasse oft sinnlos – Kein Zwang, bestimmte Methoden in Unterklassen zu implementieren • Lösung: Abstrakte Klassen und Methoden Security - 04 Cryptology #107 Abstrakte Klassen und Methoden • Man kann Klassen und Methoden als abstrakt kennzeichnen • Bedeutung: Von abstrakten Klassen können keine Instanzen erzeugt werden • Ist mindestens eine Methode einer Klasse abstrakt, so ist auch die Klasse abstrakt Security - 04 Cryptology #108 36 08.01.2013 Abstract und Vererbung • Abstrakte Methoden werden vererbt • Damit eine Klasse instanziiert werden kann (also nicht abstrakt ist), müssen in der Vererbungshierarchie alle abstrakten Methoden mit Implementierungen überschrieben werden • Wo dies geschieht ist dabei egal Security - 04 Cryptology #109 Interfaces • Können Klassen auch von mehreren Oberklassen erben? – Sogenannte Mehrfachvererbung – Prinzipiell ja (z.B. in C++), in Java jedoch nicht – Es können Konflikte entstehen, deren Auflösung kompliziert sein kann • Java bietet ähnliche Funktionalität über einen Trick – Neben „echten“ Oberklassen gibt es sog. Interfaces • Ein Interface enthält lediglich Methodensignaturen – D.h. keine Methodenimplementierung / kein Code – Vergleichbar mit Klassen, die nur abstrakte Methoden enthalten 5-2-110 Abstrakte Klasse vs. Interface • Abstrakte Klasse • abstract class Obst { public abstract double getPreisInEuro(); } • Interface • interface Obst { double getPreisInEuro(); } • Abstract wird implizit für Klasse und Methoden angenommen und muss daher nicht explizit auftauchen • Methoden eines Interfaces sind immer public 37 08.01.2013 Abstrakte Klasse vs. Interface • Abstrakte Klassen können auch „normale“ Methoden enthalten (mit Implementierung) – abstract class Obst { public void gebeAus() { ... } OK public abstract double getPreisInEuro(); } • Bei Interfaces ist dies nicht erlaubt – interface Obst { void gebeAus() { ... } nicht möglich double getPreisInEuro(); } Implementieren von Interfaces • Von einem Interface wird nicht geerbt, sondern es wird implementiert – Schlüsselwort: implements • Eine Klasse kann von max. einer Klasse erben – Aber sie kann beliebig viele Interfaces implementieren – Wenn mehrere Klassen ein Interface implementieren, besitzen sie Methoden mit identischen Signaturen • Beispiel: siehe nächste Folie Interfaces: Beispiel • class PKW extends Fahrzeug implements Gebrauchsgegenstand, CoolesMaennerspielzeug { //alle Interface-Methoden müssen implementiert werden } • Ein PKW „ist-ein“ Fahrzeug, GebrauchsGegenstand und CoolesMaennerspielzeug Fahrzeug Gebrauchs Gegenstand CoolesMaenner spielzeug Gebrauchsgegenstand 38 08.01.2013 Vererbungshierarchie • Kiwi „ist-ein“ – Obst – Herkunftsland Obst • Instanzen vom Typ Kiwi können per Typecast auf Obst und Herkunftsland abgebildet werden • Beispiel – Obst obst = new Kiwi(); – Herkunftsland land = new Kiwi(); Herkunftsland Kiwi – Obst obst2 = (Obst) land; – Herkunftsland land2 = (Herkunftsland) obst; Interfaces: Type Identification • Woran erkennt man Typ einer Instanz? – Obstbeispiel: Woran erkennt man, dass ein Objekt das Interface „Herkunftsland“ implementiert? • Java bietet Operator „instanceof“ – Syntax: instanz instanceof Klasse – Liefert einen Booleschen Wert zurück • Sogenannte Run-time type identification – Man kann zur Laufzeit des Programms feststellen, von welchem Typ eine Instanz ist 5-2-116 39