Programmieren-18-Zusammenfassung und Wiederholung

Werbung
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
Herunterladen