Objektorientierte Programmierung OOP
Transcription
Objektorientierte Programmierung OOP
10 Wiederholung der Grundelemente in Java 10.1 Java allgemein – 10.1.1 Grundkonzept von Java – – – – – – Objektorientierte Programmierung OOP Objektorientierte Programmierung (OOP) mit Java 10.4 Implementierung objektorientierter Konzepte in Java – 10.4.1 Klassen 10.1.2 Sprachelemente, Datentypen und Variablen 10.1.3 Operatoren 10.1.4 Datenfelder 10.1.5 Zeichenketten 10.1.6 main-Teil und Parameterübergabe 10.1.7 Bedingungen und Schleifen – 10.4.2 Objekte – 10.4.3 Mehrere Objekte von einer Klasse – 10.4.4 Schrittweises Vorgehen zur Implementierung objektorientierter Konzepte in Java 10.5 Arrays von Objekten – 10.5.1 Anlegen von Arrays von Objekten – 10.5.2 Default-Werte von Objekten – 10.5.3 Schrittweises Vorgehen zum Anlegen von Arrays von Objekten 10.2 Wiederholung der grundlegenden Programmstrukturen – 10.2.1 Anweisungen 10 Wiederholung der Grundelemente in Java – 10.2.2 Verzweigungen aufgrund von Bedingungen – 10.2.3 Wiederholungen mit Schleifen 10.6 Methoden – 10.2.4 Blöcke, Funktionen, Objekte 10.7 Vererbung 10.3 Konzepte objektorientierter Programmiersprachen – 10.3.1 Klassen, Objekte – 10.3.2 Attribute, Methoden, Kapselung – 10.3.3 Beziehungen, Vererbung, Assoziation, Komposition, Aggregation – 10.3.4 Polymorphismus, Überladen und Wiederverwendung 10.8 Konstruktoren – 10.8.1 Definition von Konstruktoren – 10.8.2 Anwendung von Konstruktoren 10.9 Pakete 10.10 Java-Dokumentation 10.11 Modifiers für Zugriffsspezifizierung © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 2 10.1 Java allgemein 10.1 Java allgemein – 10.1.1 Grundkonzept von Java – 10.1.2 Sprachelemente, Datentypen und Variablen – 10.1.3 Operatoren – 10.1.4 Datenfelder – 10.1.5 Zeichenketten – 10.1.6 main-Teil und Parameterübergabe – 10.1.7 Bedingungen und Schleifen 10.1.1 Grundkonzept von Java Java wurde in den 90er Jahren von Sun Microsystems entwickelt. Und Java wird von Sun sowie anderen Anbietern ständig weiterentwickelt. Java wird in verschiedenen Versionen als JDK bzw. SDK (Java bzw. Software Development Kit) gratis zur Verfügung gestellt (für Linux, Windows, Solaris...). D.h. die notwendigen Komponenten von Java sind frei verfügbar (Klassen, javac, java, javadoc, appletviewer...). 10.2 Wiederholung der grundlegenden Programmstrukturen Java läuft plattformunabhängig und architekturneutral auf verschiedensten Systemen und über verteilte Systeme hinweg. In Java wurde die Plattformunabhängigkeit durch das Konzept der virtuellen Maschine (VM; Java virtual machine = JVM) realisiert. 10.3 Konzepte objektorientierter Programmiersprachen 10.4 Implementierung objektorientierter Konzepte in Java Der Java-Quelltext (gespeichert als Javafile.java) wird mittels des Java-Compilers javac in Java-Bytecode (gespeichert als Javafile.class) übersetzt. 10.5 Arrays von Objekten 10.6 Methoden Der Bytecode wird auf jedem Computer, auf dem die Java Virtual Machine läuft, mittels des Java-Interpreters java zur Laufzeit interpretiert und ausgeführt. 10.7 Vererbung 10.8 Konstruktoren 10.9 Pakete Editor 10.10 Java-Dokumentation Java Sourcecode (.java) Java Compiler Java Bytecode (.class) JVM 10.11 Modifiers für Zugriffsspezifizierung © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 3 © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 4 10.1.1 Grundkonzept von Java 10.1.2 Sprachelemente, Datentypen und Variablen Java ist vollständig und konsequent objektorientiert; d.h. außerhalb von Klassen gibt es weder Funktionen noch Daten. Java verwendet den Unicode-Zeichensatz und kann somit Umlaute und zusätzliche Buchstaben anderer Alphabete darstellen und verwenden (solange vom Editor unterstützt). Java unterscheidet Gross- und Kleinschreibung. Java ist sicher. Durch ein mehrstufiges Sicherheitskonzept werden Operationen verhindert, die unberechtigte Aktionen aufführen könnten. Java ist keine zeilengebundene Programmiersprache, d.h. es darf eine beliebige Zeilenformatierung im Programmtext stehen (solange Zeilenumbrüche und Leerzeichen zulässig platziert sind). Java ist stabil, indem einerseits die JVM stabil konzipiert wurde, andererseits alle Objekte und Variablen entsprechend definiert werden müssen und alle Ausnahmen sowie Fehler im Java-Programm abgefangen und behandelt werden können. Java kennt die Kommentare /* und */, das Zeilenkommentar // und das javadoc-Kommentar /** und */. Java unterstützt Multithreading, d.h. die gleichzeitige Ausführung von parallelen Aufgaben (Tasks) in einem Prozess bzw. Programm. Java kennt die primitiven Datentypen byte, short, int, long, float, double, boolean und char. Java-Programme können in HTML-Seiten eingebunden werden (Applets). Zeichen (char) werden in einfachen Anführungszeichen geschrieben '', Zeichenketten (Referenztyp String) in den doppelten Anführungszeichen "". Mit Java Server Pages (JSP) und Servlets können serverseitige Web-Applikationen realisiert werden. Jede Variable muss definiert und einem Typ zugewiesen werden: Typname Variablenname; Weitere Java-Entwicklungswerkzeuge (javadoc, jdb, ...) und IDEs (Integrated Development Environment) und CASE-Tools (Computer-aided Software Engineering) unterstützen die Entwicklung von Java-Programmen. © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 Zusätzlich kann der Variablen dabei auch ein Wert zugewiesen werden: Typname Variablenname = Wert; 5 10.1.3 Operatoren OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 6 10.1.4 Datenfelder Es existieren die arithmetischen Operatoren: +, -, *, /, %, ++, -- Datenfelder sind ein- oder mehrdimensionale Arrays und werden wie folgt definiert: int[][] Matrix; Matrix = new int[IntZeile][IntSpalte]; oder zusammengefasst in einem Ausdruck int[][] Matrix = new int[IntZeile][IntSpalte]; oder beispielsweise mit direkt vorbelegten Werten int[][] Matrix = {{1, 2}, {3, 4}, {5, 6}}; Es existieren die arithmetischen Zuweisungsoperatoren: =, +=, -=, *=, /=, %= Es existieren die Vergleichsoperatoren: ==, !=, <, <=, >, >= Es existieren die logischen Vergleichsoperatoren: !, &&, ||, &, |, ^ Der Zugriff auf Array-Elemente erfolgt mittels direkter Indizierung, z.B.: Matrix[2][1] Es existieren die bitweise Operatoren: ~, &, |, ^ , >>, >>>, <<, &=, |=, ^= , >>=, >>>=, <<= Die Nummerierung der Datenfelder beginnt immer mit 0, also z.B.: Matrix[0][0] Matrix[0][1] Matrix[1][0] ... Explizite Konvertierung von einem primitiven Datentyp in einen anderen erfolgen mittels des Type-Cast-Operators: (byte), (short), (int), (long), (float), (double) und (char) Die Anzahl der Array-Elemente wird mit .length abgefragt: Anzahl Zeilen: Matrix.length Anzahl Spalten in 1.Zeile: Matrix[0].length Anzahl Spalten in 2.Zeile: Matrix[1].length ... Für die bedingte Zuweisung gibt es in Java den Fragezeichen-Operator ? : also Wert = BoolescherAusdruck ? Wert1 : Wert2; © Prof. Dr. Rolf Dornberger © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 7 © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 8 10.1.6 main-Teil und Parameterübergabe Das Grundgerüst eines Java-Programms mit der main-Methode sieht wie folgt aus: 10.1.5 Zeichenketten public class JavaProgramm { public static void main(String[] args) { Zeichenketten werden wie folgt definiert: String a = new String("Hello World"); oder String a = "Hello World"; // hier Programmcode } } Parameterübergabe beim Aufruf des Java-Programms erfolgt mittels: java JavaProgramm Parameter1 Parameter2 ... Die Länge einer Zeichenkette wird mit .length() abgefragt: a.length() Zugriff auf die einzelnen Parameter (die als Strings vorliegen) erfolgt mittels: args[0] args[1] ... Zeichenketten werden mit dem Operator + verknüpft, z.B: a = "Hello " + "World"; Das File, in dem das Java-Programm gespeichert wird, sollte so heissen wie die Klasse und muss auf .java enden: JavaProgramm.java © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 9 © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 10 22.09.2010 12 10.2 Wiederholung der grundlegenden Programmstrukturen 10.1 Java allgemein 10.1.7 Bedingungen und Schleifen 10.2 Wiederholung der grundlegenden Programmstrukturen – 10.2.1 Anweisungen – 10.2.2 Verzweigungen aufgrund von Bedingungen – 10.2.3 Wiederholungen mit Schleifen – 10.2.4 Blöcke, Funktionen, Objekte Verzweigungen werden durch Bedingungen verursacht. Dafür gibt es in Java die if-, if-elseund switch-Anweisung. Die do-Schleife (auch do-while-Schleife genannt) führt zunächst einmal die dazugehörige Anweisung aus und prüft dann den dazugehörigen Booleschen Ausdruck. Solange dieser Ausdruck true ist, wird die Anweisung erneut ausgeführt. 10.3 Konzepte objektorientierter Programmiersprachen Die while-Schleife prüft zunächst den dazugehörigen Booleschen Ausdruck. Solange dieser Ausdruck true ist, wird die dazugehörige Anweisung ausgeführt. 10.4 Implementierung objektorientierter Konzepte in Java 10.5 Arrays von Objekten Die for-Schleife dient in der Regel dazu, die dazugehörige Anweisung mit einer bestimmten Anzahl an Durchläufen auszuführen. 10.6 Methoden In Java gibt es zwei Sprunganweisungen, die es erlauben, die Auswertungsreihenfolge einer laufenden Schleife zu verändern: – break-Anweisung beendet Schleife – continue-Anweisung springt zum nächsten Schleifendurchgang 10.7 Vererbung 10.8 Konstruktoren 10.9 Pakete Durch Angabe eines Labels LabelX: springen die break- und die continue-Anweisung direkt zu diesem Label. 10.10 Java-Dokumentation 10.11 Modifiers für Zugriffsspezifizierung © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 11 © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java Anweisung 1 Anweisung 2 Anweisung 3 Anweisung 4 10.2 Wiederholung der grundlegenden Programmstrukturen 10.2.1 Anweisungen Setzt man Algorithmen in eine computerverständliche Form um, so tauchen drei (bzw. vier) grundlegende Programmstrukturen unabhängig von einer Programmiersprache immer wieder auf. Dies sind: In Computerprogrammen werden im Allgemeinen schrittweise die Anweisungen im Quelltext abgearbeitet. – Anweisungen – Verzweigungen bzw. Alternativen aufgrund von Bedingungen Sie gewinnen im Lotto und kassieren 10000 Franken Sie kaufen ein neues Auto für 20000 Franken. Vielleicht lässt sich dies am besten mit einem Brettspiel vergleichen. Allerdings würfelt der Computer nicht, sondern geht Feld für Feld vor. – Wiederholungen mit Schleifen – (Aufruf anderer Algorithmen bzw. Blöcke mit Programmstrukturen) Fasst man mehrere einzelne solche Programmstrukturen zusammen, so ergibt sich eine weitere grundlegende Programmstruktur, die je nach Programmiersprache respektive Programmiertyp umschrieben wird als: Sie schliessen eine Feuerversicherung für 1000 Franken ab. – Block (Modul, Funktion, Unterroutine, Klasse, Objekt oder wie auch immer) © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 13 Sie haben sich das Bein verstaucht, einmal aussetzen © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 14 Anweisung 1 Anweisung 0 Anweisung 2 Anweisung 1 Anweisung 3 Bedingung wahr Anweisung 4 Anweisung 2 10.2.1 Anweisungen 10.2.2 Verzweigungen aufgrund von Bedingungen Das Software-Engineering kennt dafür verschiedene Darstellungsmöglichkeiten: z.B. Struktogramm oder Flussdiagramm Sie gewinnen im Lotto und kassieren 10000 Franken Sie haben sich das Bein verstaucht, einmal aussetzen Sie kaufen ein neues Auto für 20000 Franken. In Computerprogrammen werden Verzweigungen bzw. Alternativen mit Bedingungen bzw. Entscheidungen bewirkt. An Verzweigungen können zwei oder mehrere Alternativen weitergehen. Anweisung 2 Sie schliessen eine Feuerversicherung für 1000 Franken ab. Anweisung 3 Anweisung 4 OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 Sie schliessen eine Feuerversicherung für 1000 Franken ab. Sie stehen an einer Weggabelung. Würfeln Sie 1, 3 oder 5, geht es nach links, ansonsten nach rechts weiter. Anweisung 1 © Prof. Dr. Rolf Dornberger falsch Anweisung 3 Sie kaufen einen Fernseher für 500 Sfr. 15 © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java Sie überweisen 2000 Sfr. von Konto A auf Konto B. 22.09.2010 16 Anweisung 0 Anweisung 0 Schleife Anweisung 1 Anweisung 1 Bedingung wahr falsch Anweisung 2 Anweisung 2 Anweisung 3 Anweisung 3 10.2.2 Verzweigungen aufgrund von Bedingungen 10.2.3 Wiederholungen mit Schleifen Dies lässt sich z.B. auch mit einem z.B. Struktogramm oder Flussdiagramm verdeutlichen. In Computerprogrammen werden Wiederholungen mit Schleifen bewirkt. Anweisung 0 Sie schliessen eine Feuerversicherung für 1000 Franken ab. Bedingung Entscheidung true false Anweisung 1 Anweisung 3 Anweisung 2 Anweisung 4 Anweisung 0 Bedingung Entscheidung wahr falsch Anweisung 1 Anweisung 3 Anweisung 2 Anweisung 4 Anweisung 5 Anweisung 5 © Prof. Dr. Rolf Dornberger Sie stehen an einer Weggabelung. Würfeln Sie 1, 3 oder 5, geht es nach links, ansonsten nach rechts weiter. Sie überweisen 2000 Sfr. von Konto A auf Konto B. Sie kaufen einen Fernseher für 500 Sfr. OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 17 Schleifen können mit einer fest vorgegebenen Anzahl an Durchläufen erfolgen oder solange, bis eine bestimmte Bedingung erfüllt ist. © Prof. Dr. Rolf Dornberger Anweisung 4 Jemand Anweisung 5 überweist Ihnen Anweisung 6 2000 Sfr. Sie kaufen ein neues Auto für 20000 Franken. Durchlaufen Sie nebenstehende Schleife solange, bis Sie insgesamt 50000 Sfr. besitzen. OOP: 10 Wiederholung der Grundelemente in Java Sie gewinnen 3000 Sfr. 22.09.2010 18 22.09.2010 20 Anweisung 0 Schleife Anweisung 1 Anweisung 2 Anweisung 3 Anweisung 4 10.2.3 Wiederholungen mit Schleifen Dies lässt sich z.B. auch mit einem z.B. Struktogramm oder Flussdiagramm verdeutlichen. Anweisung 0 JemandAnweisung 5 überweist Ihnen Anweisung 6 2000 Sfr. Sie kaufen ein neues Auto für 20000 Franken. Durchlaufen Sie nebenstehende Schleife solange, bis Sie insgesamt 50000 Sfr. besitzen. Schleife Anweisung 1 Anweisung 2 Sie gewinnen 3000 Sfr. Anweisung 3 © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 19 10.2.4 Blöcke, Funktionen, Objekte In Computerprogrammen werden gewisse Programmteile, die immer wieder vorkommen, in Blöcke (Module, Funktionen, Unterroutinen, Klassen, Objekte oder wie auch immer genannt) gepackt. © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 10.3 Konzepte objektorientierter Programmiersprachen 10.1 Java allgemein 10.2.4 Blöcke, Funktionen, Objekte 10.2 Wiederholung der grundlegenden Programmstrukturen Diese „Blöcke“ stehen nur über spezielle Schnittstellen mit der Umgebung in Kontakt. 10.3 Konzepte objektorientierter Programmiersprachen – 10.3.1 Klassen, Objekte – 10.3.2 Attribute, Methoden, Kapselung – 10.3.3 Beziehungen, Vererbung, Assoziation, Komposition, Aggregation – 10.3.4 Polymorphismus, Überladen und Wiederverwendung 10.4 Implementierung objektorientierter Konzepte in Java 10.5 Arrays von Objekten Anweisung 1 10.6 Methoden Aufruf des Blocks XY 10.7 Vererbung Anweisung 2 10.8 Konstruktoren Anweisung 3 10.9 Pakete 10.10 Java-Dokumentation 10.11 Modifiers für Zugriffsspezifizierung © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 21 © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 22 10.3.1 Klassen, Objekte 10.3.1 Klassen, Objekte Ein Objekt in einer objektorientierten Programmiersprache bildet ein real existierendes Objekt („Ding“) aus bestimmten Anwendungsbereichen in der Software nach. Dabei kann das Objekt ein Modell eines konkret existierenden Gegenstandes oder auch ein abstraktes Konzept sein. von einer Klasse erzeugte Objekte in beliebiger Anzahl (Objekt = Instanz einer Klasse) Eine Klasse beschreibt quasi die Zusammengehörigkeit eines oder mehrerer ähnlicher Objekte eines bestimmten Typs. Diese Objekte müssen nicht in allen, aber zumindest in vielen Details identisch sein, damit eine gemeinsame Beschreibung über eine Klasse sinnvoll ist. Eine Klasse ermöglicht das Erzeugen einer prinzipiell beliebigen Anzahl von Objekten. Man spricht dann davon, dass ein Objekt eine Instanz einer Klasse ist. Wird ein Objekt aus einer Klasse erzeugt, sagt man, dass die Klasse instanziert wird. Die Unterscheidung zwischen Objekten und Klassen ist eine Abstraktion, die hilft, Details zu ignorieren und damit die Komplexität des Problems zu reduzieren. Die Klasse ist die Form bzw. der Stempel (oder auch der Zylinder), der festlegt, wie die Objekte im Einzelnen aussehen. Klasse, die festlegt, wie die Objekte aussehen werden (Klasse = Zylinder, Stempel, Form) (Alle Begriffe werden in später mit Beispielen genauer erklärt. Hier geht es zunächst darum, die Begriffe aus der objektorientierten Sichtweise einmal vorzustellen.) © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 23 © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 24 10.3.2 Attribute, Methoden, Kapselung In objektorientierten Programmiersprachen wird eine Klasse durch die Zusammenfassung aller ihrer Daten und Operationen definiert. von einer Klasse erzeugte Objekte in beliebiger Anzahl (Objekt = Instanz einer Klasse) Die Operationen werden durch Methoden ausgeführt, die von der Klasse für alle Objekte individuell bereitgestellt werden. Die Daten werden durch Attribute repräsentiert, die für jedes neue Objekt auch neu angelegt werden und mit neuen Werten gefüllt werden. Klassen kapseln bestimmte Methoden und Attribute ein. Diese Kapselung erlaubt ein einfacheres Implementieren der Objekte und einen vereinfachten Umgang mit den Objekten im Programm. Klasse, die festlegt, wie die Objekte aussehen werden (Klasse = Zylinder, Stempel, Form) © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java Nur über bestimmte Operationen kann mittels Botschaften auf die Daten der Objekte zugegriffen werden. (Methoden werden auch als Operationen oder Funktionen bezeichnet. Attribute werden auch als Variablen, Membervariablen, Instanzvariablen oder Instanzmerkmale bezeichnet). 22.09.2010 25 © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 26 10.3.3 Beziehungen, Vererbung , Assoziation, Komposition, Aggregation In objektorientierten Programmiersprachen können folgende Beziehungen zwischen verschiedenen Klassen und damit auch Objekten existieren: 10.3.2 Attribute, Methoden, Kapselung Objekt Generalisierung und Spezialisierung (is-a-Beziehungen) werden mittels Vererbung ausgeführt, wobei eine Klasse (abgeleitete Klasse) nicht vollständig neu definiert, sondern von einer anderen Klasse (Basisklasse) abgeleitet wird. Objekt, erzeugt als Instanz einer Klasse. Attribute (Daten) 2 de 2) ho n et tio M era p (O e1 Method 1) n o ti ra (Ope 3 ) e od on 3 h e t ti M er a p O ( Objekt umfasst Methoden (Operationen) und Attribute (Daten). Daten können quasi gekapselt werden und sind damit nicht von außen zugreifbar. Assoziationen (Verwendungs- oder Aufrufbeziehungen) verwenden Objekte als lokale Variablen oder Methodenargumente. Zusammengehörigkeiten (part-of-Beziehungen) beschreiben die Zusammensetzung eines Objekts aus anderen Objekten (Komposition) und das einfache Einschließen anderer Objekte (Aggregation). Nur über bestimmte Methoden (Operationen) kann auf die Daten zugegriffen werden. Hier erlaubt die Methode 3 den Zugriff auf bestimmte Attribute. Diese Operation ist quasi die Botschaft, um auf die Attribute zuzugreifen. Generalisierung und Spezialisierung Zusammengehörigkeiten Lebewesen Tier Vogel Säugetier Pflanze Auto Mensch Motor Karosserie Räder Reifen Fisch Felgen Affe Schimpanse © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 27 © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 28 Lebewesen Tier Vogel Säugetier Pflanze Auto Mensch Motor Lebewesen Karosserie Fisch Rad Felge Tier Reifen Vogel Säugetier Affe Affe Schimpanse Schimpanse © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 29 10.3.3 Beziehungen, Vererbung , Assoziation, Komposition, Aggregation In objektorientierten Programmiersprachen können folgende Beziehungen zwischen verschiedenen Klassen (und damit auch Objekten) existieren: – "is-a“-Beziehungen (Generalisierung und Spezialisierung) werden mittels Vererbung ausgeführt, wobei eine Klasse (abgeleitete Klasse) nicht vollständig neu definiert, sondern von einer anderen Klasse (Basisklasse) abgeleitet wird. Erbt eine Klasse von einer anderen muss das Schlüsselwort extends bei der Klassendefinition verwendet werden: Pflanze Mensch Fisch © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 30 10.3.3 Beziehungen, Vererbung , Assoziation, Komposition, Aggregation – Verwendungs- oder Aufrufbeziehungen (Assoziationen) verwenden Objekte als lokale Variablen oder Methodenargumente. – "part-of"-Beziehungen beschreiben einerseits die Zusammensetzung eines Objekts aus anderen Objekten (Komposition) oder andererseits den allgemeineren Fall des einfachen Aufnehmens anderer Objekte (Aggregation). – In allen diesen Fällen kann die Implementierung wie folgt aussehen. (Die genaue Unterscheidung wird später behandelt.): public class Einfamilienhaus extends Immobilie {…} Lebewesen Tier Vogel Säugetier Pflanze Mensch Fisch public class Auto { Motor meinMotor = new Motor(); ... } Auto public class Motor { ... } Affe Motor Karosserie Reifen Schimpanse © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java Räder 22.09.2010 31 © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 Felgen 32 10.3.4 Polymorphismus, Überladen und Wiederverwendung 10.3.4 Polymorphismus, Überladen und Wiederverwendung Polymorphismus („Vielgestaltigkeit“; in Zusammenhang mit Late Binding „späte Bindung“) bezeichnet die Fähigkeit von Objektvariablen, Objekte unterschiedlicher Klassen aufzunehmen. In Java folgt daraus, dass verschiedene Methoden gleichen Namens in verschiedenen Klassen existieren können, die verschiedene Operationen ausführen. Das Überladen von Methoden erlaubt, dass in einer Klasse mehrere Methoden den gleichen Namen haben. Diese müssen sich aber in der Anzahl der Parameter, ihrer Reihenfolge und/oder in den Typen der Parameter unterscheiden. Zusätzlich können sich die Rückgabewerte unterscheiden. Polymorphismus („Vielgestaltigkeit“; „späte Bindung“) bezeichnet die Fähigkeit von Objektvariablen, Objekte unterschiedlicher Klassen aufzunehmen. public class MyFrame extends Frame{ Container c; } Die Klasse Container kann viele Ausprägungen haben. Container Die Wiederverwendung von Komponenten (quasi in sich geschlossenen Programmteilen) wird durch die Abstraktion und Kapselung unterstützt. Die Wiederverwendung ist damit sehr wichtig für Steigerung der Effizienz und Fehlerfreiheit beim Programmieren. Panel (Alle Begriffe werden in späteren Kapiteln mit Beispielen genauer erklärt. Hier geht es zunächst darum, die Begriffe aus der objektorientierten Sichtweise einmal vorzustellen.) © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 Applet 33 © Prof. Dr. Rolf Dornberger Window Frame Dialog OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 34 10.3.4 Polymorphismus, Überladen und Wiederverwendung 10.3.4 Polymorphismus, Überladen und Wiederverwendung Das Überladen von Methoden erlaubt, dass in einer Klasse mehrere Methoden den gleichen Namen haben. Diese müssen sich aber in der Anzahl der Parameter, ihrer Reihenfolge und/oder in den Typen der Parameter unterscheiden. Zusätzlich können sich die Rückgabewerte unterscheiden. Die Wiederverwendung von Programmteilen, sogenannten Komponenten, wird durch die Abstraktion und Kapselung unterstützt. Die Wiederverwendung ist damit sehr wichtig für Steigerung der Effizienz und Fehlerfreiheit beim Programmieren. public class MeinHaus{ – public void zeigeMeinHaus(){ – ...} – public int zeigeMeinHaus(int HausNummer){ – ...} – public String zeigeMeinHaus(int HausNummer, String Strasse){ – ...} } © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 35 © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 36 10.4 Implementierung objektorientierter Konzepte in Java 10.4.1 Klassen 10.1 Java allgemein Definition der Klasse Einfamilienhaus, welche im File Einfamilienhaus.java gespeichert wird: 10.2 Wiederholung der grundlegenden Programmstrukturen 10.3 Konzepte objektorientierter Programmiersprachen Das Schlüsselwort class leitet die Klasse ein. In den nachfolgenden geschweiften Klammern stehen die Definitionen von Attributen und Methoden. 10.4 Implementierung objektorientierter Konzepte in Java – 10.4.1 Klassen – 10.4.2 Objekte – 10.4.3 Mehrere Objekte von einer Klasse – 10.4.4 Schrittweises Vorgehen zur Implementierung objektorientierter Konzepte in Java // Definition der Klasse Einfamilienhaus public class Einfamilienhaus { // Definition der Attribute public String Besitzer; public String Adresse; public int Baujahr; public double Verkaufspreis; public String Haustyp; public double Wohnflaeche; public double AnzahlZimmer; public double Gartenflaeche; public boolean HatGarage; 10.5 Arrays von Objekten 10.6 Methoden 10.7 Vererbung 10.8 Konstruktoren Attribute Methoden // Definition der Methode anfragenVerkaufspreis für die Klasse Einfamilienhaus public double anfragenVerkaufspreis() { System.out.println("Verkaufspreis: " + Verkaufspreis + " Euro"); return Verkaufspreis; } } 10.9 Pakete 10.10 Java-Dokumentation 10.11 Modifiers für Zugriffsspezifizierung © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 37 © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 38 10.4.1 Klassen 10.4.1 Klassen Grafische Darstellung der Klasse in UML (Unified Modeling Language) und ihre Implementierung im Quelltext: Wird in Java eine Klasse in einem File abgespeichert, so muss das File (falls die Klasse public ist) den gleichen Namen haben. Ist die Klasse nicht public, kann dem File ein beliebiger Name gegeben werden. In einem File können mehrere Klassen definiert werden. Es dürfen jedoch nicht 2 Klassen in ein und demselben File public sein. // Definition der Klasse Einfamilienhaus public class Einfamilienhaus { Ein Klasse in der UML-Klassendarstellung enthält den Namen der Klasse, keine bis beliebig viele Attribute in der Notation Variablenname:Datentyp und keine bis beliebig viele Operationen (Methoden) in der Notation Methodenname:DatentypRückgabewert. Das Pluszeichen (+) bedeutet, dass alle Attribute und Operationen public sind. // Definition der Attribute public String Besitzer; public String Adresse; public int Baujahr; public double Verkaufspreis; public String Haustyp; public double Wohnflaeche; public double AnzahlZimmer; public double Gartenflaeche; public boolean HatGarage; Besitzt eine Klasse eine main-Methode, kann diese Klasse als ein Einstiegspunkt eines Java-Programms genommen werden, d.h. die Klasse kann von der Java-Konsole aufgerufen werden. // Definition der Methode anfragenVerkaufspreis für die Klasse Einfamilienhaus public double anfragenVerkaufspreis() { System.out.println("Verkaufspreis: " + Verkaufspreis + " Euro"); return Verkaufspreis; } } © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 (Was public bedeutet, wird in einem späteren Kapitel erläutert. Wie UML genau definiert ist und angewendet wird, wird in den Kursen zu SoftwareEngineering erklärt.) 39 © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 40 10.4.2 Objekte 10.4.2 Objekte Wird die Klasse Einfamilienhaus instanziert, also von der Klasse Einfamilienhaus das Objekt einEinfamilienhaus angelegt, muss dazu eine Variable (auch Objektvariable genannt) vom Typ der Klasse deklariert und ihr dann mit Hilfe des new-Operators das neu erzeugte Objekt Objekt zugewiesen werden: Von der Klasse Einfamilienhaus wird das Objekt einEinfamilienhaus abgeleitet. In der UML-Darstellung ist ein Objekt dadurch gekennzeichnet, dass vor dem Klassennamen ein Doppelpunkt (:) steht und meist ein Objektname, hier einEinfamilienhaus. einEinfamilienhaus // Deklarieren des Objektes einEinfamilienhaus Einfamilienhaus einEinfamilienhaus; (Zur grafischen Unterscheidung wird oftmals der Namensbereich von Objekten blau unterlegt. Die UML-Konvention besagt auch, dass Klassen große und Objekte kleine Anfangsbuchstaben erhalten.) // Anlegen des Objekts (Reservieren des Speicherplatzes) einEinfamilienhaus = new Einfamilienhaus(); Dies kann auch in einem Schritt erfolgen: Klasse Einfamilienhaus einEinfamilienhaus :Einfamilienhaus Klasse Einfamilienhaus // Deklarieren des Objektes einEinfamilienhaus und // Anlegen des Objekt in einem Schritt Einfamilienhaus einEinfamilienhaus = new Einfamilienhaus(); © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 Objekt einEinfamilienhaus 41 © Prof. Dr. Rolf Dornberger Besitzer Adresse Baujahr Verkaufspreis Haustyp Wohnflaeche AnzahlZimmer Gartenflaeche HatGarage = = = = = = = = = "Meier" "Augsburg" 1920 7500000.0 "Bauernhaus" 250 8 10000 true anfragenVerkaufspreis OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 10.4.2 Objekte 10.4.2 Objekte Der Zugriff auf die Attribute des Objekts einEinfamilienhaus erfolgt mittels des Aufrufs Objektname.Attributname Schreibt man alle diese Teile (Klasse, Methoden, main-Teil...) in das Programm Immobilienverwaltung1.java (das ja auch eine Klasse ist), so sieht dies wie folgt aus: 42 public class Immobilienverwaltung1 { Im Fall des Objektes einEinfamilienhaus könnten beispielsweise den bereits in der Klasse Einfamilienhaus definierten Attributen folgenden Werte zugewiesen werden: // Füllen des Objektes mit Werten einEinfamilienhaus.Besitzer einEinfamilienhaus.Adresse einEinfamilienhaus.Baujahr einEinfamilienhaus.Verkaufspreis einEinfamilienhaus.Haustyp einEinfamilienhaus.Wohnflaeche einEinfamilienhaus.AnzahlZimmer einEinfamilienhaus.Gartenflaeche einEinfamilienhaus.HatGarage = = = = = = = = = public static class Einfamilienhaus { // Definition der Attribute public String Besitzer; public String Adresse; public int Baujahr; public double Verkaufspreis; public String Haustyp; public double Wohnflaeche; public double AnzahlZimmer; public double Gartenflaeche; public boolean HatGarage; "Meier"; "Augsburg"; 1920; 7500000.0; "Bauernhaus"; 250; 8; 10000; true; (Nur wenn alles in das einzige File Immobilienverwaltung1.java geschrieben wird, muss vor der Klasse class das Schlüsselwort static stehen; bei getrennten Files nicht.) // Definition der Methode anfragenVerkaufspreis für die Klasse Einfamilienhaus public double anfragenVerkaufspreis() { System.out.println("Verkaufspreis: " + Verkaufspreis + " Euro"); return Verkaufspreis; } } public static void main(String args[]) { System.out.println("Programm Immobilienverwaltung v1"); Die Ausgabe der Werte dieser Attribute erfolgt dann beispielsweise über: // Ausgabe des Objektes System.out.println("Haustyp System.out.println("Besitzer © Prof. Dr. Rolf Dornberger // Deklarieren des Objektes einEinfamilienhaus Einfamilienhaus einEinfamilienhaus; // Reservieren des Speicherplatzes für dieses Objekt einEinfamilienhaus = new Einfamilienhaus(); : " + einEinfamilienhaus.Haustyp); : " + einEinfamilienhaus.Besitzer); OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 ... 43 © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 44 10.4.2 Objekte Man kann daraus auch Immobilienverwaltung2.java machen, wenn man zusätzlich das File Einfamilienhaus.java im selben Verzeichnis wie Immobilienverwaltung2.java stehen hat. 10.4.2 Objekte ... // Füllen des Objektes mit Werten einEinfamilienhaus.Besitzer einEinfamilienhaus.Adresse einEinfamilienhaus.Baujahr einEinfamilienhaus.Verkaufspreis einEinfamilienhaus.Haustyp einEinfamilienhaus.Wohnflaeche einEinfamilienhaus.AnzahlZimmer einEinfamilienhaus.Gartenflaeche einEinfamilienhaus.HatGarage // Ausgabe des Objektes System.out.println("Haustyp System.out.println("Besitzer = = = = = = = = = "Meier"; "Augsburg"; 1920; 7500000.0; "Bauernhaus"; 250; 8; 10000; true; public class Immobilienverwaltung2 { public static void main(String args[]) { System.out.println("Programm Immobilienverwaltung v2"); // Deklarieren des Objektes einEinfamilienhaus Einfamilienhaus einEinfamilienhaus; // Reservieren des Speicherplatzes für dieses Objekt einEinfamilienhaus = new Einfamilienhaus(); // Füllen des Objektes mit Werten einEinfamilienhaus.Besitzer einEinfamilienhaus.Adresse einEinfamilienhaus.Baujahr einEinfamilienhaus.Verkaufspreis einEinfamilienhaus.Haustyp einEinfamilienhaus.Wohnflaeche einEinfamilienhaus.AnzahlZimmer einEinfamilienhaus.Gartenflaeche einEinfamilienhaus.HatGarage : " + einEinfamilienhaus.Haustyp); : " + einEinfamilienhaus.Besitzer); // Aufruf der Methode anfragenVerkaufspreis() einEinfamilienhaus.anfragenVerkaufspreis(); } } Als Ausgabe erhält man dann folgendes: // Ausgabe des Objektes System.out.println("Haustyp System.out.println("Besitzer = = = = = = = = = "Meier"; "Augsburg"; 1920; 7500000.0; "Bauernhaus"; 250; 8; 10000; true; : " + einEinfamilienhaus.Haustyp); : " + einEinfamilienhaus.Besitzer); // Aufruf der Methode anfragenVerkaufspreis() einEinfamilienhaus.anfragenVerkaufspreis(); } } © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 45 © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 46 10.4.3 Mehrere Objekte von einer Klasse 10.4.2 Objekte Von der Klasse Einfamilienhaus werden die beiden Objekte einEinfamilienhaus und zweitesEinfamilienhaus abgeleitet. public class Einfamilienhaus steht nun ohne das Schlüsselwort static. // Definition der Klasse Einfamilienhaus public class Einfamilienhaus { // Definition der Attribute public String Besitzer; public String Adresse; public int Baujahr; public double Verkaufspreis; public String Haustyp; public double Wohnflaeche; public double AnzahlZimmer; public double Gartenflaeche; public boolean HatGarage; (public class Einfamilienhaus steht nun ohne das Schlüsselwort static, da es in dem extra File Einfamilienhaus.java abgespeichert ist.) // Definition der Methode anfragenVerkaufspreis für die Klasse Einfamilienhaus public double anfragenVerkaufspreis() { System.out.println("Verkaufspreis: " + Verkaufspreis + " Euro"); return Verkaufspreis; } } einEinfamilienhaus :Einfamilienhaus Klasse Einfamilienhaus Objekte einEinfamilienhaus zweitesEinfamilienhaus © Prof. Dr. Rolf Dornberger 22.09.2010 OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 47 © Prof. Dr. Rolf Dornberger Besitzer Adresse Baujahr Verkaufspreis Haustyp Wohnflaeche AnzahlZimmer Gartenflaeche HatGarage = = = = = = = = = "Meier" "Augsburg" 1920 7500000.0 "Bauernhaus" 250 8 10000 true anfragenVerkaufspreis OOP: 10 Wiederholung der Grundelemente in Java zweitesEinfamilienhaus :Einfamilienhaus Besitzer Adresse Baujahr Verkaufspreis Haustyp Wohnflaeche AnzahlZimmer Gartenflaeche HatGarage = = = = = = = = = "Schulz" "Stuttgart" 1980 1000000.0 "Stadthaus" 120 5 0 false anfragenVerkaufspreis 22.09.2010 48 10.4.3 Mehrere Objekte von einer Klasse 10.4.3 Mehrere Objekte von einer Klasse Die zwei Objekte einEinfamilienhaus und zweitesEinfamilienhaus sind jeweils eine Instanz der Klasse Einfamilienhaus und beinhalten jeweils verschiedene Daten. In Immobilienverwaltung3.java werden nun zwei Objekte von der Klasse Einfamilienhaus angelegt: public class Immobilienverwaltung3 { ... public static void main(String args[]) { System.out.println("Programm Immobilienverwaltung v3"); // Identische Behandlung des 2.Objektes Einfamilienhaus zweitesEinfamilienhaus; zweitesEinfamilienhaus = new Einfamilienhaus(); // Deklarieren des Objektes einEinfamilienhaus Einfamilienhaus einEinfamilienhaus; zweitesEinfamilienhaus.Besitzer zweitesEinfamilienhaus.Adresse zweitesEinfamilienhaus.Baujahr zweitesEinfamilienhaus.Verkaufspreis zweitesEinfamilienhaus.Haustyp zweitesEinfamilienhaus.Wohnflaeche zweitesEinfamilienhaus.AnzahlZimmer zweitesEinfamilienhaus.Gartenflaeche zweitesEinfamilienhaus.HatGarage // Reservieren des Speicherplatzes für dieses Objekt einEinfamilienhaus = new Einfamilienhaus(); // Füllen des Objektes mit Werten einEinfamilienhaus.Besitzer einEinfamilienhaus.Adresse einEinfamilienhaus.Baujahr einEinfamilienhaus.Verkaufspreis einEinfamilienhaus.Haustyp einEinfamilienhaus.Wohnflaeche einEinfamilienhaus.AnzahlZimmer einEinfamilienhaus.Gartenflaeche einEinfamilienhaus.HatGarage = = = = = = = = = "Meier"; "Augsburg"; 1920; 7500000.0; "Bauernhaus"; 250; 8; 10000; true; = = = = = = = = = "Schulz"; "Stuttgart"; 1980; 1000000.0; "Stadthaus"; 120; 5; 0; false; System.out.println("\n2. Einfamilienhaus:"); System.out.println("Haustyp : " + zweitesEinfamilienhaus.Haustyp); System.out.println("Besitzer : " + zweitesEinfamilienhaus.Besitzer); zweitesEinfamilienhaus.anfragenVerkaufspreis(); // Ausgabe des Objektes System.out.println("Haustyp System.out.println("Besitzer } } : " + einEinfamilienhaus.Haustyp); : " + einEinfamilienhaus.Besitzer); // Aufruf der Methode anfragenVerkaufspreis() einEinfamilienhaus.anfragenVerkaufspreis(); ... © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 49 © Prof. Dr. Rolf Dornberger Schrittweises Vorgehen für die Implementierung von Klassen und Objekten: – Überlegen, welche Attribute und Methoden eine Klasse hat und wie diese Klasse heißt: Name Attribute Attribute Methoden Methoden – File anlegen, das so heißt wie Klasse (Einfamilienhaus.java), und Attribute und Methoden eintragen: einEinfamilienhaus :Einfamilienhaus Name 50 Besitzer Adresse Baujahr Verkaufspreis Haustyp Wohnflaeche AnzahlZimmer Gartenflaeche HatGarage = = = = = = = = = "Meier" "Augsburg" 1920 7500000.0 "Bauernhaus" 250 8 10000 true anfragenVerkaufspreis zweitesEinfamilienhaus :Einfamilienhaus Besitzer Adresse Baujahr Verkaufspreis Haustyp Wohnflaeche AnzahlZimmer Gartenflaeche HatGarage = = = = = = = = = "Schulz" "Stuttgart" 1980 1000000.0 "Stadthaus" 120 5 0 false anfragenVerkaufspreis – Im Programm (hier Immobilienverwaltung3.java) werden die Objekte einEinfamilienhaus und zweitesEinfamilienhaus erzeugt und die Werte eingetragen: public class Immobilienverwaltung3 { public static void main(String args[]) { System.out.println("Programm Immobilienverwaltung v3"); // Definition der Klasse Einfamilienhaus public class Einfamilienhaus { // Deklarieren des Objektes einEinfamilienhaus Einfamilienhaus einEinfamilienhaus; // Definition der Attribute public String Besitzer; public String Adresse; public int Baujahr; public double Verkaufspreis; public String Haustyp; public double Wohnflaeche; public double AnzahlZimmer; public double Gartenflaeche; public boolean HatGarage; // Reservieren des Speicherplatzes für dieses Objekt einEinfamilienhaus = new Einfamilienhaus(); // Füllen des Objektes mit Werten einEinfamilienhaus.Haustyp ... 22.09.2010 = "Bauernhaus"; // Identische Behandlung des 2.Objektes Einfamilienhaus zweitesEinfamilienhaus; zweitesEinfamilienhaus = new Einfamilienhaus(); // Definition der Methode anfragenVerkaufspreis für die Klasse Einfamilienhaus mit Rückgabewert public double anfragenVerkaufspreis() { System.out.println("Verkaufspreis: " + Verkaufspreis + " Euro"); return Verkaufspreis; } } OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 10.4.4 Schrittweises Vorgehen zur Implementierung objektorientierter Konzepte in Java – In Gedanken Objekte aus Klassen ableiten und mit Werten füllen: 10.4.4 Schrittweises Vorgehen zur Implementierung objektorientierter Konzepte in Java © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java zweitesEinfamilienhaus.Haustyp ... = "Stadthaus"; } } 51 © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 52 10.5 Arrays von Objekten 10.5.1 Anlegen von Arrays von Objekten 10.1 Java allgemein Da es unpraktikabel ist, für jedes neue Objekt auch einen neuen Variablennamen anzugeben, wird in Immobilienverwaltung4.java ein Array von Objekten der Klasse Einfamilienhaus angelegt: 10.2 Wiederholung der grundlegenden Programmstrukturen 10.3 Konzepte objektorientierter Programmiersprachen public class Immobilienverwaltung4 { public static void main(String args[]) { System.out.println("Programm Immobilienverwaltung v4"); 10.4 Implementierung objektorientierter Konzepte in Java 10.5 Arrays von Objekten – 10.5.1 Anlegen von Arrays von Objekten – 10.5.2 Default-Werte von Objekten – 10.5.3 Schrittweises Vorgehen zum Anlegen von Arrays von Objekten Anlegen des Arrays von Objekten 10.6 Methoden Anlegen des ersten Objekts einEinfamilienhaus[0] // Füllen des 1.Objektes mit Werten einEinfamilienhaus[0].Besitzer einEinfamilienhaus[0].Adresse einEinfamilienhaus[0].Baujahr einEinfamilienhaus[0].Verkaufspreis einEinfamilienhaus[0].Haustyp einEinfamilienhaus[0].Wohnflaeche einEinfamilienhaus[0].AnzahlZimmer einEinfamilienhaus[0].Gartenflaeche einEinfamilienhaus[0].HatGarage Anlegen des zweiten Objekts einEinfamilienhaus[1] // Anlegen des 2.Objektes einEinfamilienhaus[1] = new Einfamilienhaus(); ... // Deklarieren eines Arrays von Objekten einEinfamilienhaus Einfamilienhaus[] einEinfamilienhaus; // Reservieren des Speicherplatzes für 10 solche Objekte einEinfamilienhaus = new Einfamilienhaus[10]; // Anlegen des 1.Objektes einEinfamilienhaus[0] = new Einfamilienhaus(); 10.7 Vererbung 10.8 Konstruktoren 10.9 Pakete 10.10 Java-Dokumentation = = = = = = = = = "Meier"; "Augsburg"; 1920; 7500000.0; "Bauernhaus"; 250; 8; 10000; true; 10.11 Modifiers für Zugriffsspezifizierung © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 53 OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 54 10.5.1 Anlegen von Arrays von Objekten 10.5.1 Anlegen von Arrays von Objekten Dies kann auch vereinfacht, wie in Immobilienverwaltung5.java angegeben, durchgeführt werden: Fortsetzung Immobilienverwaltung4.java : ... // Füllen des 2.Objektes mit Werten einEinfamilienhaus[1].Besitzer einEinfamilienhaus[1].Adresse einEinfamilienhaus[1].Baujahr einEinfamilienhaus[1].Verkaufspreis einEinfamilienhaus[1].Haustyp einEinfamilienhaus[1].Wohnflaeche einEinfamilienhaus[1].AnzahlZimmer einEinfamilienhaus[1].Gartenflaeche einEinfamilienhaus[1].HatGarage © Prof. Dr. Rolf Dornberger public class Immobilienverwaltung5 { = = = = = = = = = "Schulz"; "Stuttgart"; 1980; 1000000.0; "Stadthaus"; 120; 5; 0; false; public static void main(String args[]) { System.out.println("Programm Immobilienverwaltung v5"); Anlegen des Arrays von Objekten // Ausgabe des 1.Objektes System.out.println("\n1. Einfamilienhaus:"); System.out.println("Haustyp : " + einEinfamilienhaus[0].Haustyp); System.out.println("Besitzer : " + einEinfamilienhaus[0].Besitzer); Anlegen der Objekte // Deklarieren der maximalen Anzahl an Objekten int MAX_OBJ = 10; // Anlegen des Arrays von Objekten einEinfamilienhaus Einfamilienhaus[] einEinfamilienhaus = new Einfamilienhaus[MAX_OBJ]; // Anlegen der Objekte for (int i=0; i<MAX_OBJ; i++) einEinfamilienhaus[i] = new Einfamilienhaus(); // Füllen des 1.Objektes mit Werten ... // Füllen des 2.Objektes mit Werten ... // Aufruf der Methode anfragenVerkaufspreis() einEinfamilienhaus[0].anfragenVerkaufspreis(); // Ausgabe des 2.Objektes System.out.println("\n2. Einfamilienhaus:"); System.out.println("Haustyp : " + einEinfamilienhaus[1].Haustyp); System.out.println("Besitzer : " + einEinfamilienhaus[1].Besitzer); // Ausgabe der Objekte for (int i=0; i<MAX_OBJ; i++) { System.out.println("\n" + i + ". Einfamilienhaus:"); System.out.println("Haustyp : " + einEinfamilienhaus[i].Haustyp); System.out.println("Besitzer : " + einEinfamilienhaus[i].Besitzer); // Aufruf der Methode anfragenVerkaufspreis() einEinfamilienhaus[1].anfragenVerkaufspreis(); } einEinfamilienhaus[i].anfragenVerkaufspreis(); } } } } © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 55 © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 56 10.5.3 Schrittweises Vorgehen zum Anlegen von Arrays von Objekten Schrittweises Vorgehen für die Implementierung von Klassen und Objekten: – Da es oft unpraktikabel ist, für jedes Objekt einen neuen Namen zu vergeben, kann auch ein Array von Objekten angelegt werden: 10.5.2 Default-Werte von Objekten Wird auf Daten von Objekten zugegriffen, die noch nicht angelegt wurden (noch keine Werte den Attributen zugewiesen), werden die entsprechenden Default-Werte (Standardwerte) je nach Typ des Attributs ausgegeben (z.B. null für String und 0.0 für double). Name Attribute Methoden einEinfamilienhaus :Einfamilienhaus Besitzer Adresse Baujahr Verkaufspreis Haustyp Wohnflaeche AnzahlZimmer Gartenflaeche HatGarage = = = = = = = = = "Meier" "Augsburg" 1920 7500000.0 "Bauernhaus" 250 8 10000 true einEinfamilienhaus[0] :Einfamilienhaus anfragenVerkaufspreis Besitzer Adresse Baujahr Verkaufspreis Haustyp Wohnflaeche AnzahlZimmer Gartenflaeche HatGarage = = = = = = = = = "Meier" "Augsburg" 1920 7500000.0 "Bauernhaus" 250 8 10000 true anfragenVerkaufspreis einEinfamilienhaus[1] :Einfamilienhaus Besitzer Adresse Baujahr Verkaufspreis Haustyp Wohnflaeche AnzahlZimmer Gartenflaeche HatGarage = = = = = = = = = "Schulz" "Stuttgart" 1980 1000000.0 "Stadthaus" 120 5 0 false anfragenVerkaufspreis – Im Programm (hier Immobilienverwaltung5.java) werden die Objekte einEinfamilienhaus[0], einEinfamilienhaus[1] usw. erzeugt und Werte eintragen: Beispielsweise die Bildschirmausgabe von Immobilienverwaltung5.java. public class Immobilienverwaltung5 { Hier sind nur die ersten beiden Objekte (0. und 1. Einfamilienhaus) mit Werten belegt. Die anderen Objekte geben die Default-Werte aus. public static void main(String args[]) { System.out.println("Programm Immobilienverwaltung v5"); // Deklarieren der maximalen Anzahl an Objekten int MAX_OBJ = 10; // Anlegen des Arrays von Objekten einEinfamilienhaus Einfamilienhaus[] einEinfamilienhaus = new Einfamilienhaus[MAX_OBJ]; // Anlegen der Objekte for (int i=0; i<MAX_OBJ; i++) einEinfamilienhaus[i] = new Einfamilienhaus(); // Füllen des 1.Objektes mit Werten ... // Füllen des 2.Objektes mit Werten ... }} (Die Ausgabe von Default-Werten von Objekten ist unabhängig davon, ob es sich um Arrays von Objekten oder einfache Objekte handelt.) © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 57 © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 10.6 Methoden 10.6 Methoden 10.1 Java allgemein Methoden definieren die Funktionalität von Objekten. Sie werden innerhalb einer Klassendefinition angelegt und haben vollen Zugriff auf die Attribute des Objekts. 10.2 Wiederholung der grundlegenden Programmstrukturen 58 Methoden können eine gewisse Funktionalität ausüben: 10.3 Konzepte objektorientierter Programmiersprachen // Definition der Methode anfragenVerkaufspreis für die Klasse Einfamilienhaus public void anfragenVerkaufspreis() { System.out.println("Verkaufspreis: " + Verkaufspreis + " Euro"); } 10.4 Implementierung objektorientierter Konzepte in Java 10.5 Arrays von Objekten An Methoden können ein oder mehrere Werte übergeben werden: 10.6 Methoden // Definition der Methode schreibeVerkaufspreis mit Wertübergabe public void schreibeVerkaufspreis(double Wert) { System.out.println("Verkaufspreis: " + Wert + " Euro"); } 10.7 Vererbung 10.8 Konstruktoren Methoden können einen Rückgabewert liefern. Dies geschieht dann mittels der Anweisung return Rueckgabewert. Das Schlüsselwort void wird dann durch den entsprechenden Typ des Rückgabewertes ersetzt (hier ein double): 10.9 Pakete 10.10 Java-Dokumentation // Definition der Methode anfragenVerkaufspreis mit Rückgabewert public double anfragenVerkaufspreis() { System.out.println("Verkaufspreis: " + Verkaufspreis + " Euro"); return Verkaufspreis; } 10.11 Modifiers für Zugriffsspezifizierung © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 59 © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 60 10.6 Methoden Dies kann wie in Immobilienverwaltung6.java und Einfamilienhaus.java angegeben umgesetzt werden 10.6 Methoden public class Immobilienverwaltung6 { public static void main(String args[]) { System.out.println("Programm Immobilienverwaltung v6"); double Preis; ... Aufrufen der Methode, um Rückgabewert zu erhalten // Ausgabe der Objekte for (int i=0; i<MAX_OBJ; i++) { ... Preis = einEinfamilienhaus[i].anfragenVerkaufspreis(); System.out.println("\nDer Preis ist " + Preis); } } } In der Bildschirmausgabe von Immobilienverwaltung6.java erscheinen nun zusätzliche Ausgabezeilen Verkaufspreis: x.x Euro , die die entsprechenden Rückgabewerte der Methode anfragenVerkaufspreis() ausgeben. public class Einfamilienhaus { // Definition der Attribute ... Definition der Methode mit Rückgabewert // Definition der Methode anfragenVerkaufspreis mit Rückgabewert public double anfragenVerkaufspreis() { System.out.println("Verkaufspreis: " + Verkaufspreis + " Euro"); return Verkaufspreis; } } Rückgabe des Wertes © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 61 Hier sind ebenso wieder ab dem 2.Einfamilienhaus die Default-Werte eingetragen. © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 10.7 Vererbung 10.7 Vererbung 10.1 Java allgemein Generalisierung und Spezialisierung werden mittels Vererbung ausgeführt, wobei eine Klasse (abgeleitete Klasse) nicht vollständig neu definiert, sondern von einer anderen Klasse (Basisklasse) abgeleitet wird. 10.2 Wiederholung der grundlegenden Programmstrukturen 62 In UML wird die Vererbung durch einen Pfeil mit umrandeter Spitze, der von abgeleiteter Klasse auf Basisklasse zeigt, ausgedrückt. 10.3 Konzepte objektorientierter Programmiersprachen 10.4 Implementierung objektorientierter Konzepte in Java Die abgeleiteten Klassen Einfamilienhaus und Geschäftshaus erben alle Attribute und Methoden der Basisklasse Immobilie. D.h. die abgeleiteten Klassen kennen diese Attribute und können die entsprechenden Methoden ausführen. Zusätzlich können die abgeleiteten Klassen individuell weitere Attribute und Methoden definieren. 10.5 Arrays von Objekten 10.6 Methoden 10.7 Vererbung 10.8 Konstruktoren Basisklasse abgeleitete Klassen 10.9 Pakete 10.10 Java-Dokumentation 10.11 Modifiers für Zugriffsspezifizierung © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 63 © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 64 10.7 Vererbung 10.7 Vererbung // Definition der Klasse Immobilie public class Immobilie { public String Besitzer; public String Adresse; public int Baujahr; public double Verkaufspreis; public class Immobilienverwaltung7 { // Definition der Methode anfragenVerkaufspreis public double anfragenVerkaufspreis() { System.out.println("Verkaufspreis: " + Verkaufspreis + " Euro"); return Verkaufspreis; } } // Deklarieren der maximalen Anzahl an Objekten int MAX_OBJ = 3; public static void main(String args[]) { System.out.println("Programm Immobilienverwaltung v7"); double Preis; // Reservieren des Speicherplatzes für diese Objekte einEinfamilienhaus = new EinfamilienhausNeu[MAX_OBJ]; // Definition der abgeleiteten Klasse Einfamilienhaus public class Einfamilienhaus extends Immobilie { public String Haustyp; public double Wohnflaeche; public double AnzahlZimmer; public double Gartenflaeche; public boolean HatGarage; } // Anlegen der Objekte for (int i=0; i<MAX_OBJ; i++) einEinfamilienhaus[i] = new EinfamilienhausNeu(); // Füllen des 1.Objektes mit Werten einEinfamilienhaus[0].Besitzer einEinfamilienhaus[0].Adresse einEinfamilienhaus[0].Baujahr einEinfamilienhaus[0].Verkaufspreis einEinfamilienhaus[0].Haustyp einEinfamilienhaus[0].Wohnflaeche einEinfamilienhaus[0].AnzahlZimmer einEinfamilienhaus[0].Gartenflaeche einEinfamilienhaus[0].HatGarage // Definition der abgeleiteten Klasse Geschaeftshaus public class Geschaeftshaus extends Immobilie { public double AnzahlStockwerke; public double AnzahlRaeume; public boolean HatAufzug; public boolean HatTiefgarage; 22.09.2010 65 © Prof. Dr. Rolf Dornberger 10.7 Vererbung 10.8 Konstruktoren // Anlegen der Objekte for (int i=0; i<MAX_OBJ; i++) einGeschaeftshaus[i] = new Geschaeftshaus(); 10.1 Java allgemein // Füllen des 1.Objektes einGeschaeftshaus einGeschaeftshaus[0].Besitzer einGeschaeftshaus[0].Adresse einGeschaeftshaus[0].Baujahr einGeschaeftshaus[0].Verkaufspreis einGeschaeftshaus[0].AnzahlStockwerke einGeschaeftshaus[0].AnzahlRaeume einGeschaeftshaus[0].HatAufzug einGeschaeftshaus[0].HatTiefgarage "Meier"; "Augsburg"; 1920; 7500000.0; "Bauernhaus"; 250; 8; 10000; true; // Reservieren des Speicherplatzes für diese Objekte einGeschaeftshaus = new Geschaeftshaus[MAX_OBJ]; } OOP: 10 Wiederholung der Grundelemente in Java = = = = = = = = = // Deklarieren eines Arrays von Objekten einGeschaeftshaus der Klasse Geschaeftshaus Geschaeftshaus[] einGeschaeftshaus; public double anfragenAnzahlRaeume() { return AnzahlRaeume; } © Prof. Dr. Rolf Dornberger // Deklarieren eines Arrays von Objekten einEinfamilienhaus der Klasse EinfamilienhausNeu // Aufgrund von Namenskonflikten heisst die Klasse Einfamilienhaus nun EinfamilienhausNeu !! EinfamilienhausNeu[] einEinfamilienhaus; OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 66 22.09.2010 68 10.2 Wiederholung der grundlegenden Programmstrukturen mit Werten = "Meyer"; = "Olten"; = 2001; = 2.5e7; = 15; = 50; = true; = true; 10.3 Konzepte objektorientierter Programmiersprachen 10.4 Implementierung objektorientierter Konzepte in Java 10.5 Arrays von Objekten // Ausgabe der Objekte einEinfamilienhaus for (int i=0; i<MAX_OBJ; i++) { System.out.println("\n" + i + ". Einfamilienhaus:"); System.out.println("Besitzer : " + einEinfamilienhaus[i].Besitzer); System.out.println("Haustyp : " + einEinfamilienhaus[i].Haustyp); System.out.println("Schwimmbad: " + einEinfamilienhaus[i].HatGarage); 10.6 Methoden 10.7 Vererbung Preis = einEinfamilienhaus[i].anfragenVerkaufspreis(); System.out.println("\nDer Preis ist " + Preis); 10.8 Konstruktoren – 10.8.1 Definition von Konstruktoren – 10.8.2 Anwendung von Konstruktoren } // Ausgabe der Objekte einGeschaeftshaus for (int i=0; i<MAX_OBJ; i++) { System.out.println("\n" + i + ". Geschaeftshaus:"); System.out.println("Besitzer : " + einGeschaeftshaus[i].Besitzer); System.out.println("Aufzug : " + einGeschaeftshaus[i].HatAufzug); 10.9 Pakete 10.10 Java-Dokumentation Preis = einGeschaeftshaus[i].anfragenVerkaufspreis(); System.out.println("\nDer Preis ist " + Preis); } 10.11 Modifiers für Zugriffsspezifizierung } } © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 67 © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 10.8.1 Definition von Konstruktoren 10.8.1 Definition von Konstruktoren Beispielsweise kann die Klasse EinfamilienhausNeu mittels drei Konstruktoren wie folgt zu EinfamilienhausKonstruktor erweitert werden. // Definition der abgeleiteten Klasse Einfamilienhaus mit Konstruktoren public class EinfamilienhausKonstruktor extends Immobilie { public String Haustyp; public double Wohnflaeche; public double AnzahlZimmer; public double Gartenflaeche; public boolean HatGarage; In Java (wie in anderen objektorientierten Programmiersprache auch) lassen sich spezielle Methoden definieren, Konstruktoren genannt, die bei der Initialisierung eines Objekts aufgerufen werden. Sie erlauben das Setzen bestimmter Attribute mittels Übergabeparametern und das Ausführen bestimmter Operationen schon bei Erzeugung des Objekts. // Konstruktor mit einem Übergabeparamter String public EinfamilienhausKonstruktor (String haustyp) { this.Haustyp = haustyp; } In Java sind Konstruktoren als Methoden ohne Rückgabewert definiert. Sie erhalten den Namen der Klasse, zu der sie gehören. // Konstruktor mit einem Übergabeparamter boolean public EinfamilienhausKonstruktor (boolean hatGarage) { this.HatGarage = hatGarage; } Konstruktoren können beliebig viele Übergabeparameter haben, die im Allgemeinen dann an die Attribute der erzeugten Objekte übergeben werden. Die Übergabeparameter werden mittels des Schlüsselwortes this den entsprechenden Attributen des Objektes zugewiesen. // Konstruktor mit zwei Übergabeparamtern String und boolean public EinfamilienhausKonstruktor (String haustyp, boolean hatGarage) { this.Haustyp = haustyp; this.HatGarage = hatGarage; } // weitere Konstruktoren } Konstruktoren können überladen werden, d.h. es können mehrmals die gleichen Konstruktoren in einer Klasse auftreten, die sich aber in ihren Übergabeparametern (Anzahl und Typ) unterscheiden müssen. © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 Der Konstruktor ist überladen, da er dreimal mit verschiedenen Übergabeparametern (Anzahl und Typ) vorkommt. Diese Konstruktoren EinfamilienhausKonstruktor heißen jeweils wie die Klasse. Das Schlüsselwort this weist die Übergabeparameter den entsprechenden Attributen zu. 69 © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 70 10.8.1 Definition von Konstruktoren Das entsprechende Programm Immobilienverwaltung8 sieht damit wie folgt aus. 10.8.1 Definition von Konstruktoren Wird das Objekt einEinfamilienhaus[0] der Klasse EinfamilienhausKonstruktor erzeugt und ein String-Übergabeparameter (hier der String "Bauernhaus") mit übergeben, wird automatisch das Attribut Haustyp gesetzt. Das explizite Setzen von einEinfamilienhaus[0].Haustyp entfällt damit. public class Immobilienverwaltung8 { public static void main(String args[]) { System.out.println("Programm Immobilienverwaltung v8"); // Deklarieren der maximalen Anzahl an Objekten int MAX_OBJ = 3; // Deklarieren und Initialisieren eines Arrays // von Objekten einEinfamilienhaus der Klasse EinfamilienhausNeu EinfamilienhausKonstruktor[] einEinfamilienhaus = new EinfamilienhausKonstruktor[MAX_OBJ]; Wird das Objekt einEinfamilienhaus[1] der Klasse EinfamilienhausKonstruktor erzeugt und ein Boolescher Übergabeparameter (hier der Boolesche Wert true) mit übergeben, wird automatisch das Attribut HatGarage gesetzt. Das explizite Setzen von einEinfamilienhaus[1].HatGarage entfällt damit. // Anlegen der Objekte einEinfamilienhaus[0] = new EinfamilienhausKonstruktor("Bauernhaus"); einEinfamilienhaus[1] = new EinfamilienhausKonstruktor(true); einEinfamilienhaus[2] = new EinfamilienhausKonstruktor("Stadthaus", true); // Ausgabe der Objekte einEinfamilienhaus for (int i=0; i<MAX_OBJ; i++) { System.out.println("\n" + i + ". Einfamilienhaus:"); System.out.println("Besitzer : " + einEinfamilienhaus[i].Besitzer); System.out.println("Haustyp : " + einEinfamilienhaus[i].Haustyp); System.out.println("Garage : " + einEinfamilienhaus[i].HatGarage); } } } Wird das Objekt einEinfamilienhaus[2] der Klasse EinfamilienhausKonstruktor erzeugt und zwei Übergabeparameter (hier der String "Stadthaus" und der Boolesche Wert true) mit übergeben, werden automatisch die Attribute Haustyp und HatGarage gesetzt. Das explizite Setzen von einEinfamilienhaus[2].Haustyp und einEinfamilienhaus[2].HatGarage entfällt damit. Alle anderen Werte, die nicht vom Konstruktor gesetzt werden, enthalten ihre DefaultWerte (null und false). © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 71 © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 72 10.8.2 Anwendung von Konstruktoren 10.8.2 Anwendung von Konstruktoren Was muss bei der Anwendung von Konstruktoren unbedingt beachtet werden? Wird in einem Konstruktor auf die Attribute dieser Klasse zugegriffen, wird dies normalerweise durch das Schlüsselwort this gekennzeichnet. Sind die Variablennamen unterschiedlich, kann this entfallen. Wird eine Klasse (Basisklasse) angelegt, von der andere Klassen abgeleitet werden, und besitzen diese Klassen Konstruktoren, so muss in der Basisklasse ein leerer Konstruktor definiert werden. Von der Klasse ImmobilienNeu wird später eine andere Klasse abgeleitet. Beide Klassen sollen Konstruktoren besitzen. Damit muss in ImmobilienNeu ein leerer Konstruktor stehen. Im Beispiel ImmobilieNeu ist Baujahr das Attribut der Klasse ImmobilieNeu und baujahr die lokale Variable im Konstruktor. this kann hier entfallen. // Definition der Klasse ImmobilieNeu public class ImmobilieNeu { public String Besitzer; public String Adresse; public int Baujahr; public double Verkaufspreis; Besitzen das Attribut der Klasse und die lokale Variable im Konstruktor denselben Variablennamen, gibt es zwar keinen Fehler beim Kompilieren, aber einen logischen Fehler, der nur sehr schwer zu finden ist! // Leerer Konstruktor public ImmobilieNeu() { } // Konstruktor zum Setzen von Baujahr public ImmobilieNeu(int baujahr) { Baujahr = baujahr; } // Konstruktor zum Setzen von Verkaufspreis public ImmobilieNeu(double Verkaufspreis) { this.Verkaufspreis = Verkaufspreis; } } © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 73 Hier ist Verkaufspreis das Attribut der Klasse ImmobilieNeu und ebenso ist Verkaufspreis die lokale Variable im Konstruktor. this darf hier nicht entfallen. © Prof. Dr. Rolf Dornberger // Definition der Klasse ImmobilieNeu public class ImmobilieNeu { public String Besitzer; public String Adresse; public int Baujahr; public double Verkaufspreis; // Konstruktor zum Setzen von Baujahr public ImmobilieNeu() { } // Konstruktor zum Setzen von Baujahr public ImmobilieNeu(int baujahr) { Baujahr = baujahr; } // Konstruktor zum Setzen von Verkaufspreis public ImmobilieNeu(double Verkaufspreis) { this.Verkaufspreis = Verkaufspreis; } } OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 74 22.09.2010 76 10.8.2 Anwendung von Konstruktoren Konstruktoren müssen sich in ihrer Anzahl und/oder ihrem Datentyp der übergebenen Parameter unterscheiden. – String, boolean, String und boolean, String und String, double, int // Definition der abgeleiteten Klasse EinfamilienhausKonstruktorNeu public class EinfamilienhausKonstruktorNeu extends ImmobilieNeu { public String Haustyp; public double Wohnflaeche; public double AnzahlZimmer; public double Gartenflaeche; public boolean HatGarage; Wird in der abgeleiteten Klasse auf Attribute der Basisklasse zugegriffen, geschieht dies mit dem Schlüsselwort super. – super.Besitzer – super(baujahr) © Prof. Dr. Rolf Dornberger // Deklarieren der maximalen Anzahl an Objekten int MAX_OBJ = 5; // Konstruktor mit einem Übergabeparamter boolean public EinfamilienhausKonstruktorNeu (boolean HatGarage) { this.HatGarage = HatGarage; } // Deklarieren und Initialisieren eines Arrays // von Objekten einEinfamilienhaus der Klasse EinfamilienhausNeu EinfamilienhausKonstruktorNeu[] einEinfamilienhaus = new EinfamilienhausKonstruktorNeu[MAX_OBJ]; // Konstruktor mit zwei Übergabeparamter String public EinfamilienhausKonstruktorNeu (String haustyp, String besitzer) { this.Haustyp = haustyp; super.Besitzer = besitzer; } // Konstruktor mit einem Übergabeparamter double public EinfamilienhausKonstruktorNeu (double verkaufspreis) { super.Verkaufspreis = verkaufspreis; } Soll ein Konstruktor der übergeordneten Klasse aufgerufen werden, geschieht dies mit super(Parametern). public static void main(String args[]) { System.out.println("Programm Immobilienverwaltung v8.1"); // Konstruktor mit einem Übergabeparamter String public EinfamilienhausKonstruktorNeu (String haustyp) { Haustyp = haustyp; } // Konstruktor mit zwei Übergabeparamtern String und boolean public EinfamilienhausKonstruktorNeu (String Haustyp, boolean HatGarage) { this.Haustyp = Haustyp; this.HatGarage = HatGarage; } – super.Verkaufspreis 10.8.2 Anwendung von Konstruktoren public class Immobilienverwaltung81 { // Konstruktor mit einem Übergabeparamter int public EinfamilienhausKonstruktorNeu (int baujahr) { super(baujahr); } } OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 75 // Anlegen der Objekte einEinfamilienhaus[0] einEinfamilienhaus[1] einEinfamilienhaus[2] einEinfamilienhaus[3] einEinfamilienhaus[4] = = = = = new new new new new EinfamilienhausKonstruktorNeu("Bauernhaus"); EinfamilienhausKonstruktorNeu(true); EinfamilienhausKonstruktorNeu("Stadthaus", true); EinfamilienhausKonstruktorNeu(1983); EinfamilienhausKonstruktorNeu(1000000.0); // Ausgabe der Objekte einEinfamilienhaus for (int i=0; i<MAX_OBJ; i++) { System.out.println("\n" + i + ". Einfamilienhaus:"); System.out.println("Besitzer : " + einEinfamilienhaus[i].Besitzer); System.out.println("Haustyp : " + einEinfamilienhaus[i].Haustyp); System.out.println("Garage : " + einEinfamilienhaus[i].HatGarage); System.out.println("Baujahr : " + einEinfamilienhaus[i].Baujahr); System.out.println("Preis : " + einEinfamilienhaus[i].Verkaufspreis); } } } © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 10.9 Pakete 10.1 Java allgemein 10.9 Pakete 10.2 Wiederholung der grundlegenden Programmstrukturen Jede Klasse in Java wird in einem Paket abgelegt. Zum Auffinden der Klasse wird der Name des Pakets gefolgt von einem Punkt und dem anschliessenden Klassennamen angegeben. 10.3 Konzepte objektorientierter Programmiersprachen Ein Paket kann dabei ebenfalls selbst wiederum in einem anderen Paket liegen, womit der gesamte Name mehrere Punkte beinhalten kann. Z.B. beinhaltet java.util.Date die Klasse Date im Paket util, das wiederum im Paket java liegt. 10.4 Implementierung objektorientierter Konzepte in Java 10.5 Arrays von Objekten Damit nun eine Klasse verwendet werden kann, muss mittels einer der beiden Möglichkeiten spezifiziert werden, wo genau sie liegt: – Die Klasse wird über ihren vollständigen Namen angesprochen: java.util.Date d = new java.util.Date(); 10.6 Methoden 10.7 Vererbung – Am Anfang jedes Java-Files werden noch vor den eigentlichen Klassendefinitionen die benötigten Klassen mittels der import Anweisung angegeben: import java.util.*; public class xyz { ... Date d = new Date(); ... } 10.8 Konstruktoren 10.9 Pakete 10.10 Java-Dokumentation 10.11 Modifiers für Zugriffsspezifizierung © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 77 © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 78 10.9 Pakete 10.9 Pakete Die import-Anweisung gibt es in zwei unterschiedlichen Varianten: – Mit import paket.Klasse; wird nur genau die Klasse Klasse des Pakets paket importiert. – Mit import paket.*; können alle Klassen des Pakets paket auf einmal importiert werden. Fazit: Die Verwendung vollständiger Namen hat den Nachteil, dass die Klassennamen sehr lang werden. Bequemer ist die Anwendung mit der import-Anweisung, womit sogleich alle Klassen eines Pakets mittels eines * importiert werden können, z.B. java.util.* Die Bedeutung der Punkte zur Trennung von Paketnamen liegt im strukturierten Ablegen der Klassen in einer entsprechenden Verzeichnisstruktur. Beispielsweise sind die Klassen vom Paket java.util.* im Verzeichnis java/util/ abgelegt. Das "Home-Verzeichnis" für die Java-Pakete ist dabei das File src.zip für alle java-Quellcodes und das File jre/lib/rt.jar für alle class-Files im entsprechenden Installationsverzeichnis des JDK. © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 79 Wichtige Pakete java.applet java.awt java.beans java.io java.lang java.lang.ref java.lang.reflect java.math java.net java.nio java.rmi java.security java.sql java.text java.util javax.accessibility javax.crypto javax.imageio javax.naming javax.print javax.security.auth javax.sound javax.swing javax.xml © Prof. Dr. Rolf Dornberger Bedeutung Applets Abstract Windowing Toolkit inkl. diverser Unterpakete Java Beans Bildschirm- und Datei-I/O Elementare Sprachunterstützung Referenz-Objekte Reflection-API (Application Programming Interface) Fließkomma-Arithmetik Netzwerkunterstützung New I/O Package (seit JDK 1.4) Remote Method Invocation (RMI) Security-Dienste Datenbankzugriff (JDBC) Internationalisierung Diverse Utilities, Collection-Klassen und Datenstrukturen Unterstützung für Braille-Zeilen und ähnliche Ein-/Ausgabegeräte Kryptographische Erweiterungen Lesen und Schreiben von Bilddateien Zugriff auf Namens-Services Unterstützung zum Drucken Authentifizierung und Autorisierung Sound-API SWING-Toolkit Zugriff auf XML-Dateien OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 80 10.10 Java-Dokumentation 10.1 Java allgemein 10.9 Pakete Um selber Klassen zu erstellen und einem bestimmten Paket zuzuordnen, muss ganz am Anfang des Quelltextes (noch vor den import-Anweisungen) in dem File, in dem die Klasse abgespeichert ist, eine geeignete packageAnweisung verwendet werden. Diese besteht aus dem Schlüsselwort package und dem Namen des Pakets, in dem die nachfolgende Klasse abgelegt werden soll, also ganz analog zur import-Anweisung. 10.2 Wiederholung der grundlegenden Programmstrukturen 10.3 Konzepte objektorientierter Programmiersprachen 10.4 Implementierung objektorientierter Konzepte in Java 10.5 Arrays von Objekten 10.6 Methoden 10.7 Vererbung Der Aufbau und die Bedeutung der Paketnamen in der package-Anweisung ist identisch zur import-Anweisung. Damit legt der Compiler entsprechende Unterverzeichnisse gemäss den Angaben der package-Anweisung an und speichert in diesen Unterverzeichnissen die kompilierten Java-Klassen ab. Diese Pakete können dann quasi als Komponenten wiederverwendet werden. © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 81 10.10 Java-Dokumentation 10.8 Konstruktoren 10.9 Pakete 10.10 Java-Dokumentation 10.11 Modifiers für Zugriffsspezifizierung © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 82 22.09.2010 84 10.10 Java-Dokumentation Java-Dokumentation (z.B. JavaDoc 1.5) © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 83 © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 10.10 Java-Dokumentation © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 10.10 Java-Dokumentation 22.09.2010 85 © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 86 10.11 Modifiers für Zugriffsspezifizierung 10.1 Java allgemein 10.11 Modifiers für Zugriffsspezifizierung 10.2 Wiederholung der grundlegenden Programmstrukturen Modifiers sind Schlüsselwörter in Java, welche dem Compiler Zusatzinformationen über die Zugriffsspezifizierung von Klassen, Variablen und Methoden geben. 10.3 Konzepte objektorientierter Programmiersprachen 10.4 Implementierung objektorientierter Konzepte in Java Die Access Modifier in Java sind: – public 10.5 Arrays von Objekten – protected 10.6 Methoden – private – friendly 10.7 Vererbung 10.8 Konstruktoren Pro Ausdruck kann höchstens ein Access Modifier vergeben werden. 10.9 Pakete Die Modifier für statische und konstante Ausdrücke sind: – static 10.10 Java-Dokumentation – final 10.11 Modifiers für Zugriffsspezifizierung © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 87 © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 88 10.11 Modifiers für Zugriffsspezifizierung 10.11 Modifiers für Zugriffsspezifizierung friendly private Die Access Modifier (public, protected, private, -) regeln die Zugriffserlaubnis (Sichtbarkeit) auf Klassen, Methoden und Attribute innerhalb des gesamten Java-Programms: – Elemente mit der Eigenschaft public sind in der Klasse, in den Methoden dieser Klasse, in den Methoden abgeleiteter Klassen und für den Aufrufer von Instanzen dieser Klasse sichtbar. (in UML: +) – Elemente mit der Eigenschaft protected sind in der Klasse, in den Methoden dieser Klasse und in den Methoden abgeleiteter Klassen sichtbar. Zusätzlich können Klassen desselben Pakets sie aufrufen. (in UML: #) – Elemente mit der Eigenschaft private sind lediglich in der Klasse und in den Methoden dieser Klasse sichtbar. Abgeleitete Klassen und Aufrufer von Instanzen der Klasse haben auf private Elemente keinen Zugriff. (in UML: -) – Elemente, die ohne einen der drei genannten Modifier deklariert werden, werden als package scoped oder als Elemente mit Standard-Sichtbarkeit oder einfach als friendly bezeichnet. Sie sind nur innerhalb des Pakets sichtbar, zu dem diese Klasse gehört. In anderen Paketen sind sie dagegen unsichtbar. (in UML keine Kennzeichnung) protected public Restriktion nimmt ab!!! private ist der restriktivste Access Modifier. Klassen können nicht als private deklariert werden. Eine private Variable oder Methode kann nur von einer Klasseninstanz gebraucht werden. private ist so restriktiv, dass nicht einmal die Sub-Klassen auf private-Variablen oder Methoden der Oberklasse zugreifen dürfen. public ist der grosszügigste Access Modifier. Eine public Klasse, Variable oder Methode kann überall in einem Java-Programm verwendet werden. Beispielsweise ist als public class Applet deklariert, damit sie von einem Browser instanziert werden kann. In jeder Applikation hat es zudem eine main-Methode, welche public ist. Sie kann von einer JVM aufgerufen werden. Klassen selber können eigentlich nur public oder friendly als Access Modifier haben. © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 89 10.11 Modifiers für Zugriffsspezifizierung © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 90 22.09.2010 92 10.11 Modifiers für Zugriffsspezifizierung* Die zwei weiteren Modifiers static und final regeln zwar nicht direkt die Zugriffsspezifizierung auf Klassen, Variablen und Methoden, definieren aber zusätzliche Eigenschaften für deren Zugriff. Sie dürfen miteinander und mit den anderen Modifiers kombiniert werden. static kann auf Attribute und Methoden angewendet werden, um diese als statisch zu beschreiben. Diese static-Eigenschaft ist eine Klasseneigenschaft und führt zu Klassenattributen und Klassenmethoden. Um auf eine static-Eigenschaft zuzugreifen, ist kein Objekt notwendig. (Wird in späteren Kapiteln noch genauer erklärt.) final ist ein Modifier, der Klassen, Attribute und Methoden als konstant bzw. nicht mehr veränderbar charakterisiert. D.h. deren Eigenschaften können nicht mehr geändert werden: – Eine Klasse, die final ist, kann nicht vererbt werden. – Einer Variablen, die final ist, kann kein neuer Wert zugewiesen werden. – Eine Methode, die final ist, kann nicht überschrieben werden. Anwendbarkeit der Modifiers: © Prof. Dr. Rolf Dornberger Modifier anwendbar auf public protected friendly private final static Klasse Ja Nein Ja Nein Ja Nein OOP: 10 Wiederholung der Grundelemente in Java Attribut Ja Ja Ja Ja Ja Ja Methode Ja Ja Ja Ja Ja Ja 22.09.2010 * http://www.teialehrbuch.de/Kostenlose-Kurse/JAVA/6630-Die-Zugriffsrechte-in-Java.html 91 © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java Lernziele Die Konzepte objektorientierter Programmiersprachen verstehen und umsetzen können. Folgende Begrifffelder einordnen können: – Klassen, Objekte, Instanz – Attribute, Methoden, Kapselung – Beziehungen, Vererbung, Assoziation – Polymorphismus, Überladen und Wiederverwendung In Java implementieren können: – Klassen – Generierung von Objekten einer Klasse – Generierung von Arrays von Objekten – Methoden – Vererbung, Konstruktoren Die wichtigsten Pakete kennen und einsetzen können. Java-Dokumentation kennen und einsetzen können. Modifiers kennen und einsetzen können. © Prof. Dr. Rolf Dornberger OOP: 10 Wiederholung der Grundelemente in Java 22.09.2010 93