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