Teil 1

Werbung
Einführung in JAVA
– D R . P ETER M ERZ –
Wilhelm-Schickard-Institut für Informatik
Abteilung Rechnerarchitektur
Eberhard-Karls-Universität Tübingen
Inhalte der Vorlesung
Einleitung
1
Programmiersprachen und Compiler
4
Imperative Programmierung mit Java
19
Objektorientierte Programmierung mit Java
63
Zusammenfassung der Java-Sprachkonzepte
Peter Merz
Einführung in JAVA
133
2
WWW-Adressen
① Die aktuellen Folien/das Skript sind unter
http://www-ra.informatik.uni-tuebingen.de/lehre/ws02/java einf.html
verfügbar.
② J AVA -Entwicklungsumgebungen/DK finden Sie unter
http://java.sun.com/downloads/ (Sun JDK’s)
http://www.borland.com/jbuilder/ (Borland JBuilder)
③ J AVA -API-Dokumentation finden Sie unter
http://www-ra.informatik.uni-tuebingen.de/local/doc/java/1.4.1/docs (Lokal)
http://java.sun.com/j2se/1.4.1/docs/api/ (Sun)
④ Das J AVA -Tutorial finden Sie unter
http://www-ra.informatik.uni-tuebingen.de/local/doc/java/tutorial/ (Lokal)
http://java.sun.com/docs/books/tutorial/ (Sun)
Peter Merz
Einführung in JAVA
3
Programmiersprachen
Allgemeine Definition einer Programmiersprache:
Sprache zur Formulierung von Rechenvorschriften, die direkt oder indirekt
von einem Rechner ausgeführt werden können
indirekt: Umsetzung der Rechenvorschriften in ein für den Rechner verständliches
Format
Wichtige Eigenschaften einer Programmiersprache (PS):
✓ eindeutige Syntax –
Festlegung, welche Zeichenfolgen als Programme zugelassen sind
✓ eindeutige Semantik –
Festlegung, welche Auswirkung die Ausführung des Programms auf einem
Rechner hat
Peter Merz
Einführung in JAVA
4
Programmiersprachen
Klassifikation von Programmiersprachen:
• Maschinensprache
– Maschinenprogramm = Folge von elementaren, im Binärcode dargestellten
Befehlen, d.h. im Befehlssatz eines Mikroprozessors
– Maschinenprogramme sind direkt auf der Hardware ausführbar
– Maschinenprogramme sind nur sehr schwer verständlich
• niedere, maschinenorientierte Programmiersprachen Assembler-Sprachen
Programmierung der Hardware unter Verwendung symbolischer Namen
• höhere, problemorientierte Sprachen
– Hardware-Unabhängigkeit
– Orientierung an den zu bearbeitenden Problemfeldern
– Abbildung in eine Maschinensprache durch Verwendung eines Übersetzers
(Compiler) oder direkte Ausführung unter Anwendung eines Interpreters
Peter Merz
Einführung in JAVA
5
Programmiersprachen
Der Paradigmabegriff:
• Synonyme Begriffe:
Denkmuster, Musterbeispiel
• Musterbeispiel
ein Beispiel, das typisch für eine Klasse von Beispielen ist, und somit auch
als Bezeichnung für das diesen Beispielen Gemeinsame verwendet wird
• Verwendung des Paradigma-Begriffes in der Informatik
– ein Paradigma bezeichnet ein übergeordnetes Prinzip
– dieses Prinzip ist für eine ganze Teildisziplin typisch
– es ist jedoch nicht klar ausformulierbar, sondern manifestiert sich in
Beispielen
Peter Merz
Einführung in JAVA
6
Programmiersprachen
Klassifikation von nach Programmierparadigmen:
➠ imperative Programmiersprachen
➠ funktionale Programmiersprachen
➠ prädikative Programmiersprachen
➠ deskriptive Programmiersprachen
➠ objektorientierte Programmiersprachen
✗ Beachte:
Programmiersprachen können Konzepte mehrerer Programmierparadigmen
enthalten!
Z.B. enthalten einige Objektorientierte Sprachen auch imperative Sprachkonzepte.
Peter Merz
Einführung in JAVA
7
Programmiersprachen
Imperative Sprachen:
• imperare (lat.): befehlen
• ein Programm besteht aus einer Folge von Befehlen an den Rechner, z.B.
– schreibe in die Variable a den Wert 3
– springe an die Stelle x im Programm
• wichtige Eigenschaften imperativer Programmiersprachen
– wesentlich ist die Verwendung des Variablenkonzepts:
Eingabewerte werden in Variablen (Speicherzellen) gespeichert und
weiterverarbeitet
– es spiegelt sich deutlich die Architektur des Von Neumann Rechners wider
• Beispielsprachen:
– F ORTRAN, C, PASCAL, M ODULA
Peter Merz
Einführung in JAVA
8
Programmiersprachen
Funktionale Sprachen:
• Programm = Menge von Ausdrücken, die Funktionen definieren
– eine Berechnung ist die Anwendung der Funktion auf eine Liste von Werten
– eine solche Anwendung nennt man auch Applikation ➠ Programmaufruf
• Eigenschaften:
– das wichtigste Konstruktionsprinzip ist die Rekursion
– Variablen sind keine Behälter, denen Werte zugewiesen werden
– Variablen sind Platzhalter für Werte und Funktionen, mit denen im
mathematischen Sinne symbolisch gerechnet wird
– Funktionen können als Parameter und als Ergebnisse von Funktionen
auftreten
• Anwendungsgebiete: Künstliche Intelligenz, Rapid Prototyping
• Beispiele: L ISP, S CHEME (L ISP-Dialekt für Ausbildungszwecke), . . .
Peter Merz
Einführung in JAVA
9
Programmiersprachen
Prädikative Sprachen:
• bei diesen Sprachen wird die Programmierung als Beweisen in einem System
von Tatsachen und Schlußfolgerungen aufgefaßt
• prinzipielle Vorgehensweise:
– Vorgaben durch den Anwender:
Fakten ➠ gültige Prädikate
Regeln ➠ wie gewinnt man aus Fakten neue Fakten
– Aufgabe des Rechners:
Beantwortung einer vom Anwender gestellten Frage als richtig, falsch oder
durch Angabe der Variablenwerte, für die die Aussage erfüllt ist
➭ der Anwender muß sein Problem exakt spezifizieren, die Vorgabe eines
Algorithmus zur Problemlösung ist nicht notwendig (und auch nicht möglich)
• Beispiele: P ROLOG, O PS 5
Peter Merz
Einführung in JAVA
10
Programmiersprachen
Deskriptive Sprachen:
• eine deskriptive Programmiersprache dient zur Beschreibung der
Eigenschaften gesuchter Informationen (üblicherweise Daten aus einer
Datenbank)
• Anwendung:
Formulierung von Anfragen, Eingaben, Änderungs- und Löschoperationen
in (relationalen) Datenbanken
• S QL (Structured Query Language) ist der wichtigste Vertreter deskriptiver
Programmiersprachen
➭ werden in Vorlesung “Informationssyteme” ausführlich behandelt
Peter Merz
Einführung in JAVA
11
Programmiersprachen
Objektorientierte Sprachen:
• objektorientierte
Programmiersprachen
basieren
auf
einem
Programmiermodell, das von einer (Mini-) Welt ausgeht, welche aus
gleichberechtigten und einheitlich erscheinenden Objekten besteht
• Daten und Anweisungen werden als Objekte aufgefaßt
• prinzipielle Struktur eines (rein) objektorientierten Programms:
– es gibt nur Objekte, die sich nach außen einheitlich verhalten und alle
gleichberechtigt sind
– Objekte besitzen Zustände, führen Operationen aus und können
Nachrichten empfangen und verschicken
– Programme enstehen durch Interaktion von Objekten
• Anwendungsgebiete: wiederverwendbare Software, große Softwareprojekte
• Beispiele: S MALLTALK, C++, E IFFEL, J AVA
Peter Merz
Einführung in JAVA
12
Interpretation und Übersetzung von Programmen
Interpreter:
Ein
Interpreter
ist
ein
Programm,
Programmiersprache A direkt ausführt.
das
Programme
einer
• Arbeitsweise:
– Schrittweise syntaktische Analyse der Anweisungen des Quellprogramms
– Ermittlung der Parameter und Aufruf einer internen Funktion zur Ausführung
einer Anweisung
• Interpretierte Sprachen:
A PL, B ASIC, L ISP, P ROLOG, P OST S CRIPT
Peter Merz
Einführung in JAVA
13
Interpretation und Übersetzung von Programmen
Compiler:
Ein Übersetzer (Compiler) ist ein Programm, das Programme aus einer
Programmiersprache A in eine Programmiersprache B übersetzt.
Eine Übersetzung ist somit die folgende Abbildung:
Quellsprache A ⇒ Zielsprache B
Somit wird jedem Quellprogramm genau ein Zielprogramm zugeordnet.
Wichtig:
Quell- und Zielprogramm müssen gleiche Bedeutung haben - semantische
Korrektheit!
Ziel:
Zielprogramm soll möglichst
Speicherplatzbedarf ➭ Effizienz!
Peter Merz
schnell
ausführbar
Einführung in JAVA
sein
bei
geringem
14
Interpretation und Übersetzung von Programmen
Übersetzungsphasen:
Quellprogramm
Lexikalische Analyse
Folge von Token
Syntaktische Analyse
Ableitungsbaum
Semantische Analyse
und Codegenerierung
Zielprogramm
CodeOptimierung
(effizienteres)
Zielprogramm
Peter Merz
Lexikalische Analyse:
Zerlegung in Token (Scanner)
Syntaktische Analyse:
Erzeugung eines Ableitungsbaums (Parser)
Semantische Analyse:
Analyse des Ableitungsbaums
Codegenerierung:
Erzeugung des Zielprogramms aus dem
Ableitungsbaum incl. Codeoptimierung
➭ Vorlesung Compilerbau!
Einführung in JAVA
15
Interpretation und Übersetzung von Programmen
Compilerarten:
• Compiler erzeugen i.d.R. Maschinencode für den Zielrechner
➠ sehr schnelle hoch optimierte Programme, die vom Prozessor direkt
ausgeführt
werden können (Interpretation durch Hardware)
• Crosscompiler ermöglichen Übersetzung für andere Rechnerarchitekturen
• Konzept der virtuellen Maschine:
– Generierung plattformunabhängigen Programmcodes
– Virtueller Maschinencode muß interpretiert werden
– Just-In-Time Compiler können die Ausführungsgeschwindigkeit deutlich
erhöhen
Peter Merz
Einführung in JAVA
16
Interpretation und Übersetzung von Programmen
Plattform(un)abhängige Übersetzungsvorgänge:
Platformabhängige Sprachen:
Quellcode
Compiler
Objectcode
Linker
Executable Maschinencode
Hardware
Runtime
System
Native
Maschinencode
Hardware
Platformunabhängige Sprachen:
Quellcode
Compiler
Virtueller
Machinencode
Just-In-Time
Compiler
✓ Anmerkung:
Beide Ansätze haben ihre Vorteile – Portabilität vs. Performanz!
Peter Merz
Einführung in JAVA
17
Programmbibliotheken
API (Application Programming Interface):
➠ Schnittstelle zu Programmbibliothek(en)
• API sind programmiersprachenabhängig
• Heutige Anwendungsprogrammierung ist undenkbar ohne API
• Beispiele für API:
– Benutzungsschnittstellen-API (GUI)
– Datenbank-API
– API für Internetfunktionen
– API für Betriebssystemfunktionen
– API für mathematische Berechnungen
– API für multimediale Präsentationen, . . .
Peter Merz
Einführung in JAVA
18
Die Programmiersprache JAVA
J AVA ist eine von der Firma Sun Microsystems entwickelte objektorientierte
Programmiersprache
J AVA ist . . .
. . . a simple, object-oriented, distributed, interpreted, robust, secure,
architectural neutral, portable, high-performance, multithreaded, and
dynamic language.
(Sun)
Historie von JAVA:
• Mai 1995: Vorstellung von J AVA auf der S UN W ORLD ’95
• Anfang 1997: Freigabe der Version J AVA 1.1
• Ende 1998: Freigabe der Version J AVA 1.2 (J AVA 2)
• Ende 1999: Freigabe von Version 1.3
• Mai 2001: Freigabe von Version 1.4
Peter Merz
Einführung in JAVA
19
Die Programmiersprache JAVA
Eigenschaften von J AVA:
➠ Plattformunabhängigkeit - Write Once, Run Anywhere
➠ Leichte Entwicklung von Netzwerkanwendungen – insbesondere Internet
➠ Objektorientierung als Basiskonzept
➠ Besondere Unterstützung verteilter und paralleler Anwendungen
➠ Robuste und sichere Sprache
➠ Lauffähigkeit von J AVA-Programmen im WWW-Browser (Applets)
➠ J AVA ist frei verfügbar (J DK: Java Development Kit))
Peter Merz
Einführung in JAVA
20
Die Programmiersprache JAVA
Sprachkonzepte von J AVA:
• angelehnt an C/C++, aber stark vereinfacht
– Kein Präprozessor
– keine Operatoren, Mehrfacherbung, Templates, . . .
• Bewährte Konzepte anderer Sprachen wurden integriert, z.B.
– Exceptions : Fehlerbehandlung
– Garbage Collection : Automatische Speicherfreigabe
– Package-Konzept : Zusammenfassung von Klassen
– Concurrency : Nebenläufigkeit durch Threads
• J AVA kommt mit sehr umfangreichen API
– GUI-API: Swing, AWT, Datenbank-Schnittstelle (J DBC)
– Network/Internet API inkl. Remote Method Invocation (R MI)
– J AVA B EANS: Komponenten-Modell
Peter Merz
Einführung in JAVA
21
JAVA Programme
① J AVA-Applikationen (Anwendung, engl. Application)
• Eine J AVA-Applikation ist ein J AVA-Programm, das direkt auf der
Betriebssystemebene gestartet werden kann
• die Applikation besteht aus einer oder mehreren Klassen
• (mindestens) eine Klasse muß eine main-Methode enthalten
• eine Applikation wird mit Hilfe des J AVA-Interpreters gestartet und
ausgeführt
② J AVA-Applets
• Applets sind J AVA-Programme, die in HTML-Seiten eingebunden werden
können (HTML: HyperText Markup Language)
• Applets können durch das Programm appletviewer (Teil des JDK) oder einen
WWW-Browser mit J AVA-Unterstützung, wie Netscape Communicator oder
Microsoft Internet Explorer ausgeführt werden
J AVA-Applikationen werden meistens einfach als J AVA-Programme bezeichnet!
Peter Merz
Einführung in JAVA
22
JAVA Programme
Ein einfaches J AVA Programm:
Der Quellcode eines einfachen J AVA-Programms (Dateiname: Hello.java):
// Hello.java
// A simple programm displaying ”Hello World”
class Hello {
public static void main( String [] args ) {
// System.out.println () : Ausgabefunktion aus der Syatem API
System.out.println ( ”Hello World!” );
}
}
Übersetzen und zu starten mit dem J DK:
– javac Hello.java (Erzeugt die Datei Hello.class)
– java Hello (startet das Programm)
Peter Merz
Einführung in JAVA
23
JAVA Programme
Nötige Schritte zu einem J AVA-Programm:
① Erstellen eines Quellprogrammes mit Hilfe eines Texteditors, z.B. Notepad
(Windows) oder kwrite (Unix/KDE)
② Übersetzen aller Quelldateien/Klassen, z.B. mit javac in der
Eingabeaufforderung
Ergebnis: Eine Sammlung von J AVA-Klassen im Bytecode (Dateiendung:
.class)
③ Start des Programmes durch Aufruf einer Klasse mit einer statischen
main-Methode mit dem J AVA-Interpreter java
Anmerkung: Die Endung .class muß weggelassen werden!
➭ J AVA-Programm = Sammlung von J AVA-Klassen im Bytecode
Peter Merz
Einführung in JAVA
24
Programmierparadigmen in JAVA
Unterscheidung zwischen Programmierung
im Großen
Die Konzentration auf das Zusammenwirken von Teilen nennt man
Programmierung im Großen, weil hier von der Gestalt der Teile abstrahiert
wird und nur das Außenverhalten betrachtet wird.
und Programmierung
im Kleinen
Die Ausformulierung von Teilen nennt man Programmierung im Kleinen, weil
auf die Einzelheiten eines Teils bzw. die interne Realisierung geachtet wird.
Programmierung im Großen ➠ Objektorientierte Programmierung
Programmierung im Kleinen ➠ Imperative Programmierung
Peter Merz
Einführung in JAVA
25
JAVA Syntax
Aufbau eines J AVA-Programms:
• Alle Zeichen zwischen ”/*” und ”*/” oder ”//” und dem Zeilenende werden als
Kommentar aufgefaßt
• Ein Programm ist eine Folge von Token, die durch Whitespaces (Leerzeichen,
Tabulatoren, Zeilenumbrüche) getrennt werden
• Ein oder mehrere Token ergeben eine Anweisung
➠ Ein J AVA-Programm besteht aus einer Folge von Anweisungen!
• Anweisungen sind:
– Deklarationen von Variablen
– (Mathematische) (Wert-)Zuweisungen
– Methoden-/Funktionsaufrufe
– Klassendefinitionen, Methodendefinitionen
Peter Merz
Einführung in JAVA
26
JAVA Syntax - Anweisungen und Ausdrücke
Anweisungen und Ausdrücke:
Vorläufige Definition einer Anweisung:
<Anweisung> ::= <Variablen-Deklaration> | <Wertzuweisung> |
<Deklaration und Wertzuweisung> | <Prozeduraufruf>
<Variablen-Deklaration> ::= <Typ> <Bezeichner>;
<Wertzuweisung> ::= <Bezeichner> = <Ausdruck>;
<Deklaration und Wertzuweisung> ::= <Typ> <Bezeichner> = <Ausdruck>;
Ein Ausdruck ist in J AVA ein Bool’scher oder arithmetischer Ausdruck (vorläufige
Def.):
<Ausdruck> ::= <Konstante> | <Variable> | (<Ausdruck>) |
<Unärer Operator> <Ausdruck> |
<Ausdruck> <Binärer Operator> <Ausdruck> |
<Wertzuweisung> | <Funktionsaufruf>
Peter Merz
Einführung in JAVA
27
JAVA Syntax - Gültige Bezeichner
Gültige Bezeichner in J AVA für Variablen:
• Gültige Bezeichner beginnen mit einem Buchstaben
• Gültige Bezeichner bestehen aus Buchstaben und Zahlen
• Die folgenden reservierten Wörter sind nicht als Bezeichner zugelassen:
abstract default if private throw boolean do implements
protected throws break double import public transient byte
else instanceof return try case extends int short void
catch final interface static volatile char finally long super
while class float native switch const for new synchronized
continue goto package this
sowie true false null !
Peter Merz
Einführung in JAVA
28
JAVA Syntax - Primitive Datentypen
Primitive Datentypen in J AVA:
Datentyp
Inhalt
boolean
Bits KE
true oder false
1
char
U NICODE-Zeichen
16
c
byte
vorzeichenbehaftete Integer-Zahl
8
b
short
vorzeichenbehaftete Integer-Zahl
16
int
vorzeichenbehaftete Integer-Zahl
32
long
vorzeichenbehaftete Integer-Zahl
64
l
float
IEEE 754-1985 Floating-Point-Zahl
32
f
double
IEEE 754-1985 Floating-Point-Zahl
64
d
Minimalwert
Maximalwert
\u0000
\uFFFF
-128
127
-32768
32767
-2147483648
2147483647
-9223372036854775808
9223372036854775807
±1.40239846 E -45
±3.40282347 E 38
±4.94065645841246544 E- 324
±1.79769313486231570 E 308
KE: Konstantenendung
Peter Merz
Einführung in JAVA
29
JAVA Syntax - Primitive Datentypen
Beispiele für Variablendeklarationen:
int i , j ; // Deklaration von Integervariable i und j
float x ; double y; // Deklaration von zwei Fliesskommazahlen
i = 10;
j = i;
x = 5f ;
y = −1.2e3;
//
//
//
//
Eine ganze Zahl mit dem Wert 10
Die Variable j erhaelt den Wert von i
Das f gibt eine float −Konstante an
Eine Zahl mit Exponent −1.2 ∗ 10 hoch 3
int n = 20; // Die Kombination von Deklaration und Wertzuweisung
i = j = 42; // Dies ist auch moeglich
✗ Beachte:
Der Rückgabewert einer Zuweisung ist der zugewiesene Wert!
Peter Merz
Einführung in JAVA
30
JAVA Syntax - Operatoren
Unäre Operatoren:
Operator
Operandentyp Ergebnistyp Beschreibung
−
numerisch
numerisch
!
boolean
boolean
Negierung
∼
integral
integral
bitweises Komplement
numerisch
numerisch
Typumwandlung (cast)
(type)
Vorzeichenänderung
Binäre Operatoren:
Operator
Operandentyp Ergebnistyp Beschreibung
−,+
numerisch
numerisch
Addition und Subtraktion
∗,/,%
numerisch
numerisch
Multiplikation, Division, Rest
integral
integral
Bitweise Links-/Rechts-Verschiebung
numerisch
boolean
Vergleichsoperatoren
&&,||
boolean
boolean
Logische UND-/ODER-Verknüpfung
&, |, ˆ
integral
integral
Bitweises AND, OR, XOR
<<,>>,>>>
>,<,==, ! =, <=,
>=
Peter Merz
Einführung in JAVA
31
JAVA Syntax - Operatoren
Sonderformen:
• Dekrement/Inkrementoperatoren: --, ++
– x--, --x dekrementiert eine numerische Variable (x) um 1
– x++, ++x inkrementiert eine numerische Variable (x) um 1
– ist der Operator vorangestellt (nachgestellt), ist der Rückgabewert des
Ausdruckes der neue (alte) Wert der Variable
• Kombinierte Zuweisung und Arithmetik:
Operatoren: +=, -=, *=, /=, %=, &=, |=, ˆ=, <<=, >>=, >>>=.
– Die Anweisung x ⊗= y; ist eine Kurzschreibweise für x = x ⊗ y;
Peter Merz
Einführung in JAVA
32
JAVA Syntax - Operatoren
Beispiele zur Verwendung von Operatoren:
int i , j ;
float x ;
double y;
boolean b;
//
//
//
//
Zwei Integer−Variablen
Flieskommazahl einfacher Genauigkeit
Flieskommazahl doppelter Genauigkeit
Eine Boolsche Variable
i = 42;
// i bekoomt einen sinnvollen Wert
j = i >> 1; // j bekommt den Wert 21 == 42 / 2
i = j −−;
// i bekommt den Wert 21 und j den Wert 20
b = (0 <= i && i <= 50); // i liegt zwischen 0 und 50, also b = true
b = !b;
// b = false
x = 5;
// x bekommt den Wert 5
x /= 10;
// x = 5 / 10 = 0.5
y = x + 4; // y = 0.5 + 4 = 4.5
j = ( int )y ; // j = 4
i ++;
// So wird der Inkrement−Operator verwendet!
Peter Merz
Einführung in JAVA
33
JAVA Syntax - Operatoren
Operator-Prioritäten:
Operator
Priorität
Zuweisung, Zuweisung mit arithm. Operation
1
Logisches ODER, UND
2, 3
Bitweises OR, XOR, AND
4, 5, 6
Vergleich == und !=
7
Vergleich <, >, >=, <=
8
Verschiebungsoperatoren
9
Addition und Subtraktion
10
Multiplikation, Division und Rest
11
Typumwandlung und restl. unäre Operatoren
12
✓ Anmerkung:
Die Klammerung eines Teilausdrucks ändert die Reihenfolge der Auswertung!
Peter Merz
Einführung in JAVA
34
JAVA Syntax - Operatoren
Implizite Typumwandlung:
Wenn die Operanden eines binären numerischen Operators verschiedene Typen
haben,
erfolgt eine implizite Typumwandlung (Numeric Promotion):
• Wenn einer der Operanden von Typ double ist, wird der andere nach double
konvertiert.
• Andernfalls, wenn einer der Operanden von Typ float ist, wird der andere nach
float konvertiert.
• Andernfalls, wenn einer der Operanden von Typ long ist, wird der andere nach
long konvertiert.
• Andernfalls werden beide nach int konvertiert.
Peter Merz
Einführung in JAVA
35
JAVA Syntax - Operatoren
Beispiel für Typumwandlung und geschachtelte Ausdrücke:
int i = 4, j = 1;
float x = 5, y;
double u = 5, v;
y = x + 10 / x ;
y = ( x + 10) / x ;
// y = 5 + 2 = 7 Punkt vor Strich−Rechnung!
// Erst die Addition : y = 15 / 5 = 3
float z = i ∗ x ;
int k = ( int )( i ∗ y );
x = ( float )u ;
v = x;
//
//
//
//
i wird implizit nach float gewandelt
Das Ergebnis von i ∗ y ist ein float !
Von double nach float casten!
Von float nach double nicht noetig
y=x +1/ i;
// y = 5 + 0 = 5 !!
y = x + 1.0 f / i ;
// y = 5 + 0.25 = 5.25 !!
y = x + ( float ) j / i ; // y = 5 + 0.25 = 5.25 !!
Peter Merz
Einführung in JAVA
36
Zeichenketten in JAVA
Zeichenketten - Strings:
Zeichenketten sind in J AVA vom Typ String, und werden mit Hilfe von (doppelten)
Anführungsstrichen definiert:
¨Dies ist eine Zeichenkette, also ein String!¨ .
Der + -Operator – auf Strings angewandt – bewirkt eine Konkatenation dieser
Strings:
¨Hello ¨ + ¨World¨ ist äquivalent zu ¨Hello World¨
Wenn einer der Datentypen kein String ist, wird er in einen String gewandelt!
String text = ¨Einundzwanzig: ¨ + (17+4);
Peter Merz
Einführung in JAVA
37
JAVA Programmbeispiel zu Operatoren
Beispiel Satz des Pythagoras:
// Programm zur Berechnung des Flaecheninhalts sowie der Hypotenuse
// eines Dreieckes
class Pythagoras {
public static void main(String [] args) {
double a = 3.5, b = 5.5;
double flaeche, hypotenuse;
flaeche = a ∗ b / 2;
// Math.sqrt(x) berechnet die Quadratwurzel von x: (aus Math API)
hypotenuse = Math.sqrt(a∗a + b∗b);
System.out.println( ”Katheten: ” + a + ” cm und ”+ b + ” cm”);
System.out.println( ”Flaecheninhalt: ” + flaeche + ” qcm”);
System.out.println( ”Hypothenusenlaenge: ” + hypotenuse + ” cm”);
}
}
Peter Merz
Einführung in JAVA
38
JAVA Programmierregeln
Regeln fürs strukturierte Programmieren:
✓ Deklarationen und Zuweisungen trennen
✓ Mehrfachzuweisungen vermeiden
✓ Dekrement-/Inkrementoperatoren sowie Zuweisungen nur in separaten
Anweisungen verwenden
✓ Jeden neuen Anweisungsblock einrücken
✓ Kommentare!
✓ Komplexe Ausdrücke klammern, um Lesbarkeit zu erhöhen
✓ Eine Anweisung pro Zeile!
✓ Aussagekräftige Variablennamen verwenden!
Peter Merz
Einführung in JAVA
39
Verzweigungen in JAVA
Verzweigungen im Programmfluß
(auch Sprünge genannt) lassen sich ebenfalls in J AVA realisieren.
Zunächst lassen sich Anweisungen zu einem
zusammenfassen, der selbst eine Anweisung darstellt:
(Anweisungs-)Block
<Anweisungsfolge> ::= <Anweisung> |
<Anweisungsfolge> <Anweisungsfolge>
<Anweisungsblock> ::= { <Anweisungsfolge> }
Die zuvor gegebene Definition einer Anweisung wird nun erweitert:
<Anweisung> ::= . . . | <Anweisungsblock> | <Bedingte Anweisung> | <Schleife>
Peter Merz
Einführung in JAVA
40
JAVA Syntax - Bedingte Anweisungen
Die If-Anweisung:
Will man eine Anweisung nur unter einer Bedingung ausführen lassen, so
verwendet man eine if-Anweisung:
<If-Anweisung> ::= if ( <Bedingung> ) <Anweisung> |
if ( <Bedingung> ) <Anweisung>
else <Anweisung>
Somit besteht die If-Anweisung aus einer Bedingung, die durch einen (bool’schen)
Ausdruck gegeben ist, und einer Anweisung, die ausgeführt wird, wenn die
Auswertung des Ausdruckes true ergibt.
Optional kann ein else-Zweig angegeben werden, der ausgeführt wird, wenn die
Bedingung nicht erfüllt ist.
Peter Merz
Einführung in JAVA
41
JAVA Syntax - Bedingte Anweisungen
Beispiele für if-Anweisungen:
/∗ Eine ganz einfache If−Anweisung ∗/
if ( x < 0) x = −x; // somit ist x immer positiv ( Betragfunktion)
/∗ Eine If −Anweisung mit else−Zweig ∗/
if ( x != 0) y = y / x;
else y = 0;
/∗ Eine If −Anweisung mit else−Zweig und Anweisungsablock ∗/
if ( x < 0) {
System.out.println( ”x war negativ”);
x = −x;
} else {
System.out.println( ”x war positiv ” );
}
Peter Merz
Einführung in JAVA
42
JAVA Syntax - Bedingte Anweisungen
Die Switch-Anweisung:
Für aufwendige Fallunterscheidungen eignet sich die switch-Anweisung:
<Switch-Anw.> ::= switch ( <Ausdruck> ) {
case <Konstante-1>: <Anweisungsfolge>
case <Konstante-2>: <Anweisungsfolge>
...
default: <Anweisungsfolge>
}
Ergibt der Ausdruck den Wert von Konstante-i, so werden alle Anweisungen nach
der
entsprechenden case <Konstante-i >: -Anweisung ausgeführt bis zum Ende der
Switch-Anweisung oder bis zum ersten Auftreten der Anweisung break !
Peter Merz
Einführung in JAVA
43
JAVA Syntax - Bedingte Anweisungen
Beispiele für Switch-Anweisungen:
int zahl;
zahl = 42; // Setze zahl auf irgendeinen Wert, z.B. 42
/∗ Zwei Switch Anweisungen ∗/
switch (zahl) {
case 0: System.out.println( ”Null” ); break;
case 1: System.out.println( ”Eins” ); break;
case 2: System.out.println( ”Zwei” ); break;
case 3: System.out.println( ”Drei” ); break;
default : System.out.println( ”So hoch kann ich nicht zaehlen!”);
}
switch (zahl) {
case 0: System.out.println( ”Null” ); break;
case 1:
case 2: System.out.println( ”Kleiner als Drei” ); break;
case 3: System.out.println( ”Drei” ); break;
default : System.out.println( ”So hoch kann ich nicht zaehlen!”);
}
Peter Merz
Einführung in JAVA
44
JAVA Syntax - Schleifen
Die While-Schleife:
Die While-Schleife ermöglicht die wiederholte Ausführung einer Anweisung (oder
eines Anweisungsblockes) solange eine Bedingung (bool’scher Ausdruck) erfüllt
ist.
<While-Schleife> ::= while( <Bedingung> ) <Anweisung> |
do <Anweisung> while( <Ausdruck> );
Es gibt zwei Varianten der While-Schleife:
Bei der ersten (zweiten) Variante wird die Bedingung vor (nach) Betreten der
Schleife geprüft.
Peter Merz
Einführung in JAVA
45
JAVA Syntax - Schleifen
Beispiele für While-Schleifen:
int i , n;
i = 1; n = 42; // i und n werden initialisiert
/∗ Zaehle von 1 bis 42 ∗/
while ( i <= n ) {
System.out.println( i );
i = i + 1; // Kurzschreibweise: i++;
}
/∗ i ist jetzt n + 1, Schleife wird nicht durchlaufen ∗/
while ( i <= n ) i ++;
System.out.println( i ); // Ausgabe: 43
/∗ i wird um eins erhoeht ∗/
do i++; while ( i <= n );
System.out.println( i ); // Ausgabe: 44
Peter Merz
Einführung in JAVA
46
JAVA Syntax - Schleifen
Die For-Schleife:
Eine Alternative zur While-Schleife ist die For-Schleife:
<For-Schleife> ::= for(<Zuweisung> <Bedingung>; <Ausdruck>)
<Anweisung>
Vor Beginn der Schleife wird die Zuweisung ausgeführt, dann wird eine Bedingung
überprüft, und solange diese erfüllt ist, die Anweisung
(oder ein Anweisungsblock) ausgeführt und <Ausdruck> ausgewertet.
Sie wird häufig wie folgt verwendet:
<For-Schleife> ::= for( <Variable> = <Konstante>;
<Variable> <Vergleichsoperator> <Ausdruck>;
<Inkrement/Dekrement-Operator>) <Anweisung>
Peter Merz
Einführung in JAVA
47
JAVA Syntax - Schleifen
Beispiele für For-Schleifen:
int i ;
int n;
n = 10;
/∗ Ausgabe der Zahlen von 0 bis n − 1 = 9 ∗/
for( i = 0; i < n ; i ++) {
System.out.println( i );
}
/∗ Ausgabe der Zahlen von 10 bis 1 in absteigender Reihenfolge ∗/
for( i = 10; i > 0; i −−) {
System.out.println( i );
}
Peter Merz
Einführung in JAVA
48
JAVA Syntax - Schleifen
Anmerkungen zu Schleifen:
• Schleifen können beliebig geschachtelt werden!
• Vorsicht vor Endlosschleifen!
• Mit break kann das sofortige Verlassen einer Schleife erzwungen werden
• Mit continue kann sofort an den Anfang der Schleife gesprungen werden
– Die restlichen Anweisungen im Anweisungsblock werden übersprungen
– Bei For -Schleifen wird <Ausdruck> ausgeführt
• break und continue sollten möglichst nicht verwendet werden
Peter Merz
Einführung in JAVA
49
JAVA Syntax - Schleifen
Äquivalente Ausdrücke:
/∗ A : ∗/
while ( true ) {
// ... Anweisungen ...
if ( bedingung ) break;
// ... Anweisungen ...
}
/∗ A : ∗/
for ( i = 0; i < n ; i ++ ) {
// ... Anweisungen ...
if ( bedingung ) continue;
// ... Anweisungen ...
}
/∗ B : ∗/
while ( bedingung ) {
// ... Anweisungen ...
if (! bedingung ) {
// ... Anweisungen ...
}
}
/∗ B : ∗ /
for ( i = 0; i < n ; i ++ ) {
// ... Anweisungen ...
if (! bedingung ) {
// ... Anweisungen ...
}
}
➠ break und continue nicht erforderlich!
Peter Merz
Einführung in JAVA
50
Schleifen in JAVA - Programmbeispiele
Beispielprogramm 1:
Ausgabe des ASCII-Zeichensatzes
// Programm zur Darstellung des ASCII−Zeichensatzes
class ZeichenSatz {
public static void main(String [] args) {
int i , j ;
System.out.println( ”Der ASCII−Zeichensatz:”);
for( i = 2; i < 16; i ++) {
for( j = 0; j < 16; j ++) {
char zeichen = (char)(16 ∗ i + j );
System.out.print(zeichen);
}
System.out.println ();
}
}
}
Peter Merz
Einführung in JAVA
51
Schleifen in JAVA - Programmbeispiele
Beispielprogramm 2:
Berechnung der Quadratwurzel:
Gesucht ist ein J AVA-Programm zur Berechnung der Quadratwurzel nach der
Newtonschen Methode.
(Iterationsverfahren, das ausgehend von einem willk√
ürlich vorgegebenen Startwert
eine Folge besser werdender Approximationen von x liefert.)
Bei gegebenem Startwert s0 ergeben sich die Folgewerte nach der Vorschrift:
si+1 =
x
si
+ si
2
Z.B. Iterationen Für die Quadratwurzel von 2:
s0 = 1 ⇒ s1 = 1.5, s2 = 1.41666, s3 = 1.41421 . . .
Peter Merz
Einführung in JAVA
52
Schleifen in JAVA - Programmbeispiele
// Programm zur Berechnung der Quadratwurzel
class QuadratWurzel {
public static void main(String [] args) {
double x, s, genauigkeit;
int i ;
s = 1; // Startwert s0
x = 17; // Die Wurzel von x=17 soll berechnet werden
genauigkeit = 1e−8; // Die Genauigkeit der Annaeherung
i = 0;
while( Math.abs(s∗s − x) > genauigkeit) { // Math.abs(): Math API
System.out.println( i + ”. Naeherung: ”+ s);
s = ( x / s + s ) / 2;
i ++;
}
System.out.println( ”Quadratwurzel von ” + x + ”: ” + s );
}
}
Peter Merz
Einführung in JAVA
53
Arrays in JAVA
Eindimensionale Arrays:
Arrays (dt.: Felder) bieten die Möglichkeit, eine beliebige Anzahl von Variablen
gleichen Typs simultan zu erzeugen.
Zunächst muß eine Referenz-Variable deklariert werden:
<Array-Referenz-Deklaration> ::= <Typ> [] <Bezeichner>;
Die Erzeugung eines Feldes mit vorgegebener Größe (<Ausdruck>) erfolgt
anschließend:
<Array-Definition> ::= <Bezeichner> = new <Typ>[<Ausdruck>];
<Ausdruck> muß einen ganzzahligen Wert (int) größer 0 ergeben.
Peter Merz
Einführung in JAVA
54
Arrays in JAVA
Eindimensionale Arrays (con’t):
Der Zugriff auf diese Variablen erfolgt durch Indizierung (<Ausdruck>):
<Array-Variable> ::= <Bezeichner>[<Ausdruck>]
<Ausdruck> muß einen ganzzahligen Wert (vom Typ int) größer gleich 0 ergeben.
Die Länge/Größe eines Arrays ergibt folgender Ausdruck:
<Array-Größe> ::= <Bezeichner>.length
Achtung:
✓ Ein Array beginnt bei Index 0 und endet bei seiner Größe - 1!
Peter Merz
Einführung in JAVA
55
Arrays in JAVA
Beispiele für eindimensionale Arrays:
double [] a ;
// Array−Referenz bereitstellen
int
i , n;
int
ersterWert, letzterWert ;
n = 42;
a = new double[n];
// Erzeugen des Feldes
// a.length == n!
for( i = 0; i < a.length ; i ++) {
a[ i ] = 42 − i ;
// Wertzuweisung
}
ersterWert = a [0];
letzterWert = a[n − 1];
// Ermittlung des Array−Wertes fuer Index 0
// Ermittlung des Array−Wertes fuer letzten Index
System.out.println( ”Laenge: ” + a.length + ” == ” + n);
System.out.println( ”Wert von a[0]: ” + ersterWert);
Peter Merz
Einführung in JAVA
56
Arrays in JAVA
Programmbeispiel zu Arrays:
Berechnung von Minimum, Maximum, Mittelwert und Standardabweichung einer
Zufallszahlenfolge x = {x1, . . . , xn}:
Mittelwert berechnet sich über die Formel:
1 n
x̄ = ∑ xi
n i=1
Die Standardabweichung ist definiert als:
σ (x) =
Peter Merz
s
1 n
(xi − x̄)2
∑
n − 1 i=1
Einführung in JAVA
57
Arrays in JAVA
// Programm zur Berechnung von Minimum, Maximum, Mittelwert und
// Standardabweichung einer Zufallsfolge
class Statistik {
public static void main(String [] args) {
int n = 10000;
// Anzahl der Zufallszahlen
double [] zufall ; // Die Referenz des Zufallszahlenvektors
double standardabw;
double mittelwert;
double min, max; // Die zu berechnenden Werte
double sum;
// Eine Hilfvariable fuer die Summenbildung
int i ;
// Ein Schleifenzaehler
/∗ Erzeuge n Zufallszahlen: ∗/
zufall = new double[n]; // erzeugt Platz fuer n Zahlen
for ( i = 0; i < n ; i ++) zufall [ i ] = Math.random(); // <− Math API
/∗ Berechnung des Mittelwertes, Min und Max: ∗/
sum = 0; min = 1; max = 0;
Peter Merz
Einführung in JAVA
58
Arrays in JAVA
for ( i = 0; i < n ; i ++) {
sum += zufall[ i ]; // berechne Summe
if ( min > zufall [ i ]) min = zufall [ i ];
if ( max < zufall[ i ]) max = zufall [ i ];
}
mittelwert = sum / n;
/∗ Berechnung der Standardabweichung: ∗/
sum = 0;
for ( i = 0; i < n ; i ++) {
sum += (mittelwert − zufall [ i ]) ∗ ( mittelwert − zufall [ i ]);
}
standardabw = Math.sqrt(sum / (n − 1.0));
/∗ Bildschirmausgabe: ∗/
System.out.println( ”Minimum
: ” + min);
System.out.println( ”Maximum
: ” + max);
System.out.println( ” Mittelwert
: ” + mittelwert );
System.out.println( ”Standardabweichung : ” + standardabw);
}
}
Peter Merz
Einführung in JAVA
59
Arrays in JAVA
Mehrdimensionale Arrays:
Analog zu eindimensionalen Arrays können mehrdimensionale Arrays definiert
werden:
• Statt einem eckigen Klammerpaar werden jetzt mehrere Klammernpaare
(in Abhängigkeit der Dimensionszahl) benötigt
• Ein mehrdimensionales Array kann als Array von Arrays angesehen werden
• Die Anzahl der Elemente der einzelnen Arrays kann unterschiedlich sein
Peter Merz
Einführung in JAVA
60
Arrays in JAVA
Beispiele für mehrdimensionale Arrays:
double [][] a ;
int [][] b;
// Array−Referenz bereitstellen
// ... Werte fuer n und m festlegen ...
a = new double[n][m];
// Erzeugen des Feldes
for( i = 0; i < n ; i ++)
for( j = 0; j < m; j++) {
a[ i ][ j ] = (42 − i ) ∗ j ; // Wertzuweisung
}
b = new int[n ][];
for( i = 0; i < b.length ; i ++) {
b[ i ] = new int[i + 2];
// b[ i ]’ s sind unterschiedlich lang!
}
for( i = 0; i < b.length ; i ++)
for( j = 0; j < b[ i ]. length ; j ++) {
b[ i ][ j ] = i ∗ j ;
// Wertzuweisung
}
Peter Merz
Einführung in JAVA
61
Parameter eines JAVA-Programms
Verarbeitung von Programmparametern:
Die Argumente (Parameter beim Programmaufruf) einer J AVA-Applikation werden
der main() -Funktion in einem Array von Strings übergeben.
Das folgende kleine Programm gibt diese Parameter als einen String aus:
// Ein Programm zur Ausgabe der Parameter einer
// JAVA−Applikation
class Parameters {
public static void main( String [] args ) {
String parameters = ””;
for( int i = 0; i < args.length ; i ++) parameters += args[i] + ” ” ;
System.out.println(parameters);
}
}
Peter Merz
Einführung in JAVA
62
Einführung in die Objektorientierung
Was ist eine Klasse?
Eine Klasse beschreibt die Eigenschaften und das Verhalten einer Menge
gleichartiger Objekte.
• Eine Klasse kapselt Daten und Operationen auf diesen Daten
➠ Datenkapselung!
• Eigenschaften – Attribute – werden durch primitive Datentypen oder komplexe
Datentypen = Klassen festgelegt
• Operationen sind Prozeduren/Funktionen, die die Daten lesen oder verändern,
sie werden Methoden genannt
• i.d.R. legt eine Klasse keine Ausprägung von Eigenschaften fest
• Die Schnittstelle legt von außen verwendbare Methoden/Attribute fest
• Interne Methoden/Attribute dienen zur Realisierung des Verhaltens und werden
vor dem Benutzer verborgen ➠ Geheimnisprinzip!
Peter Merz
Einführung in JAVA
63
Einführung in die Objektorientierung
Was ist ein Objekt?
Ein Objekt erhält alle Eigenschaften seiner beschreibenden Klasse, d.h. es
erhält alle Attribute und Methoden dieser Klasse. Darüber hinaus erhält es
Ausprägungen für alle Eigenschaften, d.h. es besitzt einen Zustand, in dem
es sich von anderen Objekten derselben Klasse unterscheiden kann.
• Ein Objekt wird auch als Instanz einer Klasse bezeichnet
• In einem Objekt nehmen in der Klasse definierte Attribute konkrete Werte an
• Es können beliebig viele Objekte einer Klasse gleichzeitig existieren
Peter Merz
Einführung in JAVA
64
Einführung in die Objektorientierung
Beispiele für Klassen und Objekte aus der realen Welt:
Klasse
Auto
Katze
Schauspieler
Objekt
Mein Golf, Ernies Ente, Toms Trabbi
Moritz, Omas scharzer Kater
Heinz Rühmann, Sandra Bullock
Attribute
Besitzer, Farbe, Alter
Name, Besitzer
Alter, Geschlecht, Genre
Beispiele in der Informationsverarbeitung:
Klasse
Fenster
Drucker
Grafikelement
Peter Merz
Objekt
Editorfenster
HP SW Laser, Canon Tintenstrahldr.
Linie, Kreis, Rechteck
Einführung in JAVA
Attribute
Hintergrundfarbe, Titel, Größe
Auflösung, Befehlssatz
Koordinaten, Füllmuster
65
Einführung in die Objektorientierung
Schritte der objektorientierten Softwareerstellung:
① Problemanalyse (OOA)
② Designphase (OOD)
• Einteilung der Daten und Funktionalität des Programmes in Klassen/Objekte
– Bilden einer Klassenhierarchie: Generalisierung und Spezialisierung
– Festlegen von Ist-Teil-von-Beziehungen, . . .
• Festlegung der Schnittstellen der Klassen
• Definition der Interaktion zwischen Objekten verschiedener oder gleicher
Klassen
③ Implementation
• Implementierung der Schnittstellenfunktionen und internen Funktionen
✗ Anmerkung: Softwareentwicklung ist ein iterativer Prozeß!
Peter Merz
Einführung in JAVA
66
Objektorientierte Programmierung in JAVA
Syntax einer Klassendefinition (vorläufig):
<Klasse> ::= class <Klassen-Bezeichner> {
<Attribute>
<Konstruktoren>
<Methoden>
}
Eine Klasse kann also aus einer Reihe von Attributen, Konstruktoren und
Methoden bestehen.
Im folgenden werden der Reihe nach Attributdefinitionen sowie Konstruktor- und
Methodendefinitionen besprochen.
Peter Merz
Einführung in JAVA
67
Objektorientierte Programmierung in JAVA
Modifizierer:
Modifizierer bestimmen den Zugriff auf Methoden und Attribute:
<Modifizierer> ::= public | protected
• public: von anderen Objekten aus aufrufbar
• protected: nur innerhalb des Objektes benutzbar
✗ Anmerkung:
Diese Definition ist vorläufig. Weitere Modifizierer kommen später hinzu.
Peter Merz
Einführung in JAVA
68
Objektorientierte Programmierung in JAVA
Attribute sind i.d.R. Variablen von primitiven Datentypen, die Eigenschaften von
Klassen/Objekten beschreiben:
<Attribute> ::= ε | <Attribute> <Attribute> |
<Modifizierer> <Typ> <Bezeichner>;
Beispiele:
public int size ;
protected double [] x;
protected String name;
protected float prozentsatz;
Peter Merz
//
//
//
//
Die Laenge einer Datenstruktur
Ein Array von Flieskommazahlen
Der Name eines Objektes als Zeichenkette
Der Prozentsatz einer Statistischen Erhebung
Einführung in JAVA
69
Objektorientierte Programmierung in JAVA
Parameter-Definitionen
kann man sich als eine Folge von
Variablen-Deklarationen vorstellen, die durch Kommata getrennt werden. Die
Definition von Parametern hat folgende Syntax:
<ParameterDef> ::= ε | <P-Liste>
<P-Liste> ::= <TYP> <Bezeichner> | <P-Liste>, <P-Liste>
Parameter werden durch eine Folge von Ausdrücken, die durch Komma
getrennt sind, beschrieben.
<Parameter> ::= ε | <Ausdr-Liste>
<Ausdr-Liste> ::= <Ausdruck> | <Ausdr-Liste>, <Ausdruck>
Peter Merz
Einführung in JAVA
70
Objektorientierte Programmierung in JAVA
Konstruktoren:
Konstruktoren werden nur bei Instanziierung (Erzeugung) eines Objektes der
Klasse aufgerufen. Sie tragen den Namen der Klasse:
<Konstruktoren> ::= ε | <Konstruktoren> <Konstruktoren> |
<Modifizierer> <Klassen-Bezeichner>(<ParameterDef>)
<Anweisungsblock>
Beispiele:
public MeineKlasse() {
// ..
}
// Ein Konstruktor ohne Parameter
public MeineKlasse(String text) { // Ein Konstruktor mit einem Parameter
//..
}
Peter Merz
Einführung in JAVA
71
Objektorientierte Programmierung in JAVA
Methoden:
Methoden haben einen Rückgabewert für den der Typ angegeben werden muß,
sowie eine Parameterliste, die leer sein kann:
<Methoden> ::= ε | <Methoden> <Methoden> |
<Modifizierer> <Typ> <Bezeichner>(<ParameterDef>)
<Anweisungsblock>
Mit der Anweisung return <Ausdruck>; wird ein Rückgabewert festgelegt,
dessen Typ dem deklarierten Rückgabe-Typ entsprechen muß.
Wird anstelle eines Rückgabe-Typs das Schlüsselwort void verwendet, hat die
Methode keinen Rückgabewert.
Peter Merz
Einführung in JAVA
72
Objektorientierte Programmierung in JAVA
Beispiele für Methodendefinitionen:
// Eine Prozedur die nur Klassenintern verwendet werden kann
protected void init ( int n) {
// ...
}
// Eine (Mathematische) Funktion
public double sinus(double x) {
// ...
}
// Eine methode mit Parametern unterschiedlicher Typen
// ( MyClass ist eine selbstdefinierte Klasse)
public int doit ( int m, double x, float y , int [] a , String s , MyClass obj) {
// ...
}
Peter Merz
Einführung in JAVA
73
Objektorientierte Programmierung in JAVA
Beispiel für eine Klassendefinition:
class BeispielKlasse {
// Definition von Datenfeldern
protected int value;
// Definition von Konstruktoren
public BeispielKlasse() {
value = 0;
}
// Definition von Methoden
public int getValue() {
return value;
}
public void setValue(int v) {
value = v;
}
}
Peter Merz
Einführung in JAVA
74
Objekte in JAVA
Erzeugung von Objekten:
Klassen werden während des Programmierens festgelegt, Objekte hingegen zur
Laufzeit erzeugt ➠ Mechanismus zur Instanziierung notwendig
In Java gibt es keine Objekt-Variablen. Es gibt nur Objektreferenzen, d.h. Verweise
auf Objekte!
Syntax zur Deklaration einer Objekt-Referenz:
<Objektreferenz-Deklaration> ::= <Klasse> <Bezeichner>;
Ist ein Bezeichner eine gültige Objektreferenz, so kann mit Hilfe von new ein neues
Objekt erzeugt und dieser Referenz zugewiesen werden:
<Instanziierung> ::= <Bezeichner> = new <Klasse>(<Parameter>);
Peter Merz
Einführung in JAVA
75
Objekte in JAVA
Beispiel für die Erzeugung von Objekten:
class MyClass {
// ...
}
MyClass object1;
object1 = new MyClass();
MyClass object2 = new MyClass();
object1 und object2 sind Instanzen der Klasse MyClass.
Die Objekte müssen nicht explizit nach ihrer Benutzung gelöscht werden, dies
übernimmt der Garbage Collector!
Klassen sind Typen ➠ sie werden ähnlich wie primitive Datentypen
verwendet Ähnlichkeit zu Arrays!
Peter Merz
Einführung in JAVA
76
Objekte in JAVA
Zugriff auf Methoden und Attribute:
Der Zugriff auf öffentliche Attribute und Methoden erfolgt mit Hilfe des
Dereferenzierungsoperators “.” :
Syntax für den Attributzugriff:
<Attribut-Zugriff> ::= <Objekt-Referenz>.<Attribut-Bezeichner>
Syntax für den Methoden-Aufruf:
<Methoden-Aufruf> ::= <Objekt-Referenz>.<M-Bezeichner>(<Parameter>);
✗ Anmerkung:
Innerhalb einer Klasse braucht keine Objektreferenz dem Methodennamen oder
Attributnamen vorangestellt werden!
Peter Merz
Einführung in JAVA
77
Objekte in JAVA
Beispiel für Objektdereferenzierung:
// Beispielklasse fuer Dereferenzierung
class Beispiel {
// Attribut
public int value;
// Methoden
public void calculate () {
// ...
}
double x, y;
int n;
Beispiel object ;
object = new Beispiel();
// Zugriff auf Attribut :
x = 3.0 ∗ object .value;
object .value = 12 ∗ n;
public double sinus(double x) {
// ...
return y;
}
}
Peter Merz
// Methoden−Aufruf
object . calculate ();
y = 1.0 / object .sinus(x );
Einführung in JAVA
78
Objekte in JAVA
Programmbeispiel Quadratwurzelberechnung:
// Programm zur Berechnung der Quadratwurzel
class Sqrt {
protected double genauigkeit; // Die Genauigkeit der Berechnung
// Der Konstruktor
public Sqrt(double g) {
genauigkeit = g;
}
// Die Berechnungsfunktion
public double calculate(double x) {
double s;
// PI = 3.14156;
s = 1; // Festlegung des Startwertes
while( Math.abs(s∗s − x) > genauigkeit) s = (x / s + s ) / 2;
return s ; // Rueckgabewert ist die berechnete Wurzel
}
Peter Merz
Einführung in JAVA
79
Objekte in JAVA
}
class QuadratWurzelOO {
public static void main(String [] args) {
double x, y;
Sqrt sqrt ;
Sqrt sqrtGenau;
x = 9;
sqrt = new Sqrt(1e−5);
sqrtGenau = new Sqrt(1e−10);
y = sqrt . calculate (x );
System.out.println( ”Quadratwurzel mit einfacher Genauigkeit: ” + y);
y = sqrtGenau.calculate(x);
System.out.println( ”Quadratwurzel mit hoher Genauigkeit: ” + y);
}
Peter Merz
Einführung in JAVA
80
Methoden in JAVA
Es gibt verschiedene Arten von Methoden:
• Methoden ohne Rückgabewert ➠ Prozeduren (stellen Anweisungen dar)
• Methoden, die in Abhängigkeit eines oder mehrerer Parameter ein Ergebnis
zurückliefern ➠ Funktionen (können in Ausdrücken verwendet werden)
Beispiel:
public void calculateY() {
// set a value for x ...
if ( isValid (x ) ) y = 1.5 / ( abs(x) + z ) / PI;
else reportError(x );
// ...
}
Peter Merz
Einführung in JAVA
81
Methoden in JAVA
Beispiel (con’t):
protected double abs(double x) {
if ( x < 0) x = −x;
return x;
}
protected boolean isValid(double x) {
return (x != 0);
}
protected void reportError(double x) {
System.out.println( ”The value of x was invalid: ” + x );
// ...
exitProgramm(); // Sofortiges Beenden des Programmes
}
Peter Merz
Einführung in JAVA
82
Methoden in JAVA
Es wird zwischen internen Methoden und öffentlichen Methoden unterschieden:
• Interne Methoden werden nur von Methoden des selben Objekts aufgerufen
• Öffentliche Methoden können aus allen Objekten aufgerufen werden
➭ Modifizierer: public für öffentliche und protected für interne Methoden
Weiterhin lassen sich Methoden danach unterscheiden, ob sie den Zustand eines
Objektes ändern ➠ Änderung eines oder mehrerer Attribute:
class Sqrt { // ... wird erweitert :
// ...
public void setPrecision(double p) {
genauigkeit = p;
}
}
Peter Merz
Einführung in JAVA
83
Methoden in JAVA
Methodenaufrufe:
Was passiert bei einem Methodenaufruf?
① Die Parameter-Ausdrücke werden den Variablen in der Parameterliste
zugewiesen
② Die Anweisungen im Anweisungsblock werden der Reihe nach ausgeführt
③ Bei Methoden mit Rückgabewert legt der durch die return-Anweisung
angegebene Ausdruck den Wert des Methoden-Ausdrucks fest
Beispiel:
public void sort( int n , int [] array , String text ) {
System.out.println( text );
sortarray = array;
quicksort (0, n);
System.out.println( ”Quicksort has finished!” );
}
Peter Merz
Einführung in JAVA
84
Methoden in JAVA
public void doSort1() { // Die erste Version des Sortierens
int [] a;
a = new int[42];
sort (a.length / 2, a , ”Ein Array der Laenge 21”);
}
public void doSort2() { // Die zweite Version des Sortierens
int [] a;
a = new int[42];
{ // Dieser Anweisungsblock ist aquivalent mit dem Aufruf von sort
int n = a.length / 2; // Den Parametern wird ein Wert zugewiesen
int [] array = a;
String text = ”Ein Array der Laenge 21”;
System.out.println( text ); // Der Anweisungsblock von sort
sortarray = array;
quicksort (0, n);
System.out.println( ”Quicksort has finished!” );
}
}
Peter Merz
Einführung in JAVA
85
Methoden in JAVA
Methodenaufrufe (Funktionsaufrufe) in Ausdrücken:
Die Auswertung von Ausdrücken kann man sich als eine schrittweise Ersetzung
von Teilausdrücken vorstellen, bis der komplette Ausdruck ersetzt ist:
Sei x = 4 und y = 9:
2*x*x-(3+x)*(y-7) ➠ 8*x-7*2 ➠ 32-14 ➠ 18
Analog werden Methodenaufrufe in Ausdrücken durch ihren Rückgabewert ersetzt.
Sei folgende Methode (Funktion) gegeben:
public double abs(double x) {
if ( x < 0) x = −x;
return x;
}
Dann ergibt sich: 2*abs(1-x) ➠ 2*abs(-3) ➠ 2*3 ➠ 6
Peter Merz
Einführung in JAVA
86
Methoden in JAVA
Seiteneffekte sollten vermieden werden:
Eine Methode, die als Funktion in zusammengesetzten Ausdrücken verwendet
wird, sollte keine Attribute einer Klasse ändern:
class Seiteneffekte { // So sollte man es nicht machen !!!!!!!!!!!!!
protected int a ;
// Ein einfaches Attribut
public int abs(int x) {
if ( x < 0) x = −x; // Der Absolutwert wird berechnet
a = −x;
// Hier wird das Attribut veraendert!
return x;
}
public void calculate( int x , int y) {
int n;
/∗ Das Ergebnis dieses Ausdrucks haengt von der Auswertungsreihenfolge
der Teilausdruecke ab: ∗/
n = a∗abs(x)−(a−abs(y));
}
}
Peter Merz
Einführung in JAVA
87
Gültigkeitsbereiche in JAVA
Regeln für Gültigkeitsbereiche von Variablen und Referenzen:
Für als Parameter von Methoden/Konstruktoren deklarierte Variablen
und Referenzen (Bezeichner) gilt:
✓ Sie sind nur in der Methode bzw. dem Konstruktor gültig!
✓ Sie überdecken alle Attribute mit dem gleichen Bezeichner, die in der selben
Klasse definiert sind!
Für in Anweisungsblöcken
(Bezeichner) gilt:
deklarierte
Variablen
und
Referenzen
✓ Sie sind nur in diesem Anweisungsblock gültig!
✓ Sie überdecken alle Attribute mit dem gleichen Bezeichner, die in der selben
Klasse definiert sind!
Peter Merz
Einführung in JAVA
88
Gültigkeitsbereiche in JAVA
Statische Bindung:
Die Regeln für die Gültigkeitsbereiche habe eine wichtige Konsequenz:
In J AVA ist statische Bindung realisiert, d.h. bei der Definition einer Klasse
werden die Gültigkeitsbereiche der Variablen festgelegt.
➠ Der Aufruf einer Methode hat, unabhängig von wo sie aufgerufen wird, immer
die gleiche Semantik (sofern die Parameter die selben sind)!
Es folgt ein Beispiel.
Peter Merz
Einführung in JAVA
89
Gültigkeitsbereiche in JAVA
class Gueltig {
public static void main(String [] args) {
Beispiel beispiel ;
beispiel = new Beispiel (7.0); // Aufruf des Konstruktors
beispiel . printx ();
// Ausgabe des Attributs
beispiel .methode1(2.4);
beispiel .methode2();
}
}
class Beispiel {
protected int x;
public Beispiel(double x) {
this.x = 42;
System.out.println(x );
}
// this ist eine Refernz auf sich selbst !
// Ausgabe von x
public void printx () {
System.out.println(x );
}
// Ausgabe des Attributes
Peter Merz
Einführung in JAVA
90
Gültigkeitsbereiche in JAVA
public void methode1(double x) {
System.out.println(x );
printx ();
}
public void methode2() {
{
double x;
x = 3.45;
System.out.println(x );
}
System.out.println(x );
{
int x;
x = −1;
System.out.println(x );
}
System.out.println(x );
}
// Hier beginnt ein neuer Anweisungsblock
// Hier endet der 1. Anweisungsblock
// Hier beginnt ein 2. Anweisungsblock
// Hier endet der 2. Anweisungsblock
}
Peter Merz
Einführung in JAVA
91
Referenzen in JAVA
Referenzen auf Objekte und Arrays:
Da auf Arrays und Objekte nur Referenzen verwaltet werden, bewirkt die
Zuweisung nur ein Kopieren von Referenzen nicht aber den Inhalt der Arrays bzw.
Objekte
Konsequenzen:
➠ Mehr als eine Referenz kann auf das selbe Objekt zeigen:
Mögliche Seiteneffekte müssen beachtet werden!
➠ Das Kopieren von Objekten oder Arrays muß der Programmierer übernehmen!
➠ Zwei Referenzen sind gleich, wenn sie auf das selbe Objekt zeigen
➠ Zwei unterschiedliche Referenzen können auf gleiche Objekte zeigen
Beispiel für Referenzen und Objekte: Kinokarten und Sitzplätze
Peter Merz
Einführung in JAVA
92
Referenzen in JAVA
Grafische Darstellung:
Klasse Simple
Objekt A
Objekt B
Referenz:
simple1
Peter Merz
Referenz:
simple3
Referenz:
simple2
Einführung in JAVA
93
Beispiel für Referenzen in JAVA
// Eine einfache Klasse, die
// einen Integer−Wert speichert
class Simple {
protected int value ;
// Der Wert
public Simple(int val ) {
value = val ;
}
// Der Konstruktor zur Initialisierung
public Simple(Simple orig) {
value = orig .value ;
}
// Ein Kopierkonstruktor
// der ein Objekt in ein neues kopiert
public void setValue(int val ) {
value = val ;
// Setzen des Wertes
}
public void print () {
System.out.println(value ); // Ausgabe des Wertes
}
}
Peter Merz
Einführung in JAVA
94
Beispiel für Referenzen in JAVA
class Referenzen {
public static void main(String [] args) {
Simple simple1, simple2, simple3;
simple1 = new Simple(1);
simple2 = new Simple(2);
simple3 = simple1;
// Ein neues Objekt mit dem Wert 1
// Ein neues Objekt mit dem Wert 2
// Eine 2. Referenz auf das erste Objekt
simple1.print (); simple2.print (); simple3.print (); // Ausgabe: 1 2 1
simple1.setValue(42);
// Veraenderung des 1. Objekts
simple1.print (); simple2.print (); simple3.print (); // Ausgabe: 42 2 42
simple1.setValue(1);
// Das 1. Objekt bekommt seinen alten Wert
simple3 = new Simple(simple1); // Ein drittes Objekt wird erzeugt
simple1.setValue(42);
// Das 1. Objekt wird veraendert
simple1.print (); simple2.print (); simple3.print (); // Ausgabe: 42 2 1
}
}
Peter Merz
Einführung in JAVA
95
Beispiel für Referenzübergabe in JAVA
class Integer { // Eine Klasse die eine Integer Variable enthaelt
public int value;
}
class Increment {
public int increment(int value) {
value++;
// Eine Variable aus der Parameterliste wird inkrementiert
return value;
}
public int increment(Integer integer ) {
integer .value++; // Ein Attribut eines Objektes wird inkrementiert
return integer .value;
}
public int increment(int [] values) {
values[0]++;
// Ein Element eines Arrays wird inkrementiert
return values [0];
}
}
Peter Merz
Einführung in JAVA
96
Beispiel für Referenzübergabe in JAVA
class ReferenzenUebergabe {
public static void main(String [] args) {
int value , retvalue ;
Increment increment = new Increment(); // Ein neues Inkrement−Objekt
Integer integer = new Integer ();
// Ein neues Integer−Objekt
int [] values = new int [1];
// Ein neues int−Array
value = 41; values [0] = 41; integer .value = 41; // Initialisierung auf 41
retvalue = increment.increment(value);
System.out.println(retvalue + ” ” + value ); // Ausgabe: 42 41
retvalue = increment.increment(integer);
System.out.println(retvalue + ” ” + integer .value ); // Ausgabe: 42 42
retvalue = increment.increment(values);
System.out.println(retvalue + ” ” + values [0]); // Ausgabe: 42 42
}
}
Peter Merz
Einführung in JAVA
97
Konstanten in JAVA
Unveränderliche Attribute:
Bisher haben wir nur Attribute definiert, die veränderlich sind.
Mit dem Modifizierer final können wir bei der Definition des Attributs angeben,
daß es nicht verändert werden darf.
Somit können wir z.B. für Konstanten Namen vergeben!
Beispiel:
class Konstanten {
protected final int MAX LENGTH = 42; // Maximale Laenge z.B. fuer ein Array
public final double PI = 3.14159265; // Die mathematische Konstante Pi
protected final int MIN VALUE; // Die Variable muss im Konstruktor initialisiert werden
public Konstanten() {
MIN VALUE = 4000;
}
}
Peter Merz
Einführung in JAVA
98
Namenskonventionen in JAVA:
Namenskonventionen:
① Groß- und Kleinschreibung wird unterschieden! (J AVA ist case sensitive)
② Namen von Klassen beginnen mit Großbuchstaben (Bsp. Hello, HelloWorld )
③ Namen von Konstanten bestehen ausschließlich aus Großbuchstaben,
Unterstrichen, und Ziffern (Bsp. MAX SPEED )
④ Namen von Objekten, Methoden, und Attributen beginnen mit einem
Kleinbuchstaben (Bsp. myClass = new MyClass(), value, getValue()
⑤ Bei zusammengesetzten Wörtern werden neue Wörter
Großbuchstaben begonnen (Bsp. getContentsOfStream() )
Peter Merz
Einführung in JAVA
mit
einem
99
Klassenattribute und -Methoden in JAVA
Klassenattribute:
Bisher haben wir nur Attribute betrachtet, die einer Instanz (Objekt) zugeordnet
sind und folglich in jeder Instanz unterschiedliche Werte (Ausprägungen) haben
können.
Für Klassenattribute hingegen gilt:
• Sie sind Klassen und nicht Objekten zugeordnet!
• Ein Klassenattribut existiert genau einmal!
• Man braucht zur Verwendung kein Objekt erzeugen!
• Man spricht auch von statischen Attributen (dyn. Speicherzuordnung)
Klassenmethoden:
Analog können Klassenmethoden ohne ein Objekt verwendet werden. Sie
können aber nur auf Klassenattribute zugreifen!
Peter Merz
Einführung in JAVA
100
Klassenattribute und -Methoden in JAVA
Objekt- vs. Klassenattribute/Methoden:
Klasse GrafikElement
Attribute:
Gefüllt = ja
Objekt A:
Attribute:
Form: Kreis
Farbe: Rot
Peter Merz
Einführung in JAVA
Objekt B:
Attribute:
Form: Rechteck
Farbe: Blau
101
Klassenattribute und -Methoden in JAVA
Syntax:
Der Modifizierer static macht ein Klassenattribut oder eine Klassenmethode
kenntlich. Er wird an andere Modifizierer angehängt.
Zur Initialisierung kann ein Anweisungsblock definiert werden:
<Klassen-Initialisierer> ::= static <Anweisungsblock>
Verwendung eines Klassenattributes:
<Klassenattribut-Zugriff> ::= <Klassen-Bezeichner>.<Attribut-Bezeichner>
Verwendung einer Klassenmethode:
<Klassenmethoden-Aufruf> ::= <Klassen-Bezeichner>.<Methoden-Bezeichner>(<Parameter>);
Peter Merz
Einführung in JAVA
102
Klassenattribute und -Methoden in JAVA
Beispiele für Klassenattribute und -Methoden:
class StatischeElementeKlasse {
// Klassen−Attribute:
public static final double E = 2.71828182845904523536;
protected static int maxIndex;
// Initialisierer fuer Klassen−Attribute:
static {
maxIndex = 12;
}
// Klassenmethoden:
public static void setMaxIndex(int val) {
maxIndex = val;
}
public static int getMaxIndex() {
return maxIndex;
}
}
Peter Merz
Einführung in JAVA
103
Klassenattribute und -Methoden in JAVA
Jetzt können wir die bisher benutzten mathematischen Funktionen definieren:
class Math {
public static final double PI = 3.14159265358979323846;
public static double sqrt(double x) {
// Hier folgt die Implementierung ...
}
public static double abs(double x) {
// Hier folgt die Implementierung ...
}
public static double sin(double x) {
// Hier folgt die Implementierung ...
}
public static double exp(double x) {
// Hier folgt die Implementierung ...
}
}
Peter Merz
Einführung in JAVA
104
Klassenattribute und -Methoden in JAVA
Klassen mit gemischten Attributen:
class Mix {
protected int a;
protected static int b;
Mix(int wert) {
a = wert ; // Das Instanzattribut bekommt einen Wert
b = 17;
// Das Klassenattribut bekommt den Wert 17
}
public void print () {
System.out.println(a + ” ” + b ); // Ausgabe von a und b
}
public void setB(int wert) {
b = wert ; // Setzen der statischen Variable
}
Peter Merz
Einführung in JAVA
105
Klassenattribute und -Methoden in JAVA
Klassen mit gemischten Attributen (con’t):
class Statisch {
public static void main(String
Mix mix1, mix2;
mix1 = new Mix(1);
mix2 = new Mix(2);
mix1.print (); mix2.print ();
[] args) {
// 1. Objekt
// 2. Objekt
// Ausgabe der Werte
mix2.setB(42); // Das Klassenattribut wird auf 42 gesetzt
mix1.print (); mix2.print (); // Ausgabe der Werte
}
}
➠ Seiteneffekte beachten!
Peter Merz
Einführung in JAVA
106
Strings in JAVA
Zeichenketten:
Der Typ String ist in J AVA kein primitiver Datentyp, sondern eine Klasse!
➠ eine Variable vom Typ String ist eine Referenz
Eine (unvollständige) Definition der Klasse String:
class String {
// Konstruktoren
public String ()
{ /∗ Implementation ... ∗/ }
public String(char value [])
{ /∗ Implementation ... ∗/ }
// Methoden
public int length ()
{ /∗ Laenge des Strings ∗/ }
public char charAt(int index)
{ /∗ Zeichen an einer Position ∗/ }
public int indexOf(int ch)
{ /∗ Position eines Zeichens ∗/ }
public String substring( int beginIndex)
{ /∗ Teilstring ab einer Position ∗/ }
public String concat(String str )
{ /∗ Konkatenation ∗/ }
public int compareTo(String anotherString) { /∗ Vergleich mit einem anderen String ∗/ }
public static String valueOf(double d); { /∗ Konvertierung von double nach String ∗/ }
}
Peter Merz
Einführung in JAVA
107
Strings in JAVA
Programmbeispiel zu Strings:
// Eine Programm zur Ermittlung von Nummern zu Buchstaben
class Alphabet {
protected static final String alphabet = ”ABCDEFGHIJKLMNOPQRSTUVWXYZ”;
/// Ermittle die Nummer im Alphabet zu einem Buchstaben
protected static int nummerInAlphabet(char c) {
return alphabet.indexOf(c) + 1;
}
public static void main(String [] args) {
int i ;
for( i = 0; i < args.length ; i ++) {
char c;
c = args[ i ]. charAt(0);
System.out.println( ”Zeichen ” + c + ” ist Nummer ”+
nummerInAlphabet(c));
}
}
}
Peter Merz
Einführung in JAVA
108
Strings in JAVA
Konvertierung von und nach Strings:
• Konvertierung nach Strings:
Methoden der Klasse String der Form: public static String valueOf(<Typ> d);
• Konvertierung von Strings:
Methoden der Klassen Integer,Double, Boolean, Float, Long, Character, Short
class Double {
// ...
public static Double valueOf(String s) { /∗ Creates a Double object ∗/ }
public double doubleValue()
{ /∗ returns the double ∗/ }
}
class Integer {
// ...
public static Integer valueOf(String s ) { /∗ Creates a Integer object ∗/ }
public int intValue ()
{ /∗ returns the int ∗/ }
}
Peter Merz
Einführung in JAVA
109
Strings in JAVA
// Beispiel fuer das Konvertieren von String nach int
class Convert {
public static void main(String [] args) {
int [] a;
int summe, i;
a = new int[args.length ];
for( i = 0; i < args.length ; i ++) {
/∗ Variante 1: ∗/
Integer integer ;
integer = Integer .valueOf(args[i ]);
a[ i ] = integer . intValue ();
/∗ Variante 2 ( Kombination in einer Anweisung): ∗/
a[ i ] = Integer .valueOf(args[i ]). intValue ();
}
summe = 0;
for( i = 0; i < a.length ; i ++) summe += a[i];
System.out.println( ”Summe: ” + summe);
}
}
Peter Merz
Einführung in JAVA
110
Strukturierung von Klassen in JAVA
Strukturierungsmöglichkeiten von Klassen:
• Definition von Interfaces : Festlegung gemeinsamer Schnittstellen
• Erzeugung von Klassenhierarchien mit Hilfe von Vererbung
• Zusammenfassung von funktional ähnlichen Klassen zu Paketen ➠ Packages
Mit diesen “Features” lassen sich Bibliotheken für die Programmierung erstellen
➠ API (Application Programming Interfaces)
Peter Merz
Einführung in JAVA
111
Strukturierung von Klassen in JAVA
Interfaces
Interfaces ermöglichen die Vereinheitlichung von Klassen mit ähnlicher
Funktionalität ➠ Interfaces definieren gemeinsame Schnittstellen verschiedener
Klassen
Interface-Definitionen ähneln Klassendefinitionen mit folgenden Unterschieden:
• Es dürfen keine Konstruktoren, statische Klasseninitialisierer, Instanzattribute
oder Klassen-Methoden definiert werden
• Es dürfen nur unveränderbare Klassenattribute (Konstanten) mit unmittelbarer
Initialisierung deklariert werden
• Es dürfen nur Methoden mit dem Modifizierer public deklariert werden, aber
ohne Anweisungsblock (Rumpf)!
Eine Klasse kann beliebig viele Interfaces implementieren - Schlüsselwort
implements
Peter Merz
Einführung in JAVA
112
Beispiel für Interfaces in JAVA
interface SortingAlgorithm { // Schnittstelle fuer Sortieralgorithmen
public void sort(Sortable [] a);
}
interface Sortable { // Schnittstelle fuer Klassen die sortiert werden koennen
public double sortKey();
}
class SortableInteger implements Sortable { // Eine Klasse die einen Integer
protected int value ;
// beinhaltet nach dem sortiert werden kann
public double sortKey() { return (double)value; } // Der Sortierschluessel
}
class QuickSort implements SortingAlgorithm { // Das Sortierverfahren QuickSort
public void sort(Sortable [] a ) { /∗ Hier kommt die Implementierung ∗/ }
}
class MergeSort implements SortingAlgorithm {// Das Sortierverfahren MergeSort
public void sort(Sortable [] a ) { /∗ Hier kommt die Implementierung ∗/ }
}
Peter Merz
Einführung in JAVA
113
Vererbung in JAVA
Klassenhierarchien durch Vererbung:
Vererbung bedeutet in der Objektorientierung:
• Die Nachkommen einer Elternklasse erben alle Eigenschaften dieser Klasse,
d.h. alle Attribute und Methoden
• Die Nachkommen können Attribute und Methoden hinzufügen
• Die Nachkommen können Methoden überladen, d.h. die Implementierung von
Methoden ändern
Bei der Klassendefinition gibt das Schlüsselwort extends die
Vererbungsbeziehung an:
class A extends B { ... }
Peter Merz
Einführung in JAVA
114
Vererbung in JAVA
Basisklassen:
• Klassen, die am Anfang einer Vererbungshierarchie stehen, werden
Basisklassen genannt
• Übergeordnete Klassen werden Superklassen genannt
• Von übergeordneten Klassen abgeleitete Klassen werden Subklassen genannt
• Die implizite Basisklasse aller anderen Klassen ist die Klasse Object
Peter Merz
Einführung in JAVA
115
Vererbung in JAVA
Abstrakte Basisklassen:
• Basisklassen können auch undefinierte Methoden haben (Methoden ohne
Implementierung) ➠ abstrakte Methoden
• Um abstrakte Methoden zu kennzeichnen, wird der Modifizierer abstract
verwendet
• Eine Klasse, die eine abstrakte Methode enthält muss als abstract definiert
werden: abstract class MyClass { ... }
• Von einer abstrakten Klasse können keine Objekte erzeugt werden!
Peter Merz
Einführung in JAVA
116
JAVA Beispiel Vererbung
// Die Basisklasse Grafikelement
abstract class GrafikElement {
protected double [] x;
abstract public void draw(); // Unimplementiert!
}
// Ein einfacher Punkt − ein Vektor gibt die Koordinaten an
class Punkt extends GrafikElement {
public Punkt(double [] x)
{ /∗ ... ∗/ }
public void draw()
{ /∗ Zeichne Punkt ∗/ }
}
// Linie − zwei Vektoren noetig
class Linie extends Punkt {
protected double [] y;
public Linie(double [] x , double [] y ) { /∗ ... ∗/ }
public void draw()
{ /∗ Zeichne Linie ∗/ }
}
Peter Merz
Einführung in JAVA
117
JAVA Beispiel Vererbung
// Rechteck − Urpsrungsvektor und Vektor fuer die Ausdehnunmg noetig
class Rechteck extends Linie {
public Rechteck(double [] x, double [] d ) { /∗ ... ∗/ }
public void draw()
{ /∗ Zeichne Rechteck ∗/ }
}
// Ein Kreis − hat einen Mittelpunkt und einen Radius
class Kreis extends Punkt {
protected double radius;
public Kreis(double [] x , double radius) { /∗ ... ∗/ }
public void draw()
{ /∗ Zeichne Kreis ∗/ }
}
Peter Merz
Einführung in JAVA
118
JAVA Beispiel Vererbung
Graphische Darstellung einer Klassenhierarchie:
GrafikElement
Punkt
Kreis
Linie
Rechteck
Peter Merz
Einführung in JAVA
119
Vererbung und Polymorphismus
Polymorphismus:
Transparente Verwendung von Objekten einer Klassenhierarchie:
• Eine in der Basisklasse definierte Methode kann über eine Objekt-Referenz der
Basisklasse aufgerufen werden
• Ist in einer abgeleiteten Klasse die Methode überschrieben, wird die neue
Implementierung ausgeführt
• Es können zur Implementierung noch nicht bekannte abgeleitete Klassen
nachträglich hinzugefügt werden
✓ Anmerkung: Das selbe gilt für Methoden, die in Interfaces definiert wurden
Peter Merz
Einführung in JAVA
120
Vererbung und Polymorphismus
Beispiel für Polymorphismus:
Alle Grafikelemente können auf die selbe Weise verwendet werden:
GrafikElement element;
Punkt punkt = new Punkt(...);
Linie linie = new Linie (...);
Rechteck rechteck = new Rechteck(...);
Kreis kreis = new Kreis (...);
element = punkt;
element.draw();
/// Zeichnet einen Punkt (Punkt.draw())
element = linie ;
element.draw();
/// Zeichnet eine Linie ( Linie .draw())
element = rechteck;
element.draw();
/// Zeichnet ein Rechteck (Rechteck.draw())
element = kreis;
element.draw();
Peter Merz
/// Zeichnet einen Kreis (Kreis.draw())
Einführung in JAVA
121
Vererbung und Polymorphismus
Datenstrukturen / Container:
Polymorphismus erlaubt die Speicherung von unterschiedlichen Objekten in einem
Array (oder anderen Datenstrukturen)
➠ Array ist vom Typ der gemeinsamen Basisklasse (oder des Interfaces)
Sehr wichtiges Konzept in der Objektorientierung!
Unterschied Interfaces und Vererbung:
• Jede Klasse kann nur eine Klasse, von der sie erbt, besitzen (Superklasse)
• Jede Klasse kann zusätzlich beliebig viele Interfaces implementieren
Peter Merz
Einführung in JAVA
122
Vererbung und Polymorphismus
Modifizierer und Vererbung:
Für Methoden und Attribute gilt:
• public: von anderen Objekten aus verwendbar
• protected: nur innerhalb der Klasse und allen Subklassen verwendbar
• private: nur verwendbar innerhalb der Klasse
Die obigen Modifizierer können mit abstract bzw. final kombiniert werden:
• abstract: Methode wird in Unterklassen definiert
• final: Methode kann nicht mehr in Unterklassen überschrieben werden,
Attribut ist nicht veränderbar!
Peter Merz
Einführung in JAVA
123
Vererbung und Polymorphismus
Methoden der Superklasse:
Aufruf mit Schlüsselwort super!
public Circle2 extends Circle {
protected boolean visible;
public Circle2 ()
{
super();
/// Ruft Konstruktor von Circle auf
visible = false;
}
protected void draw()
{
super.draw(); /// Ruft Circle .draw() auf
visible = true;
}
}
Peter Merz
Einführung in JAVA
124
Vererbung und Polymorphismus
Vererbung und Objektorientierung:
Vererbung ist eine der wichtigsten Eigenschaften der
Objektorientierten Programmierung:
✓ Erlaubt die Definition von Klassenhierarchien
✓ Fördert die Wiederverwendung von Code!
✓ Programming the difference!
✓ Erlaubt Entwicklung universal verwendbarer Datenstrukturen
✓ Läßt sich nicht ohne Weiteres in imperativen/prozeduralen
Sprachen nachbilden
Peter Merz
Einführung in JAVA
125
Exceptions
Fehlerbehandlung in Java:
• Bei Auftreten eines Fehlers können Exceptions ”geworfen” werden: throw
• Eine Exception bewirkt den Abbruch des Programmes
• Exceptions können ”gefangen” werden: catch
• Das Fangen erlaubt die geordnete Weiterführung des Programmes
• Bei einigen Exceptions ist zwingend erforderlich, dass sie gefangen werden
Syntax:
<try-catch-Anweisung> ::= try <Anweisung>
catch(<Exception>) <Anweisung> |
try <Anweisung>
catch(<Exception>) <Anweisung>
finally <Anweisung>
Anmerkung: Häufig wird ein Anweisungsblock nach try und catch verwendet!
Peter Merz
Einführung in JAVA
126
Exceptions
Ablauf:
• Zuerst wird try-Anweisung ausgeführt
• Die Catch-Anweisung wird ausgeführt, wenn eine Exception mit angegebenem
Typ geworfen wurde.
• Die Anweisung nach finally wird immer durchlaufen!
Beispiele für Exceptions:
ArithmeticException , ArrayIndexOutOfBoundsException , NullPointerException
Beispiele für Exceptions, die gefangen werden müssen:
FileNotFoundException , IOException
Peter Merz
Einführung in JAVA
127
Exceptions
Beispiel zum Fangen einer Exception:
class ExceptionsExample {
public double divide(double x)
{
double y = 0.0;
try {
y = 42.0 / x;
} catch(ArithmeticException e) {
System.err. println ( ” Division by Zero!” );
y = 0.0;
} finally {
y += 60.0;
}
return y;
}
}
Peter Merz
Einführung in JAVA
128
Exceptions
Werfen einer Exception:
Syntax:
<throw-Anweisung> ::= throw <Ausdruck>
Das Ergebnis des Ausdruckes ein Objekt vom Typ Exception sein!
Die Throw-Anweisung muss von einem try-Block umschlossen sein oder die
Methode muss die Behandlung der Exception weiterleiten ➠ throws-Anweisung
Syntax der throws-Anweisung:
<Methoden-Def> ::= <Modifizierer> <Typ> <Bezeichner>(<ParameterDef>)
<Ausdruck-1>, <Ausdruck-2>, ...
throws
Es folgtein Beispiel.
Peter Merz
Einführung in JAVA
129
Exceptions
Beispiel für das Werfen von Exceptions:
class ThrowsExample {
public double calculate(double x) throws ArithmeticException, MyException
{
if ( x > 10000.0) throw new MyException(”x > 10000.0 not allowed”);
if ( x < 0.0) throw new ArithmeticException(”sqrt of number < 0”);
else return Math.sqrt(x ) / ( x + 1.0);
}
}
Im obigen Beispiel ist MyException eine eigene Subklasse von Exception
Wichtig: Aufruf der Methode calculate nur in einem try-Block!
Peter Merz
Einführung in JAVA
130
JAVA Packages
Packages:
J AVA-Packages sind Klassensammlungen, die mit dem J DK ausgeliefert werden
und somit auf allen Plattformen verfügbar sind.
Die Wichtigsten sind:
java.lang: Fundamentale Klassen der Programmiersprache J AVA
Beispiele: String, Integer, Object, System, Math.
java.io: Klassen für die Ein- und Ausgabe über Datenströme wie z.B. Dateien
java.net: Klassen zur Erstellung von Netzwerkapplikationen
java.util: Klassen zur Verwaltung von Objekten (Collections) und andere hilfreiche
Datenstrukturen
java.awt: Klassen zur Programmierung von graphischen Benutzungsschnittstellen
(GUI)
javax.swing: Weitere Klassen zur GUI-Programmierung
Peter Merz
Einführung in JAVA
131
JAVA Packages
Verwendung von Packages:
Die Klassen einer Package können importiert werden, d.h. sie gelten dann als
definiert und können somit in eigenen Klassen verwendet werden.
Importanweisungen stehen am Anfang des J AVA-Quelltextes und haben folgende
Form:
import java.lang.*;
import java.io.*;
import java.util.Random;
Eine eigene package wird definiert, wenn als erste Anweisung im J AVA-Quelltext
die package Anweisung steht. Alle Klassen im Quelltext sind dann der
angegebenen package zugeordnet.
Syntax: package MeinePackage;
Peter Merz
Einführung in JAVA
132
JAVA im Schnelldurchlauf
J AVA-Programme:
✓ Ein J AVA-Programm ist eine Folge von Anweisungen
✓ Ein J AVA-Programm besteht aus einer oder mehreren Klassendefinitionen
➠ Eine Klassendefinition ist ebenfalls eine Anweisung!
✓ Die Klassenmethode main der Klasse, die bei Aufruf des J AVA-Laufzeitsystems
(java) angegeben wird, wird zum Programmstart ausgeführt
✓ Die Klassenmethode main hat folgende Form:
public static void main(String [] args) {
/∗ Folge von Anweisungen, die zu Programmstart ausgefuehrt werden ∗/
}
Peter Merz
Einführung in JAVA
133
JAVA im Schnelldurchlauf
Anweisungen in J AVA:
✓ Klassendefinitionen
✓ Variablendeklarationen von primitiven Datentypen und Referenzdeklarationen
von komplexen Datentypen
✓ Zuweisungen: Zuweisungen von Werten an Variablen, Bindung von Referenzen
an Objekte und Arrays
✓ Bedingte Anweisungen (if und switch)
✓ Schleifen (while und for)
✓ Methodenaufrufe: Ausführung der
Methodendefinition (Anweisungsblock)
Anweisungen
im
Rumpf
der
Anweisungen können zu Anweisungsblöcken zusammengefaßt werden!
Peter Merz
Einführung in JAVA
134
JAVA im Schnelldurchlauf
Ausdrücke in J AVA:
✓ Konstanten sowie Variableninhalte von primitiven Datentypen
✓ Operatoren ermöglichen die Verknüpfung eines oder zweier Ausdrücke zu
einem neuen Ausdruck
✗ Unäre Operatoren: -, !, . . .
✗ Binäre Operatoren: +, -, *, /, >, <, ==, &&, ||, . . .
➠ Über Operatoren können Teilausdrücke zu komplexen Ausdrücken
zusammengesetzt werden
✓ Methodenaufrufe können in Ausdrücken verwendet werden sofern sie einen
Rückgabewert besitzen
Peter Merz
Einführung in JAVA
135
JAVA im Schnelldurchlauf
J AVA-Datentypen:
✓ Datentypen sind in J AVA entweder primitive Datentypen oder komplexe bzw.
zusammengesetzte Datentypen
✓ Primitive Datentypen sind:
✗ boolean (Bool’scher Datentyp),
✗ char (Datentyp für U NICODE-Zeichen),
✗ byte, short, int, long (Ganzzahlige, numerische Datentypen),
✗ float, double (Numerische Datentypen mit Fließkommadarstellung)
✓ Komplexe Datentypen sind Arrays (Felder von Variablen eines Datentyps) oder
vordefinierte sowie selbstdefinierte Klassen
Peter Merz
Einführung in JAVA
136
JAVA im Schnelldurchlauf
Klassen in J AVA:
✓ Klassendefinitionen beinhalten:
✗ Attribute: Variablen und Referenzen
✗ Konstruktoren: Spezielle Methoden, die bei Instanziierung eines Objektes
aufgerufen werden
✗ Methoden: Funktionen bzw. Prozeduren
✓ Modifizierer bestimmen den Zugriff auf Attribute und Methoden:
public
protected — abstract — static
final
private
Peter Merz
Einführung in JAVA
137
JAVA im Schnelldurchlauf
Klassen in J AVA (con’t):
✓ Klassenelemente können Instanzbezogen oder klassenbezogen sein
➠ Instanzattribute: Für jedes Objekt individuell (eigene Ausprägung)
➠ Klassenattribute: Existieren nur einmal - unabhängig von der Anzahl
instanziierter Objekte
➠ Klassenmethoden können nur auf Klassenattribute zugreifen
➠ Klassenelemente können ohne Instanziierung verwendet werden!
Peter Merz
Einführung in JAVA
138
JAVA im Schnelldurchlauf
Objekte in J AVA:
✓ Klassen entstehen während der Programmenwicklung – Objekte hingegen zur
Laufzeit!
✓ In Objekten erhalten alle Attribute konkrete Ausprägungen (Werte)
✓ Objekte müssen explizit erzeugt (instanziiert) werden
✓ In J AVA werden Objekte über Referenzen verwendet
✓ Referenzen sind Verweise auf Objekte
➠ Gleiche Referenzen zeigen auf das selbe Objekt
➠ Verschiedene Referenzen können auf gleiche Objekte zeigen
➠ Die Zuweisung von Referenzen bewirkt kein Kopieren von Objekten!
✓ Objekte sind gleich, wenn sie von der selben Klasse sind und alle Attribute
gleiche Werte haben
Peter Merz
Einführung in JAVA
139
JAVA im Schnelldurchlauf
Arrays in J AVA:
✓ Der Zugriff auf Arrays erfolgt ebenfalls über Referenzen
✓ Es ergeben sich daher die gleichen Eigenschaften wie bei Objekten
✓ Somit müssen Seiteneffekte bei der Übergabe an Methoden beachtet werden
✓ Weiterhin können Seiteneffekte bei der Verwaltung mehrerer Referenzen auf
das selbe Array (Objekt) auftreten
✓ Zwei Arrays sind gleich, wenn an allen Indizes gleiche Werte abgelegt sind
Peter Merz
Einführung in JAVA
140
JAVA im Schnelldurchlauf
Vererbung:
✓ Wichtiges Merkmal der objektorientierten Programmierung!
✓ Erlaubt Erweiterung oder Veränderung bestehender Klassen
✓ Klassenhierarchien fassen Klassen mit ähnlichen Eigenschaften bzw. ähnlicher
Funktionalität zusammen
✓ Datenstrukturen bzw. Container für Objekte lassen sich leicht realisieren
✓ Interfaces erlauben die Definition von einheitlichen Schnittstellen über
Klassenhierarchiegrenzen hinweg
Peter Merz
Einführung in JAVA
141
JAVA im Schnelldurchlauf
Weitere wichtige Eigenschaften von J AVA:
✓ Implizite Typwandlung:
✗ In Ausdrücken mit binären Operatoren und Operanden mit unterschiedlichen
Typen wird in den Typ mit höherer Wertigkeit gewandelt (z.B. float ➠ double)
✗ Bei der Zuweisung kann implizit in einen Typ mit höherer Wertigkeit
konvertiert werden
✓ Gültigkeitsbereiche:
✗ Lokale Variablen oder Referenzen (In Anweisungsblöcken/Methodenrümpfen
oder Parameterdefinitionslisten deklarierte Variablen) können Attribute von
Klassen überdecken
✗ Die Gültigkeit von lokalen Variablen ist auf ihren Deklarationsbereich
(Anweisungsblock oder Methodenrumpf) beschränkt
Peter Merz
Einführung in JAVA
142
JAVA im Schnelldurchlauf
Ausnahmebehandlung:
✓ Exceptions erlauben die Behandlung von Fehlern im Programm
✓ Bei Auftreten einer Exception wird das Programm an der entsprechenden Stelle
unterbrochen
✓ Durch das Fangen von Exceptions kann auf Fehler geeignet reagiert werden
✓ Eigene Exceptions können definiert werden
Peter Merz
Einführung in JAVA
143
Herunterladen