Einf ¨ uhrung in JAVA
– D
R. P
ETERM
ERZ–
Wilhelm-Schickard-Institut f ¨ur Informatik Abteilung Rechnerarchitektur
Eberhard-Karls-Universit ¨at T ¨ubingen
Inhalte der Vorlesung
Einleitung 1
Programmiersprachen und Compiler 4
Imperative Programmierung mit Java 19
Objektorientierte Programmierung mit Java 63
Zusammenfassung der Java-Sprachkonzepte 133
WWW-Adressen
① Die aktuellen
Folien
/dasSkript
sind unterhttp://www-ra.informatik.uni-tuebingen.de/lehre/ws02/java einf.html verf ¨ugbar.
②
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 unterhttp://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 unterhttp://www-ra.informatik.uni-tuebingen.de/local/doc/java/tutorial/ (Lokal) http://java.sun.com/docs/books/tutorial/ (Sun)
Programmiersprachen
Allgemeine Definition einer Programmiersprache:
Sprache zur Formulierung von Rechenvorschriften, die direkt oder indirekt von einem Rechner ausgef ¨uhrt werden k ¨onnen
indirekt: Umsetzung der Rechenvorschriften in ein f ¨ur den Rechner verst ¨andliches Format
Wichtige
Eigenschaften
einer Programmiersprache (PS):✓ eindeutige Syntax –
Festlegung, welche Zeichenfolgen als Programme zugelassen sind
✓ eindeutige Semantik –
Festlegung, welche Auswirkung die Ausf ¨uhrung des Programms auf einem
Programmiersprachen
Klassifikation von Programmiersprachen:
• Maschinensprache
– Maschinenprogramm = Folge von elementaren, im Bin ¨arcode dargestellten Befehlen, d.h. im Befehlssatz eines Mikroprozessors
– Maschinenprogramme sind direkt auf der Hardware ausf ¨uhrbar – Maschinenprogramme sind nur sehr schwer verst ¨andlich
• niedere, maschinenorientierte Programmiersprachen Assembler-Sprachen Programmierung der Hardware unter Verwendung symbolischer Namen
• h ¨ohere, problemorientierte Sprachen – Hardware-Unabh ¨angigkeit
– Orientierung an den zu bearbeitenden Problemfeldern
– Abbildung in eine Maschinensprache durch Verwendung eines ¨Ubersetzers
Programmiersprachen
Der Paradigmabegriff:
• Synonyme Begriffe:
Denkmuster, Musterbeispiel
• Musterbeispiel
ein Beispiel, das typisch f ¨ur eine Klasse von Beispielen ist, und somit auch als Bezeichnung f ¨ur das diesen Beispielen Gemeinsame verwendet wird
• Verwendung des Paradigma-Begriffes in der Informatik – ein Paradigma bezeichnet ein ¨ubergeordnetes Prinzip – dieses Prinzip ist f ¨ur eine ganze Teildisziplin typisch
– es ist jedoch nicht klar ausformulierbar, sondern manifestiert sich in Beispielen
Programmiersprachen
Klassifikation von nach Programmierparadigmen:
➠ imperative Programmiersprachen
➠ funktionale Programmiersprachen
➠ pr ¨adikative Programmiersprachen
➠ deskriptive Programmiersprachen
➠ objektorientierte Programmiersprachen
✗ Beachte:
Programmiersprachen k ¨onnen Konzepte mehrerer Programmierparadigmen enthalten!
Z.B. enthalten einige Objektorientierte Sprachen auch imperative Sprachkonzepte.
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:
Programmiersprachen
Funktionale Sprachen:
• Programm = Menge von Ausdr ¨ucken, 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 ¨alter, denen Werte zugewiesen werden
– Variablen sind Platzhalter f ¨ur Werte und Funktionen, mit denen im mathematischen Sinne symbolisch gerechnet wird
– Funktionen k ¨onnen als Parameter und als Ergebnisse von Funktionen auftreten
• Anwendungsgebiete: K ¨unstliche Intelligenz, Rapid Prototyping
Programmiersprachen
Pr ¨adikative 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 ¨ultige Pr ¨adikate
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 ¨ur die die Aussage erf ¨ullt ist
➭ der Anwender muß sein Problem exakt spezifizieren, die Vorgabe eines Algorithmus zur Probleml ¨osung ist nicht notwendig (und auch nicht m ¨oglich)
Programmiersprachen
Deskriptive Sprachen:
• eine deskriptive Programmiersprache dient zur Beschreibung der Eigenschaften gesuchter Informationen ( ¨ublicherweise Daten aus einer Datenbank)
• Anwendung:
Formulierung von Anfragen, Eingaben, ¨Anderungs- und L ¨oschoperationen in (relationalen) Datenbanken
• SQL (Structured Query Language) ist der wichtigste Vertreter deskriptiver Programmiersprachen
➭ werden in Vorlesung “Informationssyteme” ausf ¨uhrlich behandelt
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 ¨ande, f ¨uhren Operationen aus und k ¨onnen Nachrichten empfangen und verschicken
– Programme enstehen durch Interaktion von Objekten
• Anwendungsgebiete: wiederverwendbare Software, große Softwareprojekte
Interpretation und ¨ Ubersetzung von Programmen
Interpreter:
Ein Interpreter ist ein Programm, das Programme einer Programmiersprache A direkt ausf ¨uhrt.
• Arbeitsweise:
– Schrittweise syntaktische Analyse der Anweisungen des Quellprogramms – Ermittlung der Parameter und Aufruf einer internen Funktion zur Ausf ¨uhrung
einer Anweisung
• Interpretierte Sprachen:
APL, BASIC, LISP, PROLOG, POSTSCRIPT
Interpretation und ¨ Ubersetzung von Programmen
Compiler:
Ein ¨Ubersetzer (Compiler) ist ein Programm, das Programme aus einer Programmiersprache A in eine Programmiersprache B ¨ubersetzt.
Eine ¨Ubersetzung ist somit die folgende Abbildung:
Quellsprache A ⇒ Zielsprache B
Somit wird jedem Quellprogramm genau ein Zielprogramm zugeordnet.
Wichtig:
Quell- und Zielprogramm m ¨ussen gleiche Bedeutung haben - semantische Korrektheit!
Ziel:
Zielprogramm soll m ¨oglichst schnell ausf ¨uhrbar sein bei geringem
Interpretation und ¨ Ubersetzung von Programmen
Ubersetzungsphasen: ¨
Quellprogramm
Folge von Token
Ableitungsbaum
Zielprogramm Lexikalische Analyse
Syntaktische Analyse
Semantische Analyse und Codegenerierung
CodeOptimierung
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!
Interpretation und ¨ Ubersetzung von Programmen
Compilerarten:
• Compiler erzeugen i.d.R. Maschinencode f ¨ur den Zielrechner
➠ sehr schnelle hoch optimierte Programme, die vom Prozessor direkt ausgef ¨uhrt
werden k ¨onnen (Interpretation durch Hardware)
• Crosscompiler erm ¨oglichen ¨Ubersetzung f ¨ur andere Rechnerarchitekturen
• Konzept der virtuellen Maschine:
– Generierung plattformunabh ¨angigen Programmcodes – Virtueller Maschinencode muß interpretiert werden
– Just-In-Time Compiler k ¨onnen die Ausf ¨uhrungsgeschwindigkeit deutlich erh ¨ohen
Interpretation und ¨ Ubersetzung von Programmen
Plattform(un)abh ¨angige ¨ Ubersetzungsvorg ¨ange:
Quellcode Compiler Runtime
System Virtueller
Machinencode
Native
Maschinencode Hardware
Quellcode Compiler Objectcode Linker Executable -
Maschinencode Hardware
Just-In-Time Compiler Platformunabhängige Sprachen:
Platformabhängige Sprachen:
✓ Anmerkung:
Programmbibliotheken
API (Application Programming Interface):
➠ Schnittstelle zu Programmbibliothek(en)
• API sind programmiersprachenabh ¨angig
• Heutige Anwendungsprogrammierung ist undenkbar ohne API
• Beispiele f ¨ur API:
– Benutzungsschnittstellen-API (GUI) – Datenbank-API
– API f ¨ur Internetfunktionen
– API f ¨ur Betriebssystemfunktionen
– API f ¨ur mathematische Berechnungen
Die Programmiersprache JAVA
J
AVA ist eine von der Firma Sun Microsystems entwickelte objektorientierte ProgrammierspracheJAVA 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 JAVA auf der SUNWORLD’95
• Anfang 1997: Freigabe der Version JAVA 1.1
• Ende 1998: Freigabe der Version JAVA 1.2 (JAVA 2)
• Ende 1999: Freigabe von Version 1.3
Die Programmiersprache JAVA
Eigenschaften von J
AVA:
➠ Plattformunabh ¨angigkeit - Write Once, Run Anywhere
➠ Leichte Entwicklung von Netzwerkanwendungen – insbesondere Internet
➠ Objektorientierung als Basiskonzept
➠ Besondere Unterst ¨utzung verteilter und paralleler Anwendungen
➠ Robuste und sichere Sprache
➠ Lauff ¨ahigkeit von JAVA-Programmen im WWW-Browser (Applets)
➠ JAVA ist frei verf ¨ugbar (JDK: Java Development Kit))
Die Programmiersprache JAVA
Sprachkonzepte von J
AVA:
• angelehnt an C/C++, aber stark vereinfacht – Kein Pr ¨aprozessor
– keine Operatoren, Mehrfacherbung, Templates, . . .
• Bew ¨ahrte Konzepte anderer Sprachen wurden integriert, z.B.
– Exceptions : Fehlerbehandlung
– Garbage Collection : Automatische Speicherfreigabe – Package-Konzept : Zusammenfassung von Klassen – Concurrency : Nebenl ¨aufigkeit durch Threads
• JAVA kommt mit sehr umfangreichen API
– GUI-API: Swing, AWT, Datenbank-Schnittstelle (JDBC)
– Network/Internet API inkl. Remote Method Invocation (RMI)
JAVA Programme
① JAVA-
Applikationen
(Anwendung, engl. Application)• Eine JAVA-Applikation ist ein JAVA-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 JAVA-Interpreters gestartet und ausgef ¨uhrt
② JAVA-
Applets
• Applets sind JAVA-Programme, die in HTML-Seiten eingebunden werden k ¨onnen (HTML: HyperText Markup Language)
• Applets k ¨onnen durch das Programm appletviewer (Teil des JDK) oder einen WWW-Browser mit JAVA-Unterst ¨utzung, wie Netscape Communicator oder Microsoft Internet Explorer ausgef ¨uhrt werden
JAVA Programme
Ein einfaches J
AVAProgramm:
Der Quellcode eines einfachen JAVA-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!” );
} }
Ubersetzen und zu starten mit dem J¨ DK:
– javac Hello.java (Erzeugt die Datei Hello.class) – java Hello (startet das Programm)
JAVA Programme
N ¨ otige Schritte zu einem J
AVA-Programm:
① Erstellen eines Quellprogrammes mit Hilfe eines Texteditors, z.B. Notepad (Windows) oder kwrite (Unix/KDE)
② Ubersetzen¨ aller Quelldateien/Klassen, z.B. mit javac in der Eingabeaufforderung
Ergebnis: Eine Sammlung von JAVA-Klassen im Bytecode (Dateiendung:
.class)
③ Start des Programmes durch Aufruf einer Klasse mit einer statischen main-Methode mit dem JAVA-Interpreter java
Anmerkung: Die Endung .class muß weggelassen werden!
➭ JAVA-Programm = Sammlung von JAVA-Klassen im Bytecode
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
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 ¨uche) getrennt werden
• Ein oder mehrere Token ergeben eine Anweisung
➠ Ein JAVA-Programm besteht aus einer Folge von Anweisungen!
• Anweisungen sind:
– Deklarationen von Variablen
– (Mathematische) (Wert-)Zuweisungen – Methoden-/Funktionsaufrufe
JAVA Syntax - Anweisungen und Ausdr ¨ ucke
Anweisungen und Ausdr ¨ ucke:
Vorl ¨aufige 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 JAVA ein Bool’scher oder arithmetischer Ausdruck (vorl ¨aufige Def.):
<Ausdruck> ::= <Konstante> | <Variable> | (<Ausdruck>) |
<Un ¨arer Operator> <Ausdruck> |
<Ausdruck> <Bin ¨arer Operator> <Ausdruck> |
JAVA Syntax - G ¨ ultige Bezeichner
G ¨ ultige Bezeichner in J
AVAf ¨ ur Variablen:
• G ¨ultige Bezeichner beginnen mit einem Buchstaben
• G ¨ultige Bezeichner bestehen aus Buchstaben und Zahlen
• Die folgenden reservierten W ¨orter 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 !
JAVA Syntax - Primitive Datentypen
Primitive Datentypen in J
AVA:
Datentyp Inhalt Bits KE Minimalwert
Maximalwert
boolean true oder false 1
char UNICODE-Zeichen 16 c \u0000
\uFFFF byte vorzeichenbehaftete Integer-Zahl 8 b -128
127 short vorzeichenbehaftete Integer-Zahl 16 -32768
32767 int vorzeichenbehaftete Integer-Zahl 32 -2147483648
2147483647 long vorzeichenbehaftete Integer-Zahl 64 l -9223372036854775808
9223372036854775807 float IEEE 754-1985 Floating-Point-Zahl 32 f ±1.40239846 E -45
±3.40282347 E 38 double IEEE 754-1985 Floating-Point-Zahl 64 d ±4.94065645841246544 E- 324
±1.79769313486231570 E 308
JAVA Syntax - Primitive Datentypen
Beispiele f ¨ ur Variablendeklarationen:
int i , j ; // Deklaration von Integervariable i und j
float x ; double y; // Deklaration von zwei Fliesskommazahlen i = 10; // Eine ganze Zahl mit dem Wert 10
j = i ; // Die Variable j erhaelt den Wert von i x = 5 f ; // Das f gibt eine float−Konstante an y = −1.2e3; // 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 ¨uckgabewert einer Zuweisung ist der zugewiesene Wert!
JAVA Syntax - Operatoren
Un ¨are Operatoren:
Operator Operandentyp Ergebnistyp Beschreibung
− numerisch numerisch Vorzeichen ¨anderung
! boolean boolean Negierung
∼ integral integral bitweises Komplement
(type) numerisch numerisch Typumwandlung (cast)
Bin ¨are 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 ¨upfung
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 ¨uckgabewert des Ausdruckes der neue (alte) Wert der Variable
• Kombinierte Zuweisung und Arithmetik:
Operatoren: +=, -=, *=, /=, %=, &=, |=, ˆ=, <<=, >>=, >>>=.
– Die Anweisung x ⊗= y; ist eine Kurzschreibweise f ¨ur x = x ⊗ y;
JAVA Syntax - Operatoren
Beispiele zur Verwendung von Operatoren:
int i , j ; // Zwei Integer−Variablen
float x ; // Flieskommazahl einfacher Genauigkeit double y; // Flieskommazahl doppelter Genauigkeit boolean b; // 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!
JAVA Syntax - Operatoren
Operator-Priorit ¨aten:
Operator Priorit ¨at
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 ¨are Operatoren 12
✓ Anmerkung:
Die Klammerung eines Teilausdrucks ¨andert die Reihenfolge der Auswertung!
JAVA Syntax - Operatoren
Implizite Typumwandlung:
Wenn die Operanden eines bin ¨aren 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.
JAVA Syntax - Operatoren
Beispiel f ¨ ur Typumwandlung und geschachtelte Ausdr ¨ ucke:
int i = 4, j = 1;
float x = 5, y;
double u = 5, v;
y = x + 10 / x ; // y = 5 + 2 = 7 Punkt vor Strich−Rechnung!
y = ( x + 10) / x ; // Erst die Addition : y = 15 / 5 = 3 float z = i ∗ x ; // i wird implizit nach float gewandelt int k = ( int )( i ∗ y ); // Das Ergebnis von i ∗ y ist ein float ! x = ( float )u ; // Von double nach float casten!
v = x ; // 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 !!
Zeichenketten in JAVA
Zeichenketten - Strings:
Zeichenketten sind in JAVA vom Typ String, und werden mit Hilfe von (doppelten) Anf ¨uhrungsstrichen definiert:
¨Dies ist eine Zeichenkette, also ein String!¨ .
Der + -Operator – auf Strings angewandt – bewirkt eine Konkatenation dieser Strings:
¨Hello ¨ + ¨World¨ ist ¨aquivalent zu ¨Hello World¨
Wenn einer der Datentypen kein String ist, wird er in einen String gewandelt!
String text = ¨Einundzwanzig: ¨ + (17+4);
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”);
} }
JAVA Programmierregeln
Regeln f ¨ urs strukturierte Programmieren:
✓ Deklarationen und Zuweisungen trennen
✓ Mehrfachzuweisungen vermeiden
✓ Dekrement-/Inkrementoperatoren sowie Zuweisungen nur in separaten Anweisungen verwenden
✓ Jeden neuen Anweisungsblock einr ¨ucken
✓ Kommentare!
✓ Komplexe Ausdr ¨ucke klammern, um Lesbarkeit zu erh ¨ohen
✓ Eine Anweisung pro Zeile!
✓ Aussagekr ¨aftige Variablennamen verwenden!
Verzweigungen in JAVA
Verzweigungen im Programmfluß
(auch Spr ¨unge genannt) lassen sich ebenfalls in JAVA realisieren.
Zun ¨achst lassen sich Anweisungen zu einem (Anweisungs-)Block zusammenfassen, der selbst eine Anweisung darstellt:
<Anweisungsfolge> ::= <Anweisung> |
<Anweisungsfolge> <Anweisungsfolge>
<Anweisungsblock> ::= { <Anweisungsfolge> }
Die zuvor gegebene Definition einer Anweisung wird nun erweitert:
<Anweisung> ::= . . . | <Anweisungsblock> | <Bedingte Anweisung> | <Schleife>
JAVA Syntax - Bedingte Anweisungen
Die If-Anweisung:
Will man eine Anweisung nur unter einer Bedingung ausf ¨uhren 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 ¨uhrt wird, wenn die Auswertung des Ausdruckes true ergibt.
Optional kann ein else-Zweig angegeben werden, der ausgef ¨uhrt wird, wenn die Bedingung nicht erf ¨ullt ist.
JAVA Syntax - Bedingte Anweisungen
Beispiele f ¨ ur 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 ”);
}
JAVA Syntax - Bedingte Anweisungen
Die Switch-Anweisung:
F ¨ur 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 ¨uhrt bis zum Ende der Switch-Anweisung oder bis zum ersten Auftreten der Anweisung break !
JAVA Syntax - Bedingte Anweisungen
Beispiele f ¨ ur 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!”);
JAVA Syntax - Schleifen
Die While-Schleife:
Die While-Schleife erm ¨oglicht die wiederholte Ausf ¨uhrung einer Anweisung (oder eines Anweisungsblockes) solange eine Bedingung (bool’scher Ausdruck) erf ¨ullt 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 ¨uft.
JAVA Syntax - Schleifen
Beispiele f ¨ ur 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
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 ¨uhrt, dann wird eine Bedingung
¨uberpr ¨uft, und solange diese erf ¨ullt ist, die Anweisung
(oder ein Anweisungsblock) ausgef ¨uhrt und <Ausdruck> ausgewertet.
Sie wird h ¨aufig wie folgt verwendet:
<For-Schleife> ::= for( <Variable> = <Konstante>;
<Variable> <Vergleichsoperator> <Ausdruck>;
JAVA Syntax - Schleifen
Beispiele f ¨ ur 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 );
}
JAVA Syntax - Schleifen
Anmerkungen zu Schleifen:
• Schleifen k ¨onnen 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 ¨ubersprungen – Bei For -Schleifen wird <Ausdruck> ausgef ¨uhrt
• break und continue sollten m ¨oglichst nicht verwendet werden
JAVA Syntax - Schleifen
Aquivalente Ausdr ¨ucke:¨
/∗ A : ∗/
while ( true ){
// ... Anweisungen ...
if ( bedingung ) break;
// ... Anweisungen ...
}
/∗ B : ∗/
while ( bedingung ){ // ... Anweisungen ...
if (! bedingung ) { // ... Anweisungen ...
} }
/∗ A : ∗/
for ( i = 0; i < n ; i ++ ) { // ... Anweisungen ...
if ( bedingung ) continue;
// ... Anweisungen ...
}
/∗ B : ∗/
for ( i = 0; i < n ; i ++ ) { // ... Anweisungen ...
if (! bedingung ){ // ... Anweisungen ...
} }
➠ break und continue nicht erforderlich!
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 ();
} }
Schleifen in JAVA - Programmbeispiele
Beispielprogramm 2:
Berechnung der Quadratwurzel:
Gesucht ist ein JAVA-Programm zur Berechnung der Quadratwurzel nach der Newtonschen Methode.
(Iterationsverfahren, das ausgehend von einem willk ¨urlich 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 ¨ur die Quadratwurzel von 2:
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 );
} }
Arrays in JAVA
Eindimensionale Arrays:
Arrays (dt.: Felder) bieten die M ¨oglichkeit, eine beliebige Anzahl von Variablen gleichen Typs simultan zu erzeugen.
Zun ¨achst muß eine Referenz-Variable deklariert werden:
<Array-Referenz-Deklaration> ::= <Typ> [] <Bezeichner>;
Die Erzeugung eines Feldes mit vorgegebener Gr ¨oße (<Ausdruck>) erfolgt anschließend:
<Array-Definition> ::= <Bezeichner> = new <Typ>[<Ausdruck>];
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 ¨oßer gleich 0 ergeben.
Die L ¨ange/Gr ¨oße eines Arrays ergibt folgender Ausdruck:
<Array-Gr ¨oße> ::= <Bezeichner>.length
Arrays in JAVA
Beispiele f ¨ ur 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]; // Ermittlung des Array−Wertes fuer Index 0 letzterWert = a[n − 1]; // Ermittlung des Array−Wertes fuer letzten Index System.out.println (”Laenge: ” + a.length + ” == ” + n);
System.out.println (”Wert von a[0]: ” + ersterWert);
Arrays in JAVA
Programmbeispiel zu Arrays:
Berechnung von Minimum, Maximum, Mittelwert und Standardabweichung einer Zufallszahlenfolge x = {x1, . . . ,xn}:
Mittelwert berechnet sich ¨uber die Formel:
¯
x = 1 n
∑
n i=1xi
Die Standardabweichung ist definiert als:
σ(x) =
s 1 n−1
∑
n i=1(xi−x)¯ 2
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;
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);
}
Arrays in JAVA
Mehrdimensionale Arrays:
Analog zu eindimensionalen Arrays k ¨onnen mehrdimensionale Arrays definiert werden:
• Statt einem eckigen Klammerpaar werden jetzt mehrere Klammernpaare (in Abh ¨angigkeit der Dimensionszahl) ben ¨otigt
• Ein mehrdimensionales Array kann als Array von Arrays angesehen werden
• Die Anzahl der Elemente der einzelnen Arrays kann unterschiedlich sein
Arrays in JAVA
Beispiele f ¨ ur mehrdimensionale Arrays:
double [][] a ; // Array−Referenz bereitstellen int [][] b;
// ... 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
Parameter eines JAVA-Programms
Verarbeitung von Programmparametern:
Die Argumente (Parameter beim Programmaufruf) einer JAVA-Applikation werden der main() -Funktion in einem Array von Strings ¨ubergeben.
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);
} }
Einf ¨ uhrung 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 ¨andern, sie werden Methoden genannt
• i.d.R. legt eine Klasse keine Auspr ¨agung von Eigenschaften fest
• Die Schnittstelle legt von außen verwendbare Methoden/Attribute fest
• Interne Methoden/Attribute dienen zur Realisierung des Verhaltens und werden
Einf ¨ uhrung in die Objektorientierung
Was ist ein
Objekt
?Ein Objekt erh ¨alt alle Eigenschaften seiner beschreibenden Klasse, d.h. es erh ¨alt alle Attribute und Methoden dieser Klasse. Dar ¨uber hinaus erh ¨alt es Auspr ¨agungen f ¨ur 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 ¨onnen beliebig viele Objekte einer Klasse gleichzeitig existieren
Einf ¨ uhrung in die Objektorientierung
Beispiele f ¨ ur Klassen und Objekte aus der realen Welt:
Klasse Objekt Attribute
Auto Mein Golf, Ernies Ente, Toms Trabbi Besitzer, Farbe, Alter Katze Moritz, Omas scharzer Kater Name, Besitzer
Schauspieler Heinz R ¨uhmann, Sandra Bullock Alter, Geschlecht, Genre
Beispiele in der Informationsverarbeitung:
Klasse Objekt Attribute
Fenster Editorfenster Hintergrundfarbe, Titel, Gr ¨oße
Drucker HP SW Laser, Canon Tintenstrahldr. Aufl ¨osung, Befehlssatz Grafikelement Linie, Kreis, Rechteck Koordinaten, F ¨ullmuster
Einf ¨ uhrung in die Objektorientierung
Schritte der objektorientierten Softwareerstellung:
① Problemanalyse (OOA)
② Designphase (OOD)
• Einteilung der Daten und Funktionalit ¨at 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
Objektorientierte Programmierung in JAVA
Syntax einer Klassendefinition
(vorl ¨aufig):<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.
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 ¨aufig. Weitere Modifizierer kommen sp ¨ater hinzu.
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 ; // Die Laenge einer Datenstruktur protected double [] x; // Ein Array von Flieskommazahlen
protected String name; // Der Name eines Objektes als Zeichenkette protected float prozentsatz; // Der Prozentsatz einer Statistischen Erhebung
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 ¨ucken, die durch Komma getrennt sind, beschrieben.<Parameter> ::= ε | <Ausdr-Liste>
<Ausdr-Liste> ::= <Ausdruck> | <Ausdr-Liste>, <Ausdruck>
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 //..
Objektorientierte Programmierung in JAVA
Methoden:
Methoden haben einen R ¨uckgabewert f ¨ur 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 ¨uckgabewert festgelegt, dessen Typ dem deklarierten R ¨uckgabe-Typ entsprechen muß.
Wird anstelle eines R ¨uckgabe-Typs das Schl ¨usselwort void verwendet, hat die Methode keinen R ¨uckgabewert.
Objektorientierte Programmierung in JAVA
Beispiele f ¨ ur 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){ // ...
}
Objektorientierte Programmierung in JAVA
Beispiel f ¨ ur 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;
}
Objekte in JAVA
Erzeugung von Objekten:
Klassen werden w ¨ahrend 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 ¨ultige Objektreferenz, so kann mit Hilfe von new ein neues Objekt erzeugt und dieser Referenz zugewiesen werden:
Objekte in JAVA
Beispiel f ¨ ur 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 ¨ussen nicht explizit nach ihrer Benutzung gel ¨oscht werden, dies
¨ubernimmt der Garbage Collector!
Klassen sind Typen ➠ sie werden ¨ahnlich wie primitive Datentypen
Objekte in JAVA
Zugriff auf Methoden und Attribute:
Der Zugriff auf ¨offentliche Attribute und Methoden erfolgt mit Hilfe des Dereferenzierungsoperators “.” :
Syntax f ¨ur den Attributzugriff:
<Attribut-Zugriff> ::= <Objekt-Referenz>.<Attribut-Bezeichner>
Syntax f ¨ur den Methoden-Aufruf:
<Methoden-Aufruf> ::= <Objekt-Referenz>.<M-Bezeichner>(<Parameter>);
✗ Anmerkung:
Innerhalb einer Klasse braucht keine Objektreferenz dem Methodennamen oder
Objekte in JAVA
Beispiel f ¨ ur Objektdereferenzierung:
// Beispielklasse fuer Dereferenzierung class Beispiel {
// Attribut
public int value;
// Methoden
public void calculate () { // ...
}
public double sinus(double x) { // ...
return y;
} }
double x, y;
int n;
Beispiel object ;
object = new Beispiel();
// Zugriff auf Attribut : x = 3.0∗ object .value;
object .value = 12 ∗ n;
// Methoden−Aufruf object . calculate ();
y = 1.0 / object .sinus(x );