Programmieren in Java Einführung in die objektorientierte Programmierung Teil 3
Patrick Förster, Michael Hasseler
Objektorientierte Programmierung
Übersicht der heutigen Inhalte • • • •
Pakete Beispiel zur Verdeckung Polymorphie Modifikatoren bei Klassenelementen
Patrick Förster, Michael Hasseler
2
Objektorientierte Programmierung
Zusammenhang Klasse-Datei • In jeder *.java – Datei kann es genau eine public-Klasse geben wobei Klassen- und Dateiname übereinstimmen. • Es können weitere Klassen in einer Java-Datei enthalten sein wobei die Konvention gilt, dass möglichst nur eine Klasse pro Datei definiert wird damit die Dateistruktur weitgehend deckungsgleich mit der Klassenstruktur ist • Ausnahme sind innere Klassen. Diese sind sowieso nur innerhalb der Klasse in der Sie definiert werden sichtbar. Schuh.java: public class Schuh { … }
Patrick Förster, Michael Hasseler
3
Objektorientierte Programmierung
Paketstruktur • Jede Java-Klasse hat ein sog. Package in dem Klassen die zu einem Projekt oder einer Programmieraufgabe gehören abgelegt werden • Wird kein package definiert gehört die Klasse zum default-package • Die Definition erfolgt am Anfang einer Java-Datei mit dem Schlüsselwort package • Beispiel: package de.java.vorlesung; • Die Punktnotation gibt hier eine Hierarchie wieder. • Paketnamen werden klein geschrieben • Konvention ist, dass Klassen in deutscher Sprache unterhalb des de-Package abgelegt werden • Jedes Package hat seinen eigenen Namensraum und nur darin müssen die Klassennamen eindeutig sein
Patrick Förster, Michael Hasseler
4
Objektorientierte Programmierung
Beispiel Paketstruktur • Die Klassen packagetest.java und importtest.java package de.java.vorlesung.packagetest; public class Testklasse { public void hallo(){ System.out.println("Hallo!"); } } package de.java.vorlesung; import de.java.vorlesung.packagetest.*; public class Importtest { public static void main(String[] args) { Testklasse test = new Testklasse(); test.hallo(); } }
Patrick Förster, Michael Hasseler
5
Objektorientierte Programmierung
Imports • Importiert werden können Klassen und Pakete • Schlüsselwort ist hier import • Soll ein ganzes Paket importiert werden setzt man hinter den Paketnamen ein .* • Zugriff auf statische Methoden anderer Klassen in anderen Paketen erfolgen mit der Punktnotation des packages.Klassenname.Methodenname • Beispiel: de.java.vorlesung.packagetest.hallo(); • Wenn die Klasse bereits vorher importiert wurde reicht der Klassenname
Patrick Förster, Michael Hasseler
6
Objektorientierte Programmierung
Wdh.: Elemente mit gleichem Namen • Überladung: • Methode wird mit verschiedenen Parametern mehrfach implementiert
• Verdeckung: • Attribut in der Basisklasse wird in der abgeleiteten Klasse von einem namensgleichen Attribut verdeckt • Zugriff auf verdeckte Attribute kann mit einem Cast zu einem Objekt der Basisklasse erfolgen
• Überschreibung: • Methode in der Basisklasse wird von Methode mit gleicher Signatur in der abgeleiteten Klasse überschrieben. Die Signatur besteht aus Methodenname und Parameterliste.
Patrick Förster, Michael Hasseler
7
Objektorientierte Programmierung
Beispiel Verdeckung: Autovermietung 1/7
Das Attribut rate wird von den Subklassen verdeckt.
Patrick Förster, Michael Hasseler
8
Objektorientierte Programmierung
Beispiel: Autovermietung 2/7 package de.wwu.ziv.vorlesung.java.autovermietung.fahrzeug public class Mietfahrzeug { protected float rate = 25.0f; private int dauer; public Mietfahrzeug(int dauer) { this.dauer = dauer; } public float getRate() { return this.rate; } public int getDauer() { return this.dauer; } ...
Patrick Förster, Michael Hasseler
9
Objektorientierte Programmierung
Beispiel: Autovermietung 3/7 public float getPreis(float rate) { switch ( this.dauer ) { case 1: case 2: return this.dauer * rate; case 3: case 4: return this.dauer * rate * 0.90f; case 5: case 6: return this.dauer * rate * 0.85f; default: return this.dauer * rate * 0.75f; } } public String toString() { return "Mietfahrzeug: Rate=" + this.rate + ", Dauer= „ + this.dauer + ", Preis=" + this.getPreis(this.rate); } }
Patrick Förster, Michael Hasseler
10
Objektorientierte Programmierung
Beispiel: Autovermietung 4/7 package de.wwu.ziv.vorlesung.java.qutovermietung.fahrzeug public class Gelaendewagen extends Mietfahrzeug { protected float rate = 35.0f; public Gelaendewagen(int dauer) { super(dauer); }
public String toString() { return "Gelaendewagen: Rate=" + this.rate + ", Dauer= „ + this.dauer + ", Preis=" + this.getPreis(this.rate); } }
Patrick Förster, Michael Hasseler
11
Objektorientierte Programmierung
Beispiel: Autovermietung 5/7 package de.wwu.ziv.vorlesung.java.autovermietung.fahrzeug public class Sportwagen extends Mietfahrzeug { protected float rate = 45.0f; public Sportwagen(int dauer) { super(dauer); }
public String toString() { return "Sportwagen: Rate=" + this.rate + ", Dauer= „ + this.dauer + ", Preis=" + this.getPreis(this.rate); } }
Patrick Förster, Michael Hasseler
12
Objektorientierte Programmierung
Beispiel: Autovermietung 6/7 package de.wwu.ziv.vorlesung.java.autovermietung.fahrzeug public class Autovermietung { public static void main(String[] args) { Mietfahrzeug fahrzeug1 = new Mietfahrzeug(1); System.out.println(fahrzeug1); Mietfahrzeug fahrzeug2 = new Mietfahrzeug(7); System.out.println(fahrzeug2); Gelaendewagen fahrzeug3 = new Gelaendewagen(1); System.out.println(fahrzeug3); Gelaendewagen fahrzeug4 = new Gelaendewagen(7); System.out.println(fahrzeug4); Sportwagen fahrzeug5 = new Sportwagen(1); System.out.println(fahrzeug5); Sportwagen fahrzeug6 = new Sportwagen(7); System.out.println(fahrzeug6); System.out.println("Fahrzeug 6 ohne Cast: Rate=" + fahrzeug6.rate); System.out.println( "Fahrzeug 6 mit Cast: Rate=" + ((Mietfahrzeug)fahrzeug6).rate); } }
Patrick Förster, Michael Hasseler
13
Objektorientierte Programmierung
Beispiel: Autovermietung 7/7 run: Mietfahrzeug: Rate=25.0, Dauer=1, Preis=25.0 Mietfahrzeug: Rate=25.0, Dauer=7, Preis=131.25 Gelaendewagen: Rate=35.0, Dauer=1, Preis=35.0 Gelaendewagen: Rate=35.0, Dauer=7, Preis=183.75 Sportwagen: Rate=45.0, Dauer=1, Preis=45.0 Sportwagen: Rate=45.0, Dauer=7, Preis=236.25 Fahrzeug 6 ohne Cast: Rate=45.0 Fahrzeug 6 mit Cast: Rate=25.0 BUILD SUCCESSFUL (total time: 0 seconds)
Zugriff auf verdecktes Attribut rate erfolgt mit einem Cast zu einem Objekt der Basisklasse: ((Mietfahrzeug)fahrzeug6).rate
Patrick Förster, Michael Hasseler
14
Objektorientierte Programmierung
Polymorphie • Polymorphie (Vielgestaltigkeit) ist eine wichtige Eigenschaft der OOP • Polymorphie von Objekten gibt es nur bei Vererbungshierarchien • Objekttyp einer Subklasse kann mit Objekttyp einer Basisklasse ausgetauscht werden, wenn die Basisklasse nur erweitert wird und nur der Basisklasse bekannte Elemente verwendet werden • Überschriebene Methoden in der Subklasse müssen identisch zur ihrer Basisklassenmethode aufrufbar sein
Patrick Förster, Michael Hasseler
15
Objektorientierte Programmierung
Beispiel zur Polymorphie: Geometrie 1/7
Patrick Förster, Michael Hasseler
16
Objektorientierte Programmierung
Beispiel zur Polymorphie: Geometrie 2/7 package de.wwu.ziv.vorlesung.java.beispiel6.geometrie
import de.wwu.ziv.vorlesung.java.beispiel6.geometrie.formen.*; public class Geometrie { public static void main(String[] args) { Rechteck rechteck1 = new Rechteck(8, 9); Rechteck rechteck2 = new Rechteck(2, 6); Kreis kreis1 = new Kreis(4); Quadrat quadrat1 = new Quadrat(4); Quadrat quadrat2 = new Quadrat(8); Kreis kreis2 = new Kreis(5); Kiste kiste = new Kiste(10); kiste.hinzufuegen(rechteck1); // Anwendung der Polymorphie kiste.hinzufuegen(rechteck2); kiste.hinzufuegen(kreis1); kiste.hinzufuegen(kreis2);
Patrick Förster, Michael Hasseler
17
Objektorientierte Programmierung
Beispiel zur Polymorphie: Geometrie 3/7 kiste.hinzufuegen(quadrat1); kiste.hinzufuegen(quadrat2); kiste.formenAuflisten(); // Form mit dem kleinsten Flächeninhalt ermitteln Form form = kiste.getKleinsteForm(); if (form != null) { System.out.println("Die kleinste Form ist: " + form); } // Form mit dem größten Flächeninhalt ermitteln form = kiste.getGroessteForm(); if (form != null) { System.out.println("Die größte Form ist: " + form); } }
}
Patrick Förster, Michael Hasseler
18
Objektorientierte Programmierung
Beispiel zur Polymorphie: Geometrie 4/7 package de.wwu.ziv.vorlesung.java.beispiel6.geometrie import de.wwu.ziv.vorlesung.java.beispiel6.geometrie.Form; public class Kiste { private Form[] formen; private int index; public Kiste(int anzahl) { formen = new Form[anzahl]; index = 0; } public boolean hinzufuegen(Form ware) { if (index < this.formen.length) { this.formen[index] = ware; index += 1; return true; } return false; } Patrick Förster, Michael Hasseler
19
Objektorientierte Programmierung
Beispiel zur Polymorphie: Geometrie 5/7 public Form getGroessteForm() { Form formMax = null; for (Form form : formen) { if (form != null) { if (formMax == null || formMax.getFlaeche() < form.getFlaeche()) { formMax = form; } } } return formMax; } public Form getKleinsteForm() { Form formMin = null; for (Form form : formen) { if (form != null) { if (formMin == null || formMin.getFlaeche() > form.getFlaeche()) { formMin = form; } } } return formMin; } Patrick Förster, Michael Hasseler
20
Objektorientierte Programmierung
Beispiel zur Polymorphie: Geometrie 6/7 public String toString() { return "Regal: " + this.formen.length; } public void formenAuflisten() { System.out.println("Liste der Formen, die sich in der Kiste befinden: "); for (Form form : formen) { if (form != null) { System.out.println(form.toString()); } } }
}
Patrick Förster, Michael Hasseler
21
Objektorientierte Programmierung
Beispiel zur Polymorphie: Geometrie 7/7 run: Liste der Formen, die sich in der Kiste befinden: Ein Rechteck mit einer Länge von 8.0, einer Breite von 9.0, einer Fläche von 72.0 und einem Umfang von 34.0. Ein Rechteck mit einer Länge von 2.0, einer Breite von 6.0, einer Fläche von 12.0 und einem Umfang von 16.0. Ein Kreis mit einem Radius von 4.0, einer Fläche von 50.2654816 und einem Umfang von 25.1327408. Ein Kreis mit einem Radius von 5.0, einer Fläche von 78.539815 und einem Umfang von 31.415926. Ein Quadrat mit einer Länge von 4.0, einer Fläche von 16.0 und einem Umfang von 16.0. Ein Quadrat mit einer Länge von 8.0, einer Fläche von 64.0 und einem Umfang von 32.0. Die kleinste Form ist: Ein Rechteck mit einer Länge von 2.0, einer Breite von 6.0, einer Fläche von 12.0 und einem Umfang von 16.0. Die größte Form ist: Ein Kreis mit einem Radius von 5.0, einer Fläche von 78.539815 und einem Umfang von 31.415926. BUILD SUCCESSFUL (total time: 0 seconds) Patrick Förster, Michael Hasseler
22
Objektorientierte Programmierung
Modifikatoren bei Klassenelementen • public: Es gibt keine Zugriffsbeschränkung und alle anderen Objekte können auf dieses Element zugreifen. • protected: Bei protected haben neben der eigenen Klasse auch alle Subklassen Zugriff auf das Element. Des Weiteren haben die Elemente im gleichen Package Zugriff. • default(keine Angabe): Wenn keine Angabe genannt wird, dann ist der Zugriff vom gleichen Package heraus erlaubt. • private: Nur die Klasse selbst kann auf ihre private-Elemente zugreifen • => public > protected > default > private • static: Anhand der Klasse kann mit dem Punktoperator auf eine Element zugegriffen werden. Es wird kein Objekt benötigt. • final: Attribute und Methoden mit dem Schlüsselwort final können nicht mehr überschrieben werden
Patrick Förster, Michael Hasseler
23
Objektorientierte Programmierung
Zusammenfassung • Sie kennen die folgenden Dinge und können diese anwenden: • Pakete • die Schlüsselwörter package und import • die Verdeckung von Attributen • Polymorphie bei Objekten • die Modifikatoren bei Klassenelementen
Patrick Förster, Michael Hasseler
24
Objektorientierte Programmierung
Aufgaben 1. Erstellen Sie die Klasse Regal: a. Das Regal liegt im Paket de.wwu.ziv.vorlesung.java.aufgabe6 b. Die Klasse enthält zwei private-Variablen, zum einen Ware[] waren und zum anderen int index. c. Schreiben Sie eine Methode hinzufuegen mit der Signatur: public boolean hinzufuegen(Ware ware). Solange der index kleiner ist als die Länge des Arrays waren, wird die Ware dem Array hinzugefügt und true zurückgegeben. d. Schreiben Sie eine Methode public float inventur(), welche die Summe aller Warenwerte zurückliefert. e. Schreiben Sie eine Methode public String toString(), welche als Ausgabe z. B. hat: "Regal: 10", wobei 10 die Größe des Waren-Arrays angibt. f. Schreiben Sie eine öffentliche Methode warenAuflisten(), die keinen Rückgabewert hat, aber eine Auflistung der Waren vornimmt. Nutzen Sie hierzu die toString()-Methoden der einzelnen Waren. Zuvor erfolgt noch die Ausgabe "Liste der Waren:". Patrick Förster, Michael Hasseler
25
Objektorientierte Programmierung
Aufgaben 2. Aufbau der Paketstruktur. a. Die Klassen Ware, Handtasche, Hut, Schuh und Schuhpaar sollen im Paket de.wwu.ziv.vorlesung.java.aufgabe6.waren liegen. b. Die Klasse mit der main-Funktion liegt im Paket de.wwu.ziv.vorlesung.java.aufgabe6. c. In der main-Methode werden wie in Aufgabe 5 die gleichen Waren-Objekte instanziiert. d. Instanziieren Sie ein Objekt vom Typ Regal mit 10 Plätzen. e. Anschließend werden die 8 Waren dem Regal hinzugefügt. f. Rufen Sie auf dem Objekt Regal die Methode warenAuflisten() auf. g. Rufen Sie auf dem Objekt Regal die Methode inventur() auf und geben Sie das Ergebnis mit einer System.out.println() aus, sodass vor dem Ergebnis der String "Ergebnis der Inventur: " steht.
Patrick Förster, Michael Hasseler
26
Objektorientierte Programmierung
Klassendiagramm zur Aufgabe
Patrick Förster, Michael Hasseler
27