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