FH D Fachhochschule Düsseldorf University of Applied Sciences Informatik 2 Objektorientierte Programmierung in Java Prof. Dr.- Ing. André Stuhlsatz FH D Fachhochschule Düsseldorf University of Applied Sciences Vorlesung: 16:00-16:45/Pause/17:00-17:45 Dipl.-Ing. in Elektrotechnik, Fachrichtung Nachrichtentechnik Wissenschaftler am Fraunhofer Institut FIT, Forschungsbereich Augmented Reality Wissenschaftlicher Angestellter im FB3/FB4 der FH Düsseldorf, Fachgebiet Mustererkennung Dr.-Ing. in Elektrotechnik, Fachgebiet Maschinelle Lernverfahren André Stuhlsatz Prof. Dr.-Ing. in Informatik (nebenberuflich) seit 2014 Entwicklungsingenieur (hauptberuflich) bei SMS Siemag AG Informatik 2 2 FH D Fachhochschule Düsseldorf University of Applied Sciences Informatik Team Informatik 1: Prof. Dr.-Ing. Thomas Zielke Informatik 2: Prof. Dr.-Ing. André Stuhlsatz Raum S4 Sprechzeit: Mittwochs 13-14 Uhr Immer erreichbar via E-Mail: [email protected] Oder wissenschaftliche Mitarbeiter, Raum S1a : M.Sc. Jens Lippel B.Eng. Janika Merz Oder Tutorensprechstunde: Di. 16h, Mi. 14h & Do. 8:30h Informatik 2 3 FH D Fachhochschule Düsseldorf University of Applied Sciences Vorlesungsunterlagen Vorlesung: PowerPoint Folien http://mv.fh-duesseldorf.de/d_pers/informatik Wird regelmäßig aktualisiert. Dort finden Sie auch Programmierbeispiele (Netbeans Projekte) Klausuren: Alle Klausuren als PDF-Datei Lösung der letzten Klausur (WS 2013/2014) Informatik 2 4 FH D Fachhochschule Düsseldorf University of Applied Sciences Vorlesungsunterlagen Anwesenheit wird dringend empfohlen! Folien sind Stichwortsammlung Zusätzlich werden wichtige Lehrinhalte erläutert Tipp: Nicht alles abschreiben, sondern selbst ergänzen! Letzte Vorlesung: Probeklausur Klausur: max. 48 Punkte, keine Kofferklausur, sondern einseitig handgeschriebener A4-Merkzettel Informatik 2 5 FH D Praktikum Fachhochschule Düsseldorf University of Applied Sciences Unterlagen und Information auf der Internetseite! Beginnt ab 17.03.2014 Endgültige Gruppeneinteilung für das Info II Praktikum im Schaukasten neben S1a 4 Präsenztermine (4P) / 3 Projektaufgaben (15P) / 1 Abschlussprojekt (5P): Präsenztermin: Praktische Programmierübung unter Betreuung (Anwesenheitspflicht!) Projektaufgabe: Eigenständig zu bearbeitende Aufgaben zw. Präsenzterminen / Aufgabenstellung jeweils nach Präsenztermin Abschlussprojekt: Größeres Projekt (freiwillig, jedoch für max. Punktzahl notwendig!) Fragen zum Praktikum beantwortet Hr. Lippel oder Fr. Merz (Raum S1a). Informatik 2 6 FH D Literatur Fachhochschule Düsseldorf University of Applied Sciences Handbuch der Java-Programmierung Guido Krüger, Thomas Stark Gebundene Ausgabe: 1280 Seiten Verlag: Addison-Wesley, München; Auflage: 5. Auflage (28. November 2007) Sprache: Deutsch ISBN-10: 3827323738 Die HTML Ausgabe des Buches ist auch kostenlos verfügbar: www.javabuch.de Java ist auch eine Insel Christian Ullenboom Geb. Ausgabe: 1308 S. Galileo Computing, Sprache: Deutsch ISBN-10: 3836228734 Online kostenlos: http://openbook.galileocomputing.de/javainsel/ Informatik 2 The Java® Language Specification Sprache: Deutsch http://docs.oracle.com/javase/ specs/jls/se7/html/index.html 7 FH D Fachhochschule Düsseldorf University of Applied Sciences Entwicklungsumgebung In der Vorlesung wird die kostenlose Entwicklungsumgebung NetBeans verwendet: http://netbeans.org/downloads/ Informatik 2 8 FH D Fachhochschule Düsseldorf University of Applied Sciences Informatik 2: Java Java ist eine objektorientierte Programmiersprache. Vergleich C vs. Java Syntax ist ähnlich (logische Ausdrücke, Schleifen) Konzept der Programmierung ist grundlegend anders Warum Java Java ist kostenlos Java ist plattformunabhängig Für Java gibt es schon viele Programme, die Sie auch verwenden können. Informatik 2 9 FH D Fachhochschule Düsseldorf University of Applied Sciences Objektorientierung Objektorientierung ist ein Entwicklungskonzept für Software Programmierparadigma (zugrundeliegendes Prinzip) Daten werden klassifiziert nach Eigenschaften, Verhalten und Operationen. Organisationsstrukturen oder reale „Dinge“ (Objekte) werden nachgebildet. Objekte sind subjektiv Was ein Objekt ist und was es für wichtige Eigenschaften und Verhalten hat, hängt von der Wahrnehmungsweise ab. Objekte sind eigenständig und können mit anderen Objekten interagieren/kommunizieren. Beispiel: Motorrad Händler: Baujahr, Preis Kunde: Leistung, Fahreigenschaften Finanzamt: Hubraum, CO2 Ausstoß Versicherung: Leistung, Unfälle Informatik 2 10 FH D Fachhochschule Düsseldorf University of Applied Sciences Abstraktion: Klasse Ein Objekt aus der realen Welt wird abstrahiert und dessen allgemeiner Bauplan als Klassendefinition implementiert. Aus dieser Klasse können viele verschiedene Objekte (Instanzen einer Klasse) erzeugt werden. Zur Definition einer Klasse gehören Attribute: Eigenschaften des Objektes Methoden: Verhalten des Objektes Jetzt ein paar Beispiele ohne konkrete Implementierung! Informatik 2 11 FH D Beispiel: Fußballspieler Fachhochschule Düsseldorf University of Applied Sciences Reales System: Fußballmannschaft Abstrakter: Eine Spieler-Klasse, davon 11 Instanzen Attribute Spiele: Tore: in: out: Name: Nummer: Zahl 0…100 Zahl 0..22 Zahl 0..22 Zahl 0..22 Zeichenkette Zahl Methoden: „Schieße auf das Tor“ „Ein Rote Karte mehr“ „Auswechseln“ Informatik 2 12 FH D Fachhochschule Düsseldorf University of Applied Sciences v1 SMS SIEMAG: Bandposition in Walzstraße v2 v3 Bandkopf wird beim Walzen schneller (Massenerhalt) Wann sind die Bandköpfe wo? Objekte: Walzen Band Informatik 2 13 FH D Fachhochschule Düsseldorf University of Applied Sciences Einfaches Java Programm Dieses einfache Java Programm gibt eine Meldung auf dem Bildschirm aus public class Anwendung { public static void main(String[] args) { System.out.println("Erstes Beispiel"); } } Informatik 2 14 FH D Fachhochschule Düsseldorf University of Applied Sciences Die Klasse „Anwendung“ public class Anwendung { public static void main(String[] args) { System.out.println("Erstes Beispiel"); } } public: Sichtbarkeit „öffentlich“ – erst mal machen wir alles öffentlich. class: Klasse, Schlüsselwort von Java Anwendung: Name der Klasse. Auch gleich Dateinamen „Anwendung.java“ {…}: Block. Alles zwischen den geschweiften Klammern gehört zur Klasse Informatik 2 15 FH D Fachhochschule Düsseldorf University of Applied Sciences main Methode public class Anwendung { public static void main(String[] args) { System.out.println("Erstes Beispiel"); } } public: Sichtbarkeit „öffentlich“ – erst mal machen wir alles öffentlich. static: Zugriff direkt ohne Objekt möglich später mehr dazu… void: Rückgabetyp. Die Methode gibt nichts zurück main(String[] args) : Dies ist das Hauptprogramm. Eventuell werden aus der Kommandozeile Zeichenketten als Übergabeparameter bereitgestellt später… {…}: Block. Alles zwischen den geschweiften Klammern gehört zur Methode Informatik 2 16 FH D Fachhochschule Düsseldorf University of Applied Sciences Klasse für Eigenschaften von Spieler Spieler: Jeder Spieler einer Fußballmannschaft soll einen Namen und eine Spielstärke haben. public class Spieler { int spielstärke; String name; } Deklaration von Variablen: <Datentyp> <Variablenname>; Es ist nun der „Bauplan“ für einen Spieler gegeben. Es gibt aber noch keine Spieler! Spieler müssen erst noch erzeugt werden: <Klassenname> <Variablenname>; <Variablenname> = new <Klassenname> (); <Klassenname> <Variablenname> = new <Klassenname> (); Spieler mittelFeld = new Spieler(); Informatik 2 17 FH D Fachhochschule Düsseldorf University of Applied Sciences Ein Spieler wird erzeugt und bekommt einen Namen Spieler.java public class Spieler { int spielstärke; String name; } Anwendung.java public class Anwendung { public static void main(String[] args){ Spieler mittelFeld = new Spieler(); mittelFeld.name = "Jim Knopf"; } } Zugriff auf Eigenschaften und Methoden mit „.“ <Variablenname>.<Eigenschaft> mittelFeld.name = "Jim Knopf"; Informatik 2 18 FH D Fachhochschule Düsseldorf University of Applied Sciences Erstes Programmbeispiel public class Spieler { int spielstärke; String name; } public class Anwendung { public static void main(String[] args) { Spieler mittelFeld = new Spieler(); mittelFeld.name = "Jim Knopf"; mittelFeld.spielstärke = 57; System.out.println("Die Spielstärke von " + mittelFeld.name + " ist " + mittelFeld.spielstärke); } } Informatik 2 19 FH D Fachhochschule Düsseldorf University of Applied Sciences Mehrere Spieler Es können mehrere Instanzen (Objekte) der Klasse Spieler erzeugt werden. Jede Instanz hat ihre eigenen Eigenschaften. Eine Instanz weiß nicht, ob es noch andere Instanzen seiner Klasse gibt. public class Anwendung { public static void main(String[] args) { Spieler mittelFeld = new Spieler(); Spieler abwehr = new Spieler(); Spieler sturm = new Spieler(); mittelFeld.name abwehr.name sturm.name = "Jim Knopf"; = "Lukas Loko"; = "Max Mahlzahn"; } Informatik 2 20 FH D Fachhochschule Düsseldorf University of Applied Sciences Methoden einer Klasse public class Spieler { int spielstärke; String name; public void zeigeInfo() { System.out.println("Die Spielstärke von " + name + " ist " + spielstärke); } } Methoden sind die „Funktionen“ einer Klasse. Diese Methoden werden i.d.R. verwendet, um auf die internen Attribute lesend oder schreibend zuzugreifen. Methoden können mehrere oder keine Übergabewertehaben haben Methoden können einen oder keinen Rückgabewert haben. Auf die Methoden wird durch den Punktoperator zugegriffen: Beispiel: mittelFeld.zeigeInfo() Informatik 2 21 FH D Fachhochschule Düsseldorf University of Applied Sciences Informatik 2 Objektorientierte Programmierung in Java Prof. Dr.- Ing. André Stuhlsatz FH D Fachhochschule Düsseldorf University of Applied Sciences v1 SMS SIEMAG: Walzstraße v2 v3 Objekte: Walzen Lager Gerüst Spindel Antriebsmotor Getriebe Informatik 2 2 FH D Wiederholung: Klasse definieren Fachhochschule Düsseldorf University of Applied Sciences Die Klasse Walze hat Attribute und Methoden: public class Walze { Attribut double durchmesser; String hersteller; // und mehr Methode public void zeigeInfo() { System.out.println(„Hersteller=" + hersteller + „%nDurchmesser= " + durchmesser); } } Informatik 2 3 FH D Wiederholung: Instanz der Klasse erzeugen Fachhochschule Düsseldorf University of Applied Sciences 1. Variable vom Objekttyp Walze definieren und neue Instanz erzeugen. 2. Attribute mit Inhalten füllen. 3. Methoden aufrufen. public class Walzwerk { 1. public static void main(String[] args) { Walze arbeitswalze = new Walze(); 2. arbeitswalze.hersteller = „SMS Siemag AG"; arbeitswalze.durchmesser = 210.0; // etc. 3. arbeitswalze.zeigeInfo(); } } Informatik 2 4 FH D Initialisieren von Attributen Fachhochschule Düsseldorf University of Applied Sciences Das bisherige Verfahren ist umständlich und fehleranfällig: Attribute müssen einzeln gesetzt werden. Welche Attribute sind wichtig? Welche Attribute sollen mit Standardwerten belegt werden? Nächster Ansatz: Es wird eine Methode für die Initialisierung geschrieben: public class Walze { double durchmesser; String hersteller; public void initWalze( double durchm, String herst) { durchmesser = durchm; hersteller = herst; } } Informatik 2 5 FH D Programmänderung: Aufruf der Initialisierung Fachhochschule Düsseldorf University of Applied Sciences 1. Variable vom Objekttyp Walze definieren und neue Instanz erzeugen. 2. Attribute mit Inhalten füllen. 3. Methoden aufrufen. public class Walzwerk{ public static void main(String[] args) { Walze arbeitswalze = new Walze(); 1. 2. walze.initWalze(210.0, „SMS Siemag AG"); 3. walze.zeigeInfo(); } } Informatik 2 6 FH D Fachhochschule Düsseldorf University of Applied Sciences Wichtiger Unterschied: Attribute vs. Methoden Die Attribute und Methoden eines Objektes werden mit den Punkt-Operator angesprochen. Wichtiger Unterschied: Attribute haben keine Klammer. Methoden haben immer eine Klammer (wg. Übergabeparameter). public class Walzwerk { public static void main(String[] args) { Walze arbeitswalze = new Walze(); Keine Klammer arbeitswalze.hersteller = „SMS Siemag AG"; arbeitswalze.durchmesser = 210.0; Klammer arbeitswalze.zeigeInfo(); } } Informatik 2 7 FH D Variablen Fachhochschule Düsseldorf University of Applied Sciences In Java werden drei Typen unterschieden: 1. Instanzvariablen, die im Rahmen einer Klassendefinition definiert und zusammen mit dem Objekt angelegt werden. 2. Klassenvariablen, die ebenfalls im Rahmen einer Klassendefinition definiert werden, aber unabhängig von einem konkreten Objekt existieren. später 3. Lokale Variablen, die innerhalb einer Methode oder eines Blocks definiert werden und nur dort existieren. public class Walze { 1. double durchmesser; String hersteller; public void initWalze(double neu_durchmesser, String neu_hersteller) { durchmesser = neu_durchmesser; hersteller = neu_hersteller; } 1. 3. 3. } Informatik 2 8 FH D Überdecken von Variablen Fachhochschule Düsseldorf University of Applied Sciences Lokale Variablen und Instanz- oder Klassenvariablen können denselben Namen haben. Überdeckte Instanz- oder Klassenvariablen werden mit this angesprochen: Beispiel: this.durchmesser = durchmesser; public class Walze { double durchmesser; String hersteller; public void initWalze(double durchmesser, String hersteller) { this. durchmesser = durchmesser; this. hersteller = hersteller; } } Informatik 2 9 FH D Fachhochschule Düsseldorf University of Applied Sciences Initialisierung mit Konstruktor Bisher: Erst Instanz erzeugen, dann Instanzvariablen initialisieren. public class Walzwerk { public static void main(String[] args) { Walze arbeitswalze = new Walze(); arbeitswalze.initWalze(210.0, „SMS Siemag AG"); arbeitswalze.zeigeInfo(); } } Zukünftig mit Konstruktor: Alles in einer Zeile: public class Walzwerk { public static void main(String[] args) { Walze arbeitswalze = new Walze(210.0, „SMS Siemag AG"); arbeitswalze.zeigeInfo(); } } Informatik 2 10 FH D Fachhochschule Düsseldorf University of Applied Sciences Implementierung eines Konstruktors Ein Konstruktor wird immer dann aufgerufen, wenn eine Instanz der Klasse erzeugt wird. Ein Konstruktor ist eine Methode: Der Name des Konstruktors muss identisch mit dem Klassennamen sein. Der Datentyp des Rückgabeparameter muss weggelassen werden. public class Walze { double durchmesser; String hersteller; public Walze(double durchmesser, String hersteller) { this.durchmesser = durchmesser; this.hersteller = hersteller; } } Informatik 2 11 FH D Fachhochschule Düsseldorf University of Applied Sciences Überladen von Konstruktoren Es ist möglich mehrere Konstruktoren zu definieren, um beispielsweise nur einige Instanzvariablen mit Startwerten zu belegen. Die Parameterliste der Konstruktoren muss sich dabei in Anzahl oder Datentyp unterscheiden. public class Walze { double durchmesser; String hersteller; public Walze(double durchmesser, String hersteller) { this.durchmesser = durchmesser; this.hersteller = hersteller; } public Walze(String hersteller) { this.durchmesser = 210.0; // Standardwert this.hersteller = hersteller; } Walze arbeitswalze = new Walze(210.0, „SMS Siemag AG"); } Walze arbeitswalze = new Walze(„SMS Siemag AG"); Informatik 2 12 FH D Verkettung von Konstruktoren Fachhochschule Düsseldorf University of Applied Sciences Wenn in überladenen Konstruktoren die selben aufwendige Berechnungen erfolgen, kann es sinnvoll sein die Konstruktoren zu verketten. Verkettung von Konstruktoren: Die Konstruktoren rufen sich gegenseitig auf. Ein Konstruktor kann den anderen Konstruktor mit this aufrufen. Der Aufruf des anderen Konstruktors muss der erste Befehl der Methode sein! public class Walze { double durchmesser; String hersteller; public Walze(double durchmesser, String hersteller) { this(hersteller); this.durchmesser = durchmesser; } Erst den anderen Konstruktor aufrufen! public Walze(String hersteller) { this.durchmesser = 210.0; // Standardwert this.hersteller = hersteller; } } Informatik 2 13 FH D Fachhochschule Düsseldorf University of Applied Sciences Default-Konstruktor Wenn kein expliziter (selbst definierter) Konstruktor definiert wurde, dann verwendet Java den Default-Konstruktor. Der Default-Konstruktor hat keine Übergabeparameter. Anfangsbeispiel: Walze arbeitswalze = new Walze(); Wenn explizite Konstruktoren definiert sind, dann existiert kein DefaultKonstruktor mehr!!! Das Anfangsbeispiel erzeugt nun einen Compiler-Fehler. Falls immer noch ein Konstruktor ohne Übergabeparameter gewünscht ist, muss dieser erst wieder definiert werden! Informatik 2 14 FH D Fachhochschule Düsseldorf University of Applied Sciences Zusammenfassung Konstruktoren Mit Konstruktoren werden Instanzvariablen initialisiert und Berechnungen durchgeführt, welche für das Objekt von Beginn an wichtig sind. Ein Konstruktor hat denselben Namen wie seine Klasse. Ein Konstruktor hat keinen Rückgabeparameter – auch nicht void. Ein Konstruktor kann, wie andere Methoden, Parameter besitzen oder ohne Parameterliste definiert werden. Eine Klasse kann mehrere Konstruktoren besitzen. Konstruktoren müssen sich in ihrer Parameterliste von einander unterscheiden (Anzahl der Parameter, Reihenfolge der Datentypen). Ohne expliziten Konstruktor hat jede Klasse einen parameterlosen DefaultKonstruktor. Sobald man einen expliziten Konstruktor definiert hat, gibt es keinen DefaultKonstruktor mehr. Informatik 2 15 FH D Fachhochschule Düsseldorf University of Applied Sciences Informatik 2 Objektorientierte Programmierung in Java Prof. Dr.- Ing. André Stuhlsatz FH D Fachhochschule Düsseldorf University of Applied Sciences Beispiele zu primitiven Datentypen DezimalZahlen Ganze Zahlen Wiederholung: Primitive Datentypen sind in Java fest eingebaut (blau in NetBeans) int a = 12; Primitive Datentypen sind keine Klassen! Typ Bemerkung boolean „Wahr“, „Flasch“ char Nur ein Zeichen byte short int L oder l muss long Suffix sein F oder f muss float Suffix sein double Beispiel boolean istBehälterVoll = true; char zeichen = 'a'; byte a = 126; short b = 1900; int c = -190000; long = +190000L; float e = 3.14F; double f = 6.D; Informatik 2 2 FH D Implizite Typkonvertierung Fachhochschule Düsseldorf University of Applied Sciences In Java können die primitiven Datentypen konvertiert werden, weil etwa ein Double -Wert in eine Integer-Variable geschrieben werden soll. Java kann einige Typkonvertierungen implizit (automatisch) vornehmen. Bei der impliziten Typkonvertierung ist die Pfeilrichtung zu beachten. Ganze Zahlen byte short Dezimal-Zahlen int long char boolen float double Geht nicht… Regel für implizite Typkonvertierung: Präzision geht nicht verloren (daher automatisch möglich) Umwandlung in Datentyp mit mehr Speicherplatzverbrauch Ausnahmen: char (2 Byte) in int (4 Byte) boolean geht gar nicht Informatik 2 3 FH D Fachhochschule Düsseldorf University of Applied Sciences Beispiele: Implizite Typkonvertierung Bei den Beispielen ist die Richtung der Zuweisung zu beachten! Dabei können auch Datentypen „übersprungen“ werden. Beispiel: int direkt in double Definition char zeichen = 'a'; byte a = 126; short b = 1900; int c = -190000; float e = 3.14F; Nachfolgende Zuweisung zeichen = a; a = zeichen; b = a; b = zeichen; c = a; c = zeichen; a = c; e = b; b = e; e = 10L; Informatik 2 Bemerkung byte char geht nicht! char byte geht nicht! byte short funktioniert. char short geht nicht! byte int funktioniert. char int funktioniert. int byte geht nicht! short float funktioniert. float short geht nicht! long float funktioniert. 4 FH D Fachhochschule Düsseldorf University of Applied Sciences Explizite Typkonvertierung In Java (auch in C) können Datentypen explizit konvertiert werden. Explizite Typkonvertierung: Erzwungen, meist unter Verlust der Präzision. Die explizite Datenkonvertierung erfolgt durch die Angabe des Datentyps in vorangestellten Klammern: (Datentyp) Variable Beispiel: double a = 4711.0815; int b = (int) a; Ergebnis: Der Variablen b wird der Wert 4711 zugewiesen. Konsequenz: Weil die Nachkommastellen abgeschnitten werden, wird die Präzision nicht erhalten! Wichtig: Explizite Typkonvertierung = Informationsverlust! Beispiel: byte a = (byte) 4711.0815; Ergebnis: a = 103 Beispiel: Zuweisung float c = 4711.0815; Was ist falsch? Drei Lösungen ohne Informationsverlust! Informatik 2 5 FH D Fachhochschule Düsseldorf University of Applied Sciences Klasse: String Der Datentyp String ist kein primitiver Datentyp, sondern eine Klasse. Sonderstellung, weil kein new-Operator zwingend erforderlich Geht aber auch: String a = new String(“Informatik“); Die Zeichenketten sind einzelne Zeichen des primitiven Datentyps char. Die String-Klasse stellt mehrere Methoden zu Verfügung. Beispiele (Erstes Zeichen = Position 0): Suchen in Zeichenkette: int b = a.indexOf("at"); b = 6 Zeichen an Position: char c = a.charAt(2); c = ‘f‘; Vergleich von Zeichenketten: int d = a.compareTo("Informatik1"); d = -1 -1: Zeichenketten nicht gleich 0: Zeichenketten gleich Informatik 2 6 FH D Wrapper-Klassen Fachhochschule Düsseldorf University of Applied Sciences Für die primitiven Datentypen werden Klassen zu Verfügung gestellt, welche nützliche Methoden für die Datentypen enthalten. Die Klassen nennt man Wrapper-Klassen Datentyp Wrapper Wrapper (engl.) = Hülle boolen Boolean Diese Klassen umhüllen den primitiven Datentyp. char Character Die meisten Methoden sind statisch (static) definiert, byte Byte können also ohne Objekt direkt mit dem Klassennamen short Short verwendet werden. Häufige Verwendung: Typkonvertierung Beispiel Umwandlung String int So geht es nicht: String anzSchraubenStr = "42"; int anzSchrauben = (int) anzSchraubenStr; Informatik 2 int long float double Integer Long Float Double Falsch! 7 FH D Typumwandlung mit Wrapper-Klassen Fachhochschule Düsseldorf University of Applied Sciences Beispiel Umwandlung String int String anzSchraubenStr = "42"; int anzSchrauben; 1. Umwandlung mit Konstruktor der Integer-Klasse: Integer-Klasse hat Konstruktor mit String als Übergabeparameter Integer-Objekte haben .intValue() Methode für Umwandlung in int. Integer tmp = new Integer(anzSchraubenStr); anzSchrauben = tmp.intValue(); In einer Zeile: anzSchrauben = new Integer(anzSchraubenStr).intValue(); 2. Umwandlung mit statischer Methode: Integer-Klasse hat statische Methode .valueOf(<String>) anzSchrauben = Integer.valueOf(anzSchraubenStr).intValue(); Informatik 2 8 FH D Operatoren Fachhochschule Düsseldorf University of Applied Sciences Ein Ausdruck besteht immer aus mindestens einem Operator und einem oder mehreren Operanden, auf die der Operator angewendet wird. Stelligkeit des Operators: Operatoren, die lediglich ein Argument erwarten, nennt man einstellig, solche mit zwei Argumenten zweistellig Einstellig: Vorzeichen (unärer Operator) Zweistellig: Addition, Multiplikation, etc. Dreistellig: Fragezeichenoperator Typ des Operators: numerische, relationale, logische, bitweise, Zuweisungs- und sonstige Operatoren Informatik 2 9 FH D Fachhochschule Düsseldorf University of Applied Sciences Operator Arithmetische Operatoren Bezeichnung Bedeutung + Positives Vorzeichen +n ist gleichbedeutend mit n. - Negatives Vorzeichen -n kehrt das Vorzeichen von n um. + Summe a + b ergibt die Summe von a und b. - Differenz a - b ergibt die Differenz von a und b. * Produkt a * b ergibt das Produkt aus a und b. / Quotient a / b ergibt den Quotienten von a und b. Bei integralen Typen handelt es sich hierbei um die ganzzahlige Division ohne Rest. % Restwert a % b ergibt den Rest der ganzzahligen Division von a durch b. ++ Präinkrement ++a ergibt a+1 und erhöht a um 1. ++ Postinkrement a++ ergibt a und erhöht a um 1. -- Prädekrement --a ergibt a-1 und verringert a um 1. -- Postdekrement a-- ergibt a und verringert a um 1. Informatik 2 10 FH D Fachhochschule Düsseldorf University of Applied Sciences Relationale Operatoren Die relationalen Operatoren arbeiten auf beliebigen - auch gemischten numerischen Typen. Im Fall von Gleichheit und Ungleichheit funktionieren sie auch auf Objekttypen, beziehen sich dann jedoch nicht auf den Inhalt, sondern die Adressen später Operator Bezeichnung Bedeutung == Gleich != Ungleich < Kleiner a == b ergibt true, wenn a gleich b ist. Sind a und b Referenztypen, so ist der Rückgabewert true, wenn beide Werte auf dasselbe Objekt zeigen. a != b ergibt true, wenn a ungleich b ist. Sind a und b Objekte, so ist der Rückgabewert true, wenn beide Werte auf unterschiedliche Objekte zeigen. a < b ergibt true, wenn a kleiner b ist. <= Kleiner gleich a <= b ergibt true, wenn a kleiner oder gleich b ist. > Größer a > b ergibt true, wenn a größer b ist. >= Größer gleich a >= b ergibt true, wenn a größer oder gleich b ist. Informatik 2 11 FH D Fachhochschule Düsseldorf University of Applied Sciences Logische Operatoren Logische Operatoren dienen dazu, boolesche Werte miteinander zu verknüpfen. Operator Bezeichnung Bedeutung ! Logisches NICHT !a ergibt false, wenn a wahr ist, und true, wenn a falsch ist. && UND mit ShortCircuit-Evaluation || ODER mit ShortCircuit-Evaluation & UND ohne ShortCircuit-Evaluation ODER ohne ShortCircuit-Evaluation Exklusiv-ODER a && b ergibt true, wenn sowohl a als auch b wahr sind. Ist a bereits falsch, so wird false zurückgegeben und b nicht mehr ausgewertet. a || b ergibt true, wenn mindestens einer der beiden Ausdrücke a oder b wahr ist. Ist bereits a wahr, so wird true zurückgegeben und b nicht mehr ausgewertet. a & b ergibt true, wenn sowohl a als auch b wahr sind. Beide Teilausdrücke werden ausgewertet. a | b ergibt true, wenn mindestens einer der beiden Ausdrücke a oder b wahr ist. Beide Teilausdrücke werden ausgewertet. a ^ b ergibt true, wenn beide Ausdrücke einen unterschiedlichen Wahrheitswert haben. | ^ Informatik 2 12 FH D Zuweisungsoperatoren Fachhochschule Düsseldorf University of Applied Sciences Eine Zuweisung gilt nicht als Anweisung, sondern als Ausdruck, der einen Rückgabewert erzeugt. Operator Bezeichnung = Einfache Zuweisung += Additionszuweisung -= Subtraktionszuweisung *= /= %= Bedeutung a = b weist a den Wert von b zu und liefert b als Rückgabewert. a += b weist a den Wert von a + b zu und liefert a + b als Rückgabewert. a -= b weist a den Wert von a - b zu und liefert a - b als Rückgabewert. Multiplikationszuweisung a *= b weist a den Wert von a * b zu und liefert a * b als Rückgabewert. Divisionszuweisung a /= b weist a den Wert von a / b zu und liefert a / b als Rückgabewert. Modulozuweisung a %= b weist a den Wert von a % b zu und liefert a % b als Rückgabewert. Informatik 2 13 FH D Fachhochschule Düsseldorf University of Applied Sciences Sonstige Operatoren Fragezeichenoperator (wie in C) a ? b : c ist also b, falls a wahr ist, und c, falls a falsch ist. Cast-Operator Explizite Typumwandlung mit Datentyp in Klammern String-Verkettung mit „+“ int anzSchrauben = 42; System.out.println(„Anzahl der Schrauben = " + anzSchrauben ); Achtung: Klammern bei Berechnungen! Ergebnis 425: int anzSchrauben = 42; System.out.println(„Anzahl der Schrauben = " + anzSchrauben + 5); Ergebnis 47: int anzSchrauben = 42; System.out.println(„Anzahl der Schrauben = " + (anzSchrauben+5)); Informatik 2 14 FH D Fachhochschule Düsseldorf University of Applied Sciences Informatik 2 Objektorientierte Programmierung in Java Prof. Dr.- Ing. André Stuhlsatz FH D Blöcke Fachhochschule Düsseldorf University of Applied Sciences Blöcke erweitern einzelne Anweisungen, etwa bei Kontrollstrukturen später Beispiel: Einzelne Anweisung: anweisung; Erweiterung der einzelnen Anweisung: { anweisung1; anweisung2; … } Blöcke können geschachtelt werden. Wichtig: Variablen sind nur innerhalb des Blocks und in den Verschachtelungsebenen sichtbar! Wenn der Block geschlossen wird, ist die Variable weg! Informatik 2 2 FH D Fachhochschule Düsseldorf University of Applied Sciences Beispiel: Variablen in Blöcken In diesem Beispiel Die Variablen sind nur innerhalb des Blocks sichtbar. Nach dem Block können die Variablen mit gleichem Namen wieder anders definiert werden. public static void main(String[] args) { { int a = 15; { int b = 16; System.out.println("Zahl:" + (b + a)); } System.out.println("Zahl:" + a); } { double a = 17.0; System.out.println("Zahl:" + a); } System.out.println("Zahl:" + a); } Informatik 2 3 FH D Fachhochschule Düsseldorf University of Applied Sciences Bedingte Verzweigung Wenn Teile eines Programms nur unter bestimmten Bedingungen ausgeführt werden sollen, werden Verzeigungen verwendet. Die Bedingungen können sich zur Laufzeit ändern. In Java gibt es zwei verschiedene Anweisungen für Verzweigungen if-Anweisung switch-Anweisung if (logischer Ausdruck) Anweisung; if (logischer Ausdruck) Anweisung; else Anweisung; switch (Ausdruck) { case Konstante1: Anweisung1; case Konstante2: Anweisung2; … default: StandardAnweisung; } Informatik 2 4 FH D Fachhochschule Düsseldorf University of Applied Sciences If-Anweisung Wichtig: Der logische Ausdruck hinter if muss vom Typ boolean (true/false) sein! Es ist nicht möglich dort Zahlen einzusetzen (wie in C oder MATLAB) random() erzeugt eine gleichverteile Zufallszahl (double) zwischen 0…1 Beispiel: Münzwurf double zufallZahl = java.lang.Math.random(); String strKopfZahl; if (zufallZahl > 0.5) strKopfZahl = "Kopf"; else strKopfZahl = "Zahl"; System.out.println("Die Münze zeigt " + strKopfZahl); Informatik 2 5 FH D Fachhochschule Düsseldorf University of Applied Sciences If-Anweisung: Gleichheit Wichtig: Auf Gleichheit wird mit zwei Gleichheitszeichen getestet! Beispiel: Würfel mit Anzeige, ob Pasch gewürfelt wurde Achtung: Beachten Sie die Vorgehensweise bei den ganzen Zufallszahlen int würfel_a = (int) (java.lang.Math.random()*6) + 1; int würfel_b = (int) (java.lang.Math.random()*6) + 1; String Meldung = "Die Würfel zeigen "; if (würfel_a == würfel_b) Meldung += würfel_a + "er Pasch"; else Meldung += würfel_a + " und " + würfel_b; System.out.println(Meldung); Informatik 2 6 FH D Fachhochschule Düsseldorf University of Applied Sciences If-Anweisung: Gleichheit von Fließkommazahlen Wichtig: Vermeiden Sie es Fließkommazahlen auf Gleichheit zu testen! Gerade im Ingenieurbereich kann es zu schwerwiegenden Fehlern kommen! Beispiel: 1 b= ⋅ a − 1 + a a b = 1−1+ a b=a double a = 0.42; double b = ((1/a) * a) - 1.0 + a ; if (b == a) System.out.println("a gleich b"); else System.out.println("a ungleich b"); Mit Zahlen: a=0,42 a gleich b a=0,41 a ungleich b Besser: Unterschreiten von Schwellwert. final double EPSILON = 1e-10; if (Math.abs(a-b)<EPSILON) System.out.println("a gleich b"); Informatik 2 7 FH D Fachhochschule Düsseldorf University of Applied Sciences If-Anweisung: „Dangling else“ Verschachtelte If-Anweisung können bei ungeeigneter Formatierung vom Menschen falsch interpretiert werden. Das else wird immer der inneren if-Anweisung zugeordnet! c = 0; if (a == 1) if (b == 1) c = 1; else c = 2; c = 0; if (a == 1) if (b == 1) c = 1; else c = 2; c = 0; if (a == 1) { if (b == 1) c = 1; } else c = 2; Informatik 2 8 FH D Fachhochschule Düsseldorf University of Applied Sciences Bezeichnung Es gibt keine if-Schleife Informatik 2 9 FH D Fachhochschule Düsseldorf University of Applied Sciences Switch-Anweisung Mehrfachverzeigungen können mit der switch-Anweisung verständlicher implementiert werden, als mit geschachtelten if-Abfragen. Ausdruck muss vom Typ byte, short, int oder char sein! Die Konstante und der Ausdruck müssen zuweisungskompatibel sein. Konstanten dürfen nicht doppelt vorkommen. Das default-Label ist optional und wird angesprungen, wenn keine Konstante zutrifft. switch (Ausdruck) { case Konstante1: Anweisung1; case Konstante2: Anweisung2; … default: StandardAnweisung; } Die Anweisungen werden alle ab der zutreffenden Konstanten ausgeführt! Soll dies nicht geschehen, muss die Anweisung am Ende mit break beendet werden. Informatik 2 10 FH D Fachhochschule Düsseldorf University of Applied Sciences Ausgabe: Zwei Null? Beispiel: Switch-Anweisung int a = 2; switch (a) { case 1: System.out.println("Eins"); case 2: System.out.println("Zwei"); default: System.out.println("Null?"); } int a = 2; switch (a) { case 1: System.out.println("Eins"); break; case 2: System.out.println("Zwei"); break; default: System.out.println("Null?"); break; } Informatik 2 Ausgabe: Zwei 11 FH D Schleifen Fachhochschule Düsseldorf University of Applied Sciences while-Schleife: Die Schleife wird durchlaufen, solang der logische Ausdruck wahr ist. Wenn der logische Ausdruck zu Anfang schon falsch ist, wird die Anweisung gar nicht ausgeführt! do-Schleife: Die Schleife wird beendet, wenn der logische Ausdruck falsch ist. Die Anweisung wird mindestens einmal durchlaufen, weil der logische Ausdruck erst am Ende geprüft wird! Informatik 2 while (logischer Ausdruck) Anweisung; do Anweisung; while (logischer Ausdruck) 12 FH D Fachhochschule Düsseldorf University of Applied Sciences for-Schleifen for (init; test; update) Anweisung; Der Kopf der for-Schleife besteht aus drei Ausdrücken, die jeder für sich optional sind: Der init-Ausdruck wird einmal vor dem Start der Schleife aufgerufen. Er dient dazu, Initialisierungen durchzuführen. Der init-Teil darf auch aus mehreren Ausdrücken bestehen, wenn die einzelnen Teilausdrücke durch Kommata getrennt sind. Fehlt der Initialisierungsteil, wird keine Initialisierung im Kopf der Schleife durchgeführt. Der init-Teil darf auch Variablendeklarationen enthalten, beispielsweise, um einen Schleifenzähler zu erzeugen. Der test-Teil bildet den Testausdruck der Schleife. Analog zur while-Schleife wird er am Anfang der Schleife ausgeführt. Der update-Ausdruck dient dazu, den Schleifenzähler zu verändern. Informatik 2 13 FH D Fachhochschule Düsseldorf University of Applied Sciences Beispiel: for-Schleifen for (int i=1; i<=3; i++) { System.out.println("i ist " + i); } int i = 1; for (; i<=3; i++) { System.out.println("i ist " + i); } int i = 1; for (; i<=3;) { System.out.println("i ist " + i++); } Informatik 2 14 FH D Übung Fachhochschule Düsseldorf University of Applied Sciences Schreiben Sie eine berechneGLS_Versandkosten()-Methode für die Klasse GLS_Paket, welche die Versandkosten in Euro zurückgibt. Auf der Internetseite von GLS findet sich folgende Anleitung für die Berechnung der Versandkosten. „Die Größe Ihres Pakets (längste Seite + kürzeste Seite) wird in Ihrem Paketshop mit einem Maßband vermessen. Je nach Größe ergeben sich nur noch fünf verschiedene Preisklassen – XS bis XL – unabhängig vom Gewicht.“ „Das Gurtmaß (Umfang des Paketes zzgl. längste Seite) darf 3 m nicht überschreiten.“ Pack-Größe Längste + kürzeste Seite Versandkosten Wenn das maximale XS max. 35 cm 4,10 € Gurtmaß überschritten S max. 50 cm 5,90 € wird, soll die M max. 65 cm 6,90 € Methode -1.0 L max. 80 cm 9,90 € zurückgeben. XL max. Gurtmaß 15,30 € Informatik 2 15 FH D Fachhochschule Düsseldorf University of Applied Sciences Vorbereitung Gegeben ist: a = kürzeste Seite b = zweitkürzeste Seite c = längste Seite c Wichtige Berechnungen: a+c = längste + kürzeste Seite a 2*(a+b)+c = Gurtmaß b Rückgabetyp: float oder double, weil die Versandkosten Nachkommastellen haben. Also: public float berechneGLS_Versandkosten() Informatik 2 16 FH D Fachhochschule Düsseldorf University of Applied Sciences Verzweigung wie in Tabelle 1. if (a+c <= 35) 2. return 4.1f; 3. if (a+c <= 50) 4. return 5.9f; 5. if (a+c <= 65) 6. return 6.9f; 7. if (a+c <= 80) 8. return 9.9f; Pack- Längste + kürzeste Versand- Größe XS S M L XL Seite max. 35 cm max. 50 cm max. 65 cm max. 80 cm max. Gurtmaß kosten 4,10 € 5,90 € 6,90 € 9,90 € 15,30 € 9. if ((2*(a+b)+c) <= 300) 10. return 15.3f; 11. return -1f; // unzulässige Paketgröße Informatik 2 17 FH D Fachhochschule Düsseldorf University of Applied Sciences Informatik 2 Objektorientierte Programmierung in Java Prof. Dr.- Ing. André Stuhlsatz FH D Referenzen Fachhochschule Düsseldorf University of Applied Sciences Beispiel an der einfachen Klasse Walze: public class Walze { int id; public Walze(int id) { this.id = id; } } Verwenden der Klasse Walze in zwei Variablen: Walze a = new Walze(1); Walze b = new Walze(2); System.out.println(“Walze a = " + a.id); System.out.println(“Walze b = " + b.id); Ausgabe ???? a=1 b=2 Informatik 2 2 FH D Referenzen Fachhochschule Düsseldorf University of Applied Sciences Das erzeugen von Referenzen geschieht über das Schlüsselwort new. Referenzen von Objekten sind als Adresse im Hauptspeicher zu verstehen, wo das Objekt zu finden ist. obj[0] obj[1] obj[2] … Ref_obj Werden an diesem Objekt Änderungen durchgeführt, dann hat dies auch Auswirkungen auf das Original. Für das Kopieren von Attributen (deep copy), und nicht von Referenzen (shallow copy), benötigt man also einen Kopiermechanismus. Informatik 2 3 FH D Fachhochschule Düsseldorf University of Applied Sciences Shallow Copy: Kopieren von Objekten (= Referenzen) Änderung des Programms: Objekt kopieren Ausgabe ???? Walze a = new Walze(1); Walze b = a; // kopieren... System.out.println(“Walze a = " + a.id); System.out.println(“Walze b = " + b.id); a=1 b=1 Änderung von a nach b kopieren. Danach sollte b unverändert bleiben… Ausgabe ???? Walze a = new Walze(1); Walze b = a; // kopieren... b.id = 2; System.out.println(“Walze a = " + a.id); System.out.println(“Walze b = " + b.id); a=2 b=2 Es werden die Referenzen kopiert, nicht der Inhalt! Danach zeigen a und b auf die selbe Stelle im Hauptspeicher! Informatik 2 4 FH D Fachhochschule Düsseldorf University of Applied Sciences Value Types vs. Reference Types Bei primitiven Datentypen (value types) wird bei Übergabe- / Rückgabedatentyp in Methoden der Inhalt kopiert (Call By Value). bei Zuweisung der Inhalt kopiert. Bei Objekten (reference types) wird bei Übergabe- / Rückgabedatentyp in Methoden die Referenz übergeben (Call By Value). Achtung: nicht wie in C++ oder C# (Call By Reference)! bei Zuweisung die Referenz kopiert, nicht der Inhalt. Walze a = new Walze(1); Walze b = a; // Referenz kopieren... a.id = 2; System.out.println(“Walze a = " + a.id); // Ausgabe 2 System.out.println(“Walze b = " + b.id); // Ausgabe 2 int c = 1; int d = c; // Inhalt kopieren c = 2; System.out.println("c = " + c); // Ausgabe 2 System.out.println("d = " + d); // Ausgabe 1 Informatik 2 5 FH D Fachhochschule Düsseldorf University of Applied Sciences Parameterübergabe By-Value public void copyTo(Walze target, double durchmesser){ durchmesser = 4; target.durchmesser = this.durchmesser; target.hersteller = this.hersteller; target.maxbandgeschwindigkeit = this.maxbandgeschwindigkeit; target.umlaufgeschwindigkeit = this.umlaufgeschwindigkeit; } public static void main(String[] args) { Walze arbeitswalze1 = new Walze("SMS", 200.0, 10.0); Walze arbeitswalze3 = new Walze("Siemens VAI", 300.0, 10.0); arbeitswalze1.zeigeInfo(); arbeitswalze3.zeigeInfo(); double durchmesser = 300.0; arbeitswalze1.copyTo(arbeitswalze3, durchmesser); arbeitswalze3.zeigeInfo(); System.out.println("durchmesser = "+durchmesser); } Ausgabe ???? Informatik 2 6 FH D Fachhochschule Düsseldorf University of Applied Sciences Deep Clone/Copy public Walze deepcopy() { return new Walze( this.hersteller, this.durchmesser, this.umlaufgeschwindigkeit); } public static void main(String[] args) { Walze arbeitswalze1 = new Walze("SMS", 200.0, 10.0); Walze arbeitswalze2 = new Walze("Danieli", 250.0, 10.0); Walze arbeitswalze5 = arbeitswalze2.deepcopy(); arbeitswalze5.zeigeInfo(); arbeitswalze5 = arbeitswalze1.deepcopy(); arbeitswalze5.zeigeInfo(); } Was passiert jetzt mit dem belegten Speicher von der alten Referenz in arbeitswalze5 ? Informatik 2 7 FH D Fachhochschule Düsseldorf University of Applied Sciences Garbage-Collector (GC) Der Garbage-Collector überwacht alle erzeugten Referenzen, löscht nicht mehr benötigte Referenzen vom Heap ruft vor dem löschen auf dem Heap die finalize()-Methode auf stoppt alle Threads während des Aufräumens defragmentiert von Zeit zu Zeit den Heap. Am Rande: Der GC von der JVM von Sun ist ein sogenannter Generational GC. Informatik 2 8 FH D Spezielle Referenzen Fachhochschule Düsseldorf University of Applied Sciences null-Referenz: Referenz die sich auf ein nicht-existierendes Objekt bezieht. Ermöglicht uninitialisierte Referenzvariablen zu definieren. null besitzt keine Methoden oder Attribute. Dient zum kennzeichnen/markieren von Enden in Speicherstrukturen. Zuweisen von null einer Referenzvariablen erzwingt Löschung durch GC. this-Referenz: Referenz auf das Objekt selbst. Wird verwendet zur Unterscheidung von Attributen und Variablen. public class Walze { int id; public Walze(int id) { this.id = id; } } super-Referenz: Referenz auf das Objekt der Superklasse (->später). Wird analog wie this zum Zugriff auf die Superklassen-Methoden/Attribute verwendet. Informatik 2 9 FH D Fachhochschule Düsseldorf University of Applied Sciences Identität/Gleichheit von Objekten Vergleichsoperator == testet die Identität von Referenzen. D.h. true => Referenzvariablen zeigen auf gleiches Objekt, andernfalls false. Für Test auf Gleichheit muss erst definiert werden, was Gleichheit zwischen zwei Instanzen bzw. Objekten bedeutet! Implementierung durch Methode boolean equals(Object obj): public class Walze { int id; instanceof testet den Typ der Instanz. public Walze(int id) { this.id = id; } @Override public boolean equals(Object obj){ if (obj instanceof Walze) return ((Walze)obj).id == this.id; super.equals(obj); } } Informatik 2 10 FH D Fachhochschule Düsseldorf University of Applied Sciences Beispiel Reference Type: Arrays - Datenfelder Die wichtigsten Eigenschaften von Arrays zusammengefasst: Arrays dienen zum Speichern von mehreren Daten (1…n) des selben festen Datentyps. In Arrays können primitive Datentypen und Referenz-Datentypen gespeichert werden. Arrays sind Objekte sind Referenzen besitzen sowohl Methoden, als auch Instanz-Variablen werden zur Laufzeit erzeugt Arrays sind semi-dynamisch: Die Größe kann zur Laufzeit mit einer Variablen festgelegt werden. Danach ist die Größe nicht mehr änderbar. Informatik 2 11 FH D Fachhochschule Düsseldorf University of Applied Sciences Erzeugen von Arrays Die Erzeugung eines Arrays erfolgt in zwei Schritten Deklaration einer Array-Variablen Erzeugen eines Arrays und Zuweisung an die Array-Variable Beispiel Deklaration oder [] hinter Variable (wie bei C) int[] matrikelnummern; double[] messwerte; int matrikelnummern[]; double messwerte[]; Erzeugen der Arrays matrikelnummern = new int[5]; int n = 6; messwerte = new double[n]; Wichtig: Die Nummerierung beginnt nicht bei 1, sondern bei 0. Beispiel: messwerte[n] ist falsch, weil das Array nur von [0…n-1] geht! Informatik 2 12 FH D Erzeugen und Füllen von Arrays Fachhochschule Düsseldorf University of Applied Sciences Die Deklaration und Erzeugung von Arrays kann auch in einem Schritt erfolgen: double[] messwerte = new double[5]; Füllen von Arrays Lesend und schreibend kann auf die Elemente der Arrays zugegriffen werden, indem der Index in Eckigen klammern angegeben wird. Der Index kann auch eine Variable sein. messwerte[0] messwerte[1] messwerte[2] messwerte[3] messwerte[4] = = = = = 12.4; 10.3; 13.1; 9.8; 8.7; Deklaration, Erzeugung und Füllen in einem Schritt: double[] messwerte = new double[] {12.4, 10.3, 13.1, 9.8, 8.7}; Informatik 2 13 FH D Fachhochschule Düsseldorf University of Applied Sciences Länge eines Array/Klonen von Arrays Mit dem Attribut length des Arrays kann die Anzahl der Elemente abgefragt werden. Zuweisen geht allerdings nicht (weil final -> später!). double[] messwerte = new double[] {12.4, 10.3, 13.1, 9.8, 8.7}; messwerte.length = 7; // Versuch: Array vergrößern... Fehlermeldung: Uncompilable source code - cannot assign a value to final variable length Mit der Methode clone() lassen sich einfach Arrays mit identischer Größe und Inhalt erzeugen: double[] messwerte = new double[] {12.4, 10.3, 13.1, 9.8, 8.7}; double[] sicherung = messwerte.clone(); Informatik 2 14 FH D Fachhochschule Düsseldorf University of Applied Sciences Mit Schleifen durch Arrays Dieses Beispiel gibt die Nummer des Messwertes und den Messwert aus. double[] messwerte = new double[] {12.4, 10.3, 13.1, 9.8, 8.7}; for (int i =0; i < messwerte.length; i++) System.out.println("Messwert Nr." + (i+1) + " = " + messwerte[i]); Beispiel: Wenn ein Messwert unter einem Schwellwert liegt, dann ersetzen double[] messwerte = new double[] {12.4, 10.3, 13.1, 9.8, 8.7}; for (int i =0; i < messwerte.length; i++) { if (messwerte[i] <= schwellwert) messwerte[i] = schwellwert; System.out.println("Messwert = " + messwerte[i]); } Alternative: double[] messwerte = new double[] {12.4, 10.3, 13.1, 9.8, 8.7}; for (double wert : messwerte) System.out.println("Messwert = " + wert); Informatik 2 15 FH D Fachhochschule Düsseldorf University of Applied Sciences Feld sortieren mit Java Methode java.util.Arrays.sort verwenden: double[] messwerte = new double[] {12.4, 10.3, 13.1, 9.8, 8.7}; java.util.Arrays.sort(messwerte); System.out.println("\nSortiert:"); for (double sample : messwerte) System.out.println("Messwert = " + sample); Ausgabe: Sortiert: Messwert = 8.7 Messwert = 9.8 Messwert = 10.3 Messwert = 12.4 Messwert = 13.1 Informatik 2 16 FH D Fachhochschule Düsseldorf University of Applied Sciences Arrays an Methoden übergeben Arrays sind Objekte daher Referenzen: public void sortiereInhalt(double[] feld){ java.util.Arrays.sort(feld); } public void sortiereInhalt(double[] feld){ double[] neuesfeld = feld.clone(); java.util.Arrays.sort(neuesfeld); feld = neuesfeld; } Informatik 2 17 FH D Fachhochschule Düsseldorf University of Applied Sciences Informatik 2 Objektorientierte Programmierung in Java Prof. Dr.- Ing. André Stuhlsatz FH D Vererbung Fachhochschule Düsseldorf University of Applied Sciences Eines der wesentlichen Designmerkmale objektorientierter Sprachen ist die Möglichkeit, Variablen und Methoden zu Klassen zusammenzufassen. Ein weiteres wichtiges Merkmal ist das der Vererbung, also der Möglichkeit, Eigenschaften vorhandener Klassen auf neue Klassen zu übertragen. Fehlt diese Fähigkeit, bezeichnet man die Sprache auch als lediglich objektbasiert. Man unterscheidet bei objektorientierten Sprachen zwischen Einfachvererbung, bei der eine Klasse von maximal einer anderen Klasse abgeleitet werden kann Mehrfachvererbung, bei der eine Klasse von mehr als einer anderen Klasse abgeleitet werden kann. In Java gibt es ohne Beschränkung der Allgemeinheit nur Einfachvererbung! Informatik 2 2 FH D Fachhochschule Düsseldorf University of Applied Sciences Beispiel: Vererbung Um eine neue Klasse aus einer bestehenden abzuleiten, ist im Kopf der Klasse mit Hilfe des Schlüsselworts extends ein Verweis auf die Basisklasse anzugeben. Durch Hinzufügen neuer Elemente oder Überladen der vorhandenen kann die Funktionalität der abgeleiteten Klasse erweitert werden. class A{ public int attrA; public A(){ attrA = 1; } } class B extends A{ public int attrB; public B(){ attrB = 2; } } Klasse A ist Mutterklasse (Superklasse) von Klasse B. Klasse B ist Tochterklasse (Subklasse) von Klasse A. Klasse B erbt alle öffentlichen Methoden und Eigenschaften von B. Informatik 2 3 FH D Fachhochschule Düsseldorf University of Applied Sciences Vererbung von Konstruktoren Wenn eine Klasse instanziert wird, garantiert Java, dass ein zur Parametrisierung des new-Operators passender Konstruktor aufgerufen wird. Daneben garantiert der Compiler, dass auch der Konstruktor der Mutterklasse aufgerufen wird. Dieser Aufruf kann entweder explizit oder implizit geschehen: Falls als erste Anweisung innerhalb eines Konstruktors ein Aufruf der Methode super steht, wird dies als Aufruf des Superklassenkonstruktors interpretiert. Falls als erste Anweisung im Konstruktor kein Aufruf von super steht, setzt der Compiler an dieser Stelle einen impliziten Aufruf super() ein und ruft damit den parameterlosen Konstruktor der Mutterklasse auf. Falls ein parameterloser Konstruktor in der Mutterklasse nicht definiert wurde, gibt es einen Compiler-Fehler. Das ist genau dann der Fall, wenn in der Superklassendeklaration lediglich parametrisierte Konstruktoren angegeben sind. Informatik 2 4 FH D Fachhochschule Düsseldorf University of Applied Sciences Beispiel: Vererbung von Konstruktoren class A{ public int attrA; public A(int attrA){ this.attrA = attrA; } } Klasse B erbt das Attribut von Klasse A. class B extends A{ public int attrB; public B(int attrB){ super(attrA); this.attrB = attrB; } } Bei Instanzierung von B muss der Konstruktor von A explizit aufgerufen werden. Informatik 2 Die Klasse B wird um ein Attribut erweitert. Das neue Attribut von B wird initialisiert. 5 FH D Fachhochschule Düsseldorf University of Applied Sciences Überlagerte Methoden (overridden methods) Wird eine Methode x in einer abgeleiteten Klasse überlagert, wird die ursprüngliche Methode x verdeckt. Aufrufe von x beziehen sich immer auf die überlagernde Variante. Oftmals ist es allerdings nützlich, die verdeckte Superklassenmethode aufrufen zu können, beispielsweise, wenn deren Funktionalität nur leicht verändert werden soll. In diesem Fall kann mit Hilfe des Ausdrucks super.x() die Methode der Mutterklasse aufgerufen werden. Der kaskadierte Aufruf von Superklassenmethoden, etwa super.super.x(), ist nicht erlaubt. Später mehr zum Thema Polymorphie und Typcasting von Referenzen! Informatik 2 6 FH D Fachhochschule Düsseldorf University of Applied Sciences Beispiel: Methode überlagern class A{ public int attrA; public A(int attrA){ this.attrA = attrA; } public void zeige(){ System.out.println(“A=“,attrA); } } class B extends A{ public int attrB; public B(int attrB){ super(attrA); this.attrB = attrB; } public void zeige(){ super.zeige(); System.out.println(“B=“,attrB); } } Informatik 2 Methode zeige() wird in Superklasse und Subklasse definiert! zeige() der Superklasse kann über superReferenz aufgerufen werden. Methoden überlagern ist nicht mit Methoden überladen zu verwechseln!!! 7 FH D Fachhochschule Düsseldorf University of Applied Sciences Klasse Object: Mutter aller Klassen in der JavaKlassenhierarchie Enthält eine Klassendefinition kein extends, so besitzt sie trotzdem die implizite Mutterklasse Object. Jede Klasse, die keine extends-Klausel besitzt, wird direkt aus Object abgeleitet. Jede explizit abgeleitete Klasse stammt am oberen Ende ihrer Vererbungslinie von einer Klasse ohne explizite Superklasse ab und ist damit ebenfalls aus Object abgeleitet. Object ist also die Superklasse aller anderen Klassen! Informatik 2 8 FH D Fachhochschule Düsseldorf University of Applied Sciences Geerbt von der Object-Klasse Die Klasse Object definiert einige elementare Methoden, die für alle Arten von Objekten nützlich sind: Damit diese Methoden in abgeleiteten Klassen vernünftig funktionieren, müssen sie bei Bedarf überlagert werden. Für equals und clone gilt das insbesondere, wenn das Objekt Referenzen enthält. Informatik 2 9 FH D Fachhochschule Düsseldorf University of Applied Sciences Modifikatoren Die Sichtbarkeit von Variablen und Methoden wird mit Hilfe folgender Modifikatoren (Modifier) geregelt: public Elemente sind in der Klasse selbst (also in ihren Methoden), in Methoden abgeleiteter Klassen und für den Aufrufer von Instanzen der Klasse sichtbar. protected Elemente sind in der Klasse selbst und in Methoden abgeleiteter Klassen sichtbar. Zusätzlich können Klassen desselben Pakets sie aufrufen. private Elemente sind lediglich in der Klasse selbst sichtbar. Für abgeleitete Klassen und für Aufrufer von Instanzen bleiben private-Variablen verdeckt. Keine Angabe von public, protected oder private Ohne einen der drei Modifier dekrarierte Elemente, werden als package scoped oder Elemente mit Standard-Sichtbarkeit bezeichnet. Sie sind nur innerhalb des Pakets sichtbar, zu dem diese Klasse gehört. In anderen Paketen sind sie dagegen unsichtbar. Informatik 2 10 FH D Fachhochschule Düsseldorf University of Applied Sciences Modifikator: public Instanzvariablen und Methoden vom Typ public sind im Rahmen ihrer Lebensdauer überall sichtbar. Sie können daher in der eigenen Klasse und von beliebigen Methoden anderer Klassen verwendet werden. Superklassen können auf public-Elemente einer abgeleiteten Subklasse zugreifen. Das Attribut public ist zusätzlich auch bei der Klassendefinition selbst von Bedeutung, denn nur Klassen, die als public deklariert wurden, sind außerhalb des Pakets sichtbar, in dem sie definiert wurden. In jeder Quelldatei darf nur eine Klasse mit dem Attribut public angelegt werden! Informatik 2 11 FH D Fachhochschule Düsseldorf University of Applied Sciences Modifier: protected Methoden oder Variablen vom Typ protected sind in der aktuellen Klasse und in abgeleiteten Klassen sichtbar. Darüber hinaus sind sie für Methoden anderer Klassen innerhalb desselben Pakets sichtbar. Sie sind jedoch nicht für Aufrufer der Klasse sichtbar, die in anderen Paketen definiert wurden. Superklassen haben Zugriff auf protected-Elemente einer abgeleiteten Subklasse. Informatik 2 12 FH D Fachhochschule Düsseldorf University of Applied Sciences Modifikator: private Methoden oder Variablen vom Typ private sind nur in der aktuellen Klasse sichtbar, in allen anderen Klassen bleiben sie dagegen unsichtbar. Diese Einschränkung bedeutet nicht, dass die Methoden einer Klasse nur auf die privaten Instanzvariablen des eigenen Objekts zugreifen dürfen. Es ist möglich auf die private-Variablen eines anderen Objekts zuzugreifen, wenn es sich um eine Instanz derselben Klasse handelt. An der Implementierung von setzeNeu() ist zu erkennen, wie der Zugriff auf fremde Objekte desselben Typs möglich ist: class KlassePrivat { private String a; public KlassePrivat(String a) { this.a = a; } public void setzeNeu(KlassePrivat other, String neu) { other.a = neu; } } Informatik 2 13 FH D Fachhochschule Düsseldorf University of Applied Sciences Modifikator: static Variablen und Methoden mit dem Attribut static sind nicht an die Existenz eines konkreten Objekts gebunden Sie existieren vom Laden der Klasse bis zum Beenden des Programms. Das static-Attribut beeinflusst bei Instanzvariablen die Lebensdauer. Das static-Attribut erlaubt bei Methoden den Aufruf, ohne dass der Aufrufer ein Objekt der Klasse besitzt, in der die Methode definiert wurde. Wird das Attribut static nicht verwendet, so sind Variablen innerhalb einer Klasse immer an eine konkrete Instanz gebunden. Ihre Lebensdauer beginnt mit dem Anlegen des Objekts und dem Aufruf eines Konstruktors und endet mit der Freigabe des Objekts. Informatik 2 14 FH D Fachhochschule Düsseldorf University of Applied Sciences Modifikator: final Instanzvariablen mit dem Attribut final dürfen nicht verändert werden, sind also als Konstanten anzusehen. Methoden des Typs final dürfen nicht überlagert werden. Klassen eines des Typs final können nicht zur Ableitung neuer Klassen verwendet werden. Wird das Attribut final dagegen nicht verwendet, sind Instanzvariablen veränderbar, können Methoden überlagert und Klassen abgeleitet werden. Falls eine Methode oder Klasse das Attribut final besitzt, kann der Compiler auf die dynamische Methodensuche verzichten (später mehr zu Polymorphie). final-Methoden können daher performanter aufgerufen werden als normale Methoden. Dies ist einer der Gründe dafür, dass die Java-Designer einige der mitgelieferten Klassen als final deklariert haben. Es führt aber gleichzeitig dazu, dass die entsprechenden Klassen nicht mehr erweitert werden können. Ein prominentes Beispiel aus der Laufzeitbibliothek ist die als final deklarierte Klasse String. Informatik 2 15 FH D Fachhochschule Düsseldorf University of Applied Sciences Weitere Modifikatoren transient Instanzvariablen können mit dem Attribut transient belegt werden, um anzuzeigen, dass sie keine persistente Form besitzen. Sie werden beim Serialisieren und Deserialisieren von Objekten dieses Typs ignoriert. volatile Dieses Schlüsselwort wird verwendet, um anzuzeigen, dass Membervariablen asynchron, also außerhalb des aktuellen Threads, modifiziert werden können. Der Wert einer so deklarierten Variable wird daher bei jedem Zugriff erneut gelesen (anstatt möglicherweise direkt aus einem Register der virtuellen Maschine genommen zu werden). Die Verwendung von volatile ist eher ungebräuchlich. Es kann beispielsweise zur Sicherstellung der Datenintegrität beim Multithreading verwendet werden oder dient dazu, Zugriffe auf asynchron veränderliche Speicherstellen (etwa eine Echtzeituhr, auf die über eine Variable zugegriffen wird) stets aktuell zu halten. Informatik 2 16 FH D Fachhochschule Düsseldorf University of Applied Sciences Weitere Modifikatoren synchronized sichert bei mehreren konkurrierend auf Variablen zugreifenden Threads die Datenkonsistenz. native Kennzeichnet Methoden, die in einer Platform-abhängigen Programmiersprache (C, C++, FORTRAN, Assembler) geschrieben ist. abstract hierzu später mehr… Informatik 2 17 FH D Alle Modifikatoren auf einen Blick Fachhochschule Düsseldorf University of Applied Sciences Anwendbarkeit: Attribut abstract final native private protected public static synchronized transient volatile x x x x x x x Methode x x x x x x x x Konstruktor x x x Klasse x x Interface x x x Zugriffsebenen: public protected no modifier private Klasse ja ja ja ja Paket ja ja ja nein Subklasse ja ja nein nein Informatik 2 Welt ja nein nein nein 18 FH D Alle Modifikatoren auf einen Blick Fachhochschule Düsseldorf University of Applied Sciences Sichtbarkeit: Paket A Paket B Klasse W Klasse Y Klasse X Klasse Z Klasse W Klasse X Klasse Y Klasse Z public ja ja ja ja protected ja ja ja nein no modifier ja ja nein nein private ja nein nein nein Informatik 2 19 FH D Fachhochschule Düsseldorf University of Applied Sciences Informatik 2 Objektorientierte Programmierung in Java Prof. Dr.- Ing. André Stuhlsatz FH D Fachhochschule Düsseldorf University of Applied Sciences Wiederholung: Modifikatoren Der Modifikator static definiert sogenannte Klassenelemente, d.h. es sind im Gegensatz zu Instanzelementen keine Instanzen der Klasse Voraussetzung für ihre Existenz. Vorsicht: Das heißt aber auch, dass statische Klassenattribute nur einmal im Speicher vorhanden sind und somit von allen Instanzen „geteilt“ werden! Der Modifikator final definiert, dass ein Attributinhalt nicht geändert werden kann, eine Methode in abgeleiteten Klassen nicht überlagert werden kann, von einer Klasse nicht abgeleitet werden kann. Kombination static final definiert (globale) Konstanten, z.B. static final double PI = 3.14159 (Coding Rule: Konstanten werden durchgehend groß geschrieben!) Informatik 2 2 FH D Fachhochschule Düsseldorf University of Applied Sciences Exkurs: Statische Attribute in Java Statische Attribute/Konstanten werden nicht im Konstruktor initialisiert, da sie statisch sind und damit Klassenelemente sind: class Kreis{ public static final double PI = 3.14159; } oder class Kreis{ public static final double PI; static{ PI = 3.14159; } } Statischer Initialisierungsblock: • Wird immer ausgeführt, wenn Klasse in die Laufzeitumgebung geladen wird (in der Regel nur ein mal zur Laufzeit)! Eine Konstante public static final double PI = 3.14159 darf vom Compiler wegsubstituiert werden! Lösung: public static final double PI = Double.valueOf(3.14159). Informatik 2 3 FH D Wiederholung: Modifikatoren Fachhochschule Düsseldorf University of Applied Sciences Übersicht (Anwendbarkeit): Attribut abstract final native private protected public static synchronized transient volatile x x x x x x x Methode x x x x x x x x Konstruktor x x x Klasse x x Interface x x x Zugriffsebenen: public protected no modifier private Klasse ja ja ja ja Paket ja ja ja nein Subklasse ja ja nein nein Informatik 2 Welt ja nein nein nein 4 FH D Wiederholung: Modifikatoren Fachhochschule Düsseldorf University of Applied Sciences Sichtbarkeit: Paket A Paket B Klasse W Klasse Y Klasse X Klasse Z Klasse W Klasse X Klasse Y Klasse Z public ja ja ja ja protected ja ja ja nein no modifier ja ja nein nein private ja nein nein nein Informatik 2 5 FH D Fachhochschule Düsseldorf University of Applied Sciences Tipps zur generellen Auswahl des Zugrifflevels Verwenden sie immer private sofern nichts anderes dagegen spricht (Geheimnisprinzip)! Kein private bei zum Beispiel: Konstruktoren. Methoden, die in anderen Klassen aufrufbar sein sollen. Statische Methoden, z.B. public static void main(string args[]). Konstanten, z.B. public final double PI=3.14159 oder public static final double e = 2.718281. Benutzen Sie public für Attribute ausschließlich für Testzwecke! Vermeiden Sie Abhängigkeiten von Implementierungsdetails durch public getter- und setter-Methoden. Benutzen Sie protected-Elemente nur, wenn Sie eine Erweiterungsklasse bereitstellen möchten. Informatik 2 6 FH D Fachhochschule Düsseldorf University of Applied Sciences Getter und Setter Vermeiden sie Abhängigkeiten von Implementierungsdetails: Abhängigkeit vom Typ eines Attributes. Abhängigkeiten von Attributen untereinander, z.B. Ampelfarbe und Fahren/Halten. Abhängigkeit von Wertebereichen von Attributen. Implementieren und verwenden sie Getter- und Setter-Methoden für private Attribute um 1. 2. 3. 4. Abhängigkeiten aufzulösen, Validität von Inhalten zu prüfen, Zugriff zu loggen oder zu debuggen, Für Benutzer unwichtige Details zu verbergen. Informatik 2 7 FH D Fachhochschule Düsseldorf University of Applied Sciences Getter und Setter: Konvention class Benutzer{ private String password; private boolean valid; public void setPassword(String password) { this.password = password; } public String getPassword(){return this.password;} public Boolean isValid(){return this.valid;} } Getter und Setter werden mit Prefix „get“ bzw. „set“ und groß geschriebenem Attributnamen definiert (Coding Rule). Ausnahme Type boolean, hier ist es üblich „is“ statt „get“ zuverwenden. Setter habe nie einen Rückgabewert und immer einen Parameter vom Typ des Attributes. Getter haben immer einen Rückgabewert und nie einen Parameter. Informatik 2 8 FH D Modifikator: abstract Fachhochschule Düsseldorf University of Applied Sciences Der Modifikator abstract kann bei Methoden und Klassen verwendet werden. abstract kennzeichnet, dass eine Klasse oder Methode noch nicht vollständig implementiert ist (Prototyp). Ist eine Methode als abstract deklariert, dann muss auch die Klasse abstrakt sein. Abstrakte Klassen können nicht instanziert werden! Von einer abstrakten Klassen kann abgeleitet werden, dann muss die Subklasse alle abstrakten Methoden implementieren. Neben abstrakten Methoden können auch Attribute und implementierte Methoden existieren. abstract class KlasseAbstract{ private String a; public KlasseAbstract(String a) { this.a = a; } public abstract void setzeNeu(String neu); } Informatik 2 9 FH D Fachhochschule Düsseldorf University of Applied Sciences Informatik 2 Objektorientierte Programmierung in Java Prof. Dr.- Ing. André Stuhlsatz FH D Wiederholung: abstract Fachhochschule Düsseldorf University of Applied Sciences Der Modifikator abstract kann bei Methoden und Klassen verwendet werden. abstract kennzeichnet, dass eine Klasse oder Methode noch nicht vollständig implementiert ist (Prototyp). Ist eine Methode als abstract deklariert, dann muss auch die Klasse abstrakt sein. Abstrakte Klassen können nicht instanziert werden! Von einer abstrakten Klassen kann abgeleitet werden, dann muss die Subklasse alle abstrakten Methoden implementieren. Neben abstrakten Methoden können auch Attribute und implementierte Methoden existieren. abstract class KlasseAbstract{ private String a; public KlasseAbstract(String a) { this.a = a; } public abstract void setzeNeu(String neu); } Informatik 2 2 FH D Beipiel: Abstrakte Klasse Fachhochschule Düsseldorf University of Applied Sciences Grafisches Objekt Rechteck Linie Bézierkurve Kreis Grafische Objekte haben vieles gemeinsam: Zustände: Position, Orientierung und Farbe Verhalten: rotieren, bewegen, Größe ändern, zeichnen Trotzdem implementieren grafischen Objekte ihr Verhalten zum Teil unterschiedlich. Informatik 2 3 FH D Fachhochschule Düsseldorf University of Applied Sciences Beipiel: Abstrakte Klasse abstract class GrafischesObjekt{ protected int posX, posY; … protected bewegen(int neuX, int neuY){ … } abstract protected void zeichne(); abstract protected voide ändereGröße(); } Subklassen müssen abstrakte Methoden implementieren! final class Kreis extends GrafischesObjekt{ public void zeichne(){ … } public void ändereGröße(){ … } } Informatik 2 4 FH D Fachhochschule Düsseldorf University of Applied Sciences Coding Rule: Reihenfolge von Klassenelementen Eine allgemein geläufige Reihenfolge der Elemente einer Klassendefinition ist folgende: 1. 2. 3. 4. 5. 6. Klassenattribute Instanzattribute Konstruktoren Statische Methoden Getter/Setter Beliebige Methoden Innerhalb der einzelnen Blöcke wird in der Regel nach einschränkender Sichtbarkeit sortiert. Informatik 2 5 FH D Fachhochschule Düsseldorf University of Applied Sciences Klassenhierarchie (Java API) java.lang.Object java.awt.Component java.awt.Button java.awt.Checkbox java.awt.TextComponent java.awt.TextArea Informatik 2 java.awt.TextField 6 FH D Anwendung Walzwerk Fachhochschule Düsseldorf University of Applied Sciences Walzwerk (Prozesskette für den Werkstoff Stahl) Objekte einer Walzstraße Walzen Walzensatz Informatik 2 Gerüst Walzstraße 7 FH D Klasse Walzwerk (Java Anwendung) Fachhochschule Düsseldorf University of Applied Sciences package walzwerk; public class Walzwerk { public static void main(String[] args) { // Implementierung der Funktionalität eines Walzwerkes } } Alle Klassen die Objekte eines Walzwerkes definieren, liegen im package walzwerk. Die Klasse Walzwerk ist unsere Anwendungsklasse mit main-Methode. Informatik 2 8 FH D Fachhochschule Düsseldorf University of Applied Sciences Klasse Walzstrasse package walzwerk; Die Walzstraße ist ein Teil eines Walzwerkes. public class Walzstrasse { private Gerüst[] gerüste; Eine Walzstraße besteht aus Walzgerüsten. public Walzstrasse(int anzahl) {…} public Walzstrasse(Gerüst[] gerüste) {…} Überladener Konstruktor. public void baueGerüst(int position, Gerüst gerüst) {…} public void entferneGerüst(int position, Gerüst gerüst) {…} public void zeigeGerüste() {…} Methoden der Walzstraße. } Informatik 2 9 FH D Gerüste Fachhochschule Düsseldorf University of Applied Sciences Duo-Gerüst Quarto-Gerüst Informatik 2 Sexto-Gerüst 10 FH D Vererbungshierarchie Fachhochschule Düsseldorf University of Applied Sciences Ein Duo, Quarto oder Sexto „ist ein“ Gerüst. Die Klassen Duo, Quarto und Sexto sollen durch Vererbung die Eigenschaften und Methoden von der Klasse Gerüst erben. Zusätzlich können eigene Eigenschaften und Methoden definiert werden. abstract class Gerüst (Basisklasse/Superklasse) class Duo class Quarto class Sexto Klassendiagramm: Der Pfeil zeigt auf die Basisklasse (auch Superklasse genannt) Informatik 2 11 FH D Fachhochschule Düsseldorf University of Applied Sciences Abstrakte Klasse Gerüst (Prototyp) package gerüst; public abstract class Gerüst { protected double reibung;// Kundengeheimnis protected double temperatur;// Kundengeheimnis protected double drehmoment;// Kundengeheimnis private int wartungsintervall;//in Monaten private Walze[] walzensatz; double banddicke, double bandbreite // Getter und Setter … protected Gerüst(int wartungInMonaten) {…}// nur Package oder Subklasse! public void setzeUmlaufgeschwindigkeit(double umlaufgeschwindigkeit){…} public abstract double simulationWalzkraft(double banddicke, double bandbreite); public void zeigeWalzensatz() {…} } Informatik 2 12 FH D Klasse Duo Fachhochschule Düsseldorf University of Applied Sciences package gerüst; public class Duo extends Gerüst { public Duo(int wartungInMonaten, double arbeitswalzen_durchmesser) {…} // Getter und Setter … @Override public double simulationWalzkraft(double banddicke, double bandbreite) { // Implementierung einer Simulation abhängig von banddicke, bandbreite // und errechnetem Bandzug unter zur Hilfenahme von // Reibung, Temperatur, Drehmoment und Umlaufgeschwindigkeit. return 0.0; } } Informatik 2 13 FH D Fachhochschule Düsseldorf University of Applied Sciences Klasse Quarto package gerüst; public class Quarto extends Gerüst{ public Quarto(int wartungInMonaten, double arbeitswalzen_durchmesser, double stützwalzen_durchmesser) {…} // Getter und Setter @Override public double simulationWalzkraft(double banddicke, double bandbreite) { // Implementierung einer Simulation abhängig von banddicke, bandbreite // und errechnetem Bandzug unter zur Hilfenahme von // Reibung, Temperatur, Drehmoment und Umlaufgeschwindigkeit. return 0.0; } Informatik 2 14 FH D Fachhochschule Düsseldorf University of Applied Sciences Klassse Walze package gerüst; public class Walze { private double durchmesser;// mm private double umlaufgeschwindigkeit;// U/min private double bandgeschwindigkeit;// m/s private String hersteller; private String id; public Walze(String, String, double, double){…} public Walze(String, double, double){…} // Getter und Setter public void zeigeInfo(){…} private double berechneBandgeschwindigkeit(){…} } Informatik 2 15 FH D Fachhochschule Düsseldorf University of Applied Sciences Klasse Sexto Übung für Zuhause… Informatik 2 16 FH D Fachhochschule Düsseldorf University of Applied Sciences Informatik 2 Objektorientierte Programmierung in Java Prof. Dr.- Ing. André Stuhlsatz FH D Wiederholung: Gerüstbeispiel Fachhochschule Düsseldorf University of Applied Sciences Ein Duo, Quarto oder Sexto „ist ein“ Gerüst. Die Klassen Duo, Quarto und Sexto sollen durch Vererbung die Eigenschaften und Methoden von der Klasse Gerüst erben. Zusätzlich können eigene Eigenschaften und Methoden definiert werden. abstract class Gerüst (Basisklasse/Superklasse) (Definition in der letzte Vorlesung!) class Duo class Quarto class Sexto Klassendiagramm: Der Pfeil zeigt auf die (hier abstrakte) Basisklasse. Informatik 2 2 FH D Fachhochschule Düsseldorf University of Applied Sciences Vererbungshierarchie: Typ 0 class Duo class Sondergerüst double simulationWalzkraft(…){…} void setzeParameter(){…} class Quarto class Sexto Quarto ist ein erweitertes Duo, und ein Sexto ist ein erweitertes Quarto. Quarto und Sexto können eigene Methoden simulationWalzkraft() und setzeParameter() implementieren (Überlagern), müssen es aber nicht! Für jedes Sondergerüst, dass nicht von einem Duo ableitbar ist, gibt es keine Verbindlichkeiten der zu implementierenden Methoden. Informatik 2 3 FH D Vererbungshierarchie: Typ I Fachhochschule Düsseldorf University of Applied Sciences abstract class Gerüst (Prototyp) abstract double simulationWalzkraft(…); abstract void setzeParameter(); class Sondergerüst double simulationWalzkraft(…){…} void setzeParameter(){…} class Quarto class Duo double simulationWalzkraft(…){…} void setzeParameter(){…} double simulationWalzkraft(…){…} void setzeParameter(){…} class Sexto double simulationWalzkraft(…){…} void setzeParameter(){…} Jede abgeleitete Klasse muss jetzt abstrakte Methoden implementieren! Aber was ist, wenn Duo die Klasse Gerüst um Eigenschaften erweitert die auch für Quarto eigentümlich sind, bzw. Quarto diese erweitert und diese wiederum auch für Sexto typisch sind? Informatik 2 4 FH D Vererbungshierarchie: Typ II Fachhochschule Düsseldorf University of Applied Sciences abstract class Gerüst (Basisklasse/Superklasse) abstract double simulationWalzkraft(…); abstract void setzeParameter(); Jetzt müssen gemeinsame Eigenschaften nicht wiederholt implementiert werden. Aber was ist, wenn Sondergerüst völlig andere Eigenschaften hat als ein Gerüst, aber trotzdem simuliert werden soll? Erben von einer weiteren Klasse Simulation wäre hier wünschenswert. class Sondergerüst double simulationWalzkraft(…){…} void setzeParameter(){…} class Duo double simulationWalzkraft(…){…} void setzeParameter(){…} class Quarto class Sexto Informatik 2 5 FH D Interfaces Fachhochschule Düsseldorf University of Applied Sciences Aber: Mehrfachvererbung von Klassen ist in Java nicht erlaubt. Ausweg Definition eines Interfaces, z.B.: interface Simulation{ double PI = 3.1415; public double simulationWalzkraft(double banddicke, double bandbreite); } Interfaces definieren wie abstrakte Klassen nur Methoden (abstrakte Methoden, sowie ab JDK 8.0 statische und default-Methoden), aber keine Attribute. Interfaces dürfen/können nur (statische) Konstanten definieren. Interfaces können nicht instanziert werden. Klassen können Interfaces implementieren. Interfaces sind immer public oder package-private. Interface-Methoden sind immer public. Interfaces besitzen keine Konstruktoren. Informatik 2 6 FH D Interfaces Fachhochschule Düsseldorf University of Applied Sciences Interfaces dürfen von beliebigen Interfaces erben (Mehrfachvererbung): interface SimulationExt extends Berechne1, Berechne2{ public double simulationWalzkraft(double banddicke, double bandbreite); } Klassen können Interfaces implementieren: class Duo implements Simulation{ public double simulationWalzkraft(double banddicke, double bandbreite){…} } Kasse können auch mehrere Interfaces implementieren: class Duo implements Simulation1, Simulation2{ … } Informatik 2 7 FH D Vererbungshierarchie: Typ III Fachhochschule Düsseldorf University of Applied Sciences abstract class Gerüst (Basisklasse/Superklasse) abstract void setzeParamater(); double simulationWalzkraft(…){…} class Sondergerüst class Duo void setzeParameter(){…} double simulationWalzkraft(…){…} interface Simulation class Quarto double simulationWalzkraft(…); class Sexto Informatik 2 8 FH D Fachhochschule Düsseldorf University of Applied Sciences Erweiterung von Interfaces Wie erweitert man Interfaces ohne andere Klassen, die diese implementieren, unbenutzbar zu machen (Vermeidung von Implementierungsabhängigkeit)? Man verwendet Default-Methoden (ab JDK 8.0). Beispiel das Interface Simulation soll um zeigeErgebnis()erweitert werden: interface Simulation{ public double simulationWalzkraft(double banddicke, double bandbreite); } interface Simulation{ public double simulationWalzkraft(double banddicke, double bandbreite); default void zeigeErgebnis(){…} } Default-Methoden müssen eine Implementierung besitzen! Informatik 2 9 FH D Fachhochschule Düsseldorf University of Applied Sciences Interfaces und abstrakte Klassen Abstrakte Klassen dürfen von beliebigen Interfaces beliebige Methoden implementieren: interface Simulation extends Berechne1, Berechne2{ public double simulationWalzkraft(double banddicke, double bandbreite); public void zeigeErgebnis(); } abstract class Gerüst implements Simulation, Auswertung{ public double simulationWalzkraft(double banddicke, double bandbreite){…} } Informatik 2 10 FH D Vererbungshierarchie: Typ V Fachhochschule Düsseldorf University of Applied Sciences abstract class Gerüst (Prototyp) interface Simulation double simulationWalzkraft(…); void ändereWalzkraft(); abstract void setzeParameter(); void ändereWalzkraft(){…} class Sondergerüst double simulationWalzkraft(…){…} void ändereWalzkraft(){…} class Quarto class Duo double simulationWalzkraft(…){…} void setzeParameter(){…} double simulationWalzkraft(…){…} void setzeParameter(){…} class Sexto double simulationWalzkraft(…){…} void setzeParameter(){…} Dies ist eine besonders generelle und flexible Vererbungshierarchie. ändereWalzkraft()ist verbindlich zu implementieren und wird für alle Gerüste durch den Prototypen bereitgestellt. Informatik 2 11 FH D Fachhochschule Düsseldorf University of Applied Sciences Abstrakte Klassen oder Interfaces? Abstrakte Klasse verwendet man, wenn Code zwischen sehr eng in Beziehung stehenden Klassen geteilt werden soll, die Klassen, die die abstrakte Klasse erweitern, sehr viele Methoden und Attribute gemeinsam haben, andere Zugriffsmodifizierer als public notwendig sind, es sollen nicht-statische bzw. nicht konstante Attribute definiert werden. Interfaces verwendet man, wenn nicht eng in Beziehung stehende Klasse die gleiche Funktionalität implementieren können. Z.B. die Java API Interfaces Comparable oder Cloneable, man das Verhalten eines beliebigen Types definieren möchte ohne die konkrete Implementierung zu kennen, Multiple Vererbung notwendig ist. Informatik 2 12 FH D Fachhochschule Düsseldorf University of Applied Sciences Zusammenfassung I Object ist die Mutter aller Klassen in Java. Eine Klasse wird über das Schlüsselwort class definiert. Klassen definieren zugehörige Attribute und ihre Methoden. Über das Schlüsselwort new werden Instanzen (Objekte) einer Klasse erzeugt. Bei Instanzierung wird ein Konstruktor zur Initialisierung der Attribute aufgerufen. Falls kein (paramterisierter) Konstruktor definiert wurde, wird immer der Default-Konstruktor verwendet. Durch das Schlüselwort extends können Klassen von genau einer anderen Klasse die Attribute und Methoden von dieser erben und erweitern. Die vererbende Klasse heißt Mutterklasse, Vaterklasse, Basisklasse oder auch Superklasse. Die beerbte Klasse heißt Tochterklasse, Sohnklasse, abgeleitete Klasse oder auch Subklasse. Zugriffsmodifizierer public,protected, private und packageprivate beeinflussen die Sichtbarkeit der Attribute und Methoden in abgeleiteten Klassen. Informatik 2 13 FH D Fachhochschule Düsseldorf University of Applied Sciences Zusammenfassung II Über das Schlüsselwort super kann auf Eigenschaften der Superklasse zugegriffen werden. super() bezeichnet den Konstruktor der Superklasse. Über das Schlüsselwort this kann auf Eigenschaften der Klasse selbst zugegriffen werden. Hinsichtlich dem Geheimnisprinzip sollten Klassenelemente insbesondere Attribute als private deklariert werden. Zugriff auf private Attribute wird über Getter- und Setter-Methoden geregelt. Das Schlüsselwort final verhindert, dass eine Klasse abgeleitet werden kann. final macht Attribute zu Konstanten und Methoden können nicht überlagert werden. static definiert Klassenelemente im Gegensatz zu Instanzelementen. Durch das Schlüsselwort abstract kann eine Methode als Prototyp ohne Implementierung definiert werden. Dann muss die Klasse auch als abstrakt deklariert werden. Eine abstrakte Klasse kann abstrakte Methoden und implementierte Methoden enthalten. Informatik 2 14 FH D Fachhochschule Düsseldorf University of Applied Sciences Zusammenfassung III In Java gibt es keine Mehrfachvererbung unter Klassen. Interfaces definieren abstrakte und öffentliche Methoden und werden durch das Schlüsselwort interface deklariert. Von abstrakten Klassen kann nicht instanziert werden, sondern es kann nur von ihnen geerbt werden. In Interfaces können Default-Methoden, statische Methoden und Konstanten definiert werden. Interfaces können von anderen Interfaces erben (Mehrfachvererbung). Klassen können Interfaces implementieren, was durch das Schlüsselwort implements ausgedrückt wird. Klassen können mehrere Interfaces implementieren. Abstrakte Klassen können Interfaces (teilweise) implementieren. Mit Hilfe von Klassen, abstrakten Klassen, Interfaces und der Vererbung lassen sich komplexe Vererbungshierarchien erzeugen. Klassen, abstrakte Klassen und Interfaces können und sollten in Paketen organisiert werden (package). Pakete werden mit Hilfe des Schlüsselwortes import in den Sichtbarkeitsbereich eines anderen Paketes bzw. einer anderen Klasse importiert. Informatik 2 15 FH D Fachhochschule Düsseldorf University of Applied Sciences Informatik 2 Objektorientierte Programmierung in Java Prof. Dr.- Ing. André Stuhlsatz FH D Fachhochschule Düsseldorf University of Applied Sciences Wiederholung: Interfaces Aber: Mehrfachvererbung von Klassen ist in Java nicht erlaubt. Ausweg Definition eines Interfaces, z.B.: interface Simulation{ double PI = 3.1415; public double simulationWalzkraft(double banddicke, double bandbreite); } Interfaces definieren wie abstrakte Klassen nur Methoden (abstrakte Methoden, sowie ab JDK 8.0 statische und default-Methoden), aber keine Attribute. Interfaces dürfen/können nur (statische) Konstanten definieren. Interfaces können nicht instanziert werden. Klassen können Interfaces implementieren. Interfaces sind immer public oder package-private. Interface-Methoden sind immer public. Interfaces besitzen keine Konstruktoren. Informatik 2 2 FH D Fachhochschule Düsseldorf University of Applied Sciences Wiederholung: Interfaces Interfaces dürfen von beliebigen Interfaces erben (Mehrfachvererbung): interface SimulationExt extends Berechne1, Berechne2{ public double simulationWalzkraft(double banddicke, double bandbreite); } Klassen können Interfaces implementieren: class Duo implements Simulation{ public double simulationWalzkraft(double banddicke, double bandbreite){…} } Kasse können auch mehrere Interfaces implementieren: class Duo implements Simulation1, Simulation2{ … } Informatik 2 3 FH D Fachhochschule Düsseldorf University of Applied Sciences Erweiterung von Interfaces Wie erweitert man Interfaces ohne andere Klassen, die diese implementieren, unbenutzbar zu machen (Vermeidung von Implementierungsabhängigkeit)? Man verwendet Default-Methoden (ab JDK 8.0). Beispiel das Interface Simulation soll um zeigeErgebnis()erweitert werden: interface Simulation{ public double simulationWalzkraft(double banddicke, double bandbreite); } interface Simulation{ public double simulationWalzkraft(double banddicke, double bandbreite); default void zeigeErgebnis(){…} } Default-Methoden müssen eine Implementierung besitzen! Informatik 2 4 FH D Fachhochschule Düsseldorf University of Applied Sciences Wiederholung: Interfaces und abstrakte Klassen Abstrakte Klassen dürfen von beliebigen Interfaces beliebige Methoden implementieren: interface Simulation extends Berechne1, Berechne2{ public double simulationWalzkraft(double banddicke, double bandbreite); public void zeigeErgebnis(); } abstract class Gerüst implements Simulation, Auswertung{ public double simulationWalzkraft(double banddicke, double bandbreite){…} } Informatik 2 5 FH D Fachhochschule Düsseldorf University of Applied Sciences Wiederholung: Interfaces und abstrakte Klassen Programmbeispiel: NetBeans Informatik 2 6 FH D Fachhochschule Düsseldorf University of Applied Sciences Polymorphie („Vielgestaltigkeit“) Polymorphie ist die Möglichkeit eines Objektes unterschiedliche Klassen oder Interfaces als Typ annehmen zu können (Dynamic Binding). Das Überladen von Methoden ist bereits (statische) Polymorphie. Methoden sind allgemein polymorph, wenn sie in verschiedenen Klassen die gleiche Signatur besitzen, aber immer neu implementiert sind. Sind Methoden in einem Vererbungszweig auf unterschiedlichen Hierarchieebenen mit gleicher Signatur definiert, wird zur Laufzeit, abhängig vom Typ des Objektes, die richtige Methode aufgerufen (Late Binding). Man nennt den Aufruf dann „virtueller Methodenaufruf“ und die Methoden „virtuelle Methoden“. In Java sind alle Methoden immer virtuell. Informatik 2 7 FH D Polymorphie: Beispiel Fachhochschule Düsseldorf University of Applied Sciences Erstellen wir eine Fahrrad-Hierarchie: Fahrrad MountainBike public class private private private Rennrad BMX Fahrrad{ int kadenz; int gang; int geschwindigkeit; public Fahrrad(int kadenz, int gang, int geschwindigkeit){ setKadenz(kadenz); setGang(gang); setGeschwindigkeit(geschwindigkeit); } Informatik 2 8 FH D Fachhochschule Düsseldorf University of Applied Sciences Polymorphie: Beispiel public void setKadenz(int kadenz){ this.kadenz = kadenz; } public void setGang(int gang){ this.gang = gang; } public void setGeschwindigkeit(int geschwindigkeit){ this.geschwindigkeit = geschwindigkeit; } public void zeigeBeschreibung(){ System.out.println(“\nFahrrad ist im Gang “ + this.gear + “ mit Kadenz “ + this.kadenz + “ und fährt mit Geschwindigkeit “ + this.geschwindigkeit + “.”); } } Informatik 2 9 FH D Polymorphie: Beispiel Fachhochschule Düsseldorf University of Applied Sciences public class MountainBike extends Fahrrad{ private String federung; public MountainBike( int kadenz, int gang, int Geschwindigkeit, String federung){ super(kadenz, gang, geschwindigkeit); setFederung(federung); } public void setFederung(String federung){ this.federung = federung; } Polymorphie! public void zeigeBeschreibung(){ super.zeigeBeschreibung(); System.out.println(“Das MountainBike hat eine “ + this.federung + “ Federung.”); } } Informatik 2 10 FH D Fachhochschule Düsseldorf University of Applied Sciences Polymorphie: Beispiel public class Rennrad extends Fahrrad{ private int reifenbreite;// in (mm) public Rennrad( int kadenz, int gang, int Geschwindigkeit, int reifenbreite){ super(kadenz, gang, geschwindigkeit); setReifenbreite(reifenbreite); } public void setReifenbreite(int reifenbreite){ this.reifenbreite = reifenbreite; } Polymorphie! public void zeigeBeschreibung(){ super.zeigeBeschreibung(); System.out.println(“Das Rennrad hat “ + this.reifenbreite + “ mm Reifen.”); } } Informatik 2 11 FH D Polymorphie: Beispiel Fachhochschule Düsseldorf University of Applied Sciences public class BMX extends Fahrrad{ private … public BMX( int kadenz, int gang, int Geschwindigkeit, …){ Übung … } public void setXXXXXXXXXX(…){ … } public void zeigeBeschreibung(){ … } } Informatik 2 12 FH D Polymorphie: Beispiel Fachhochschule Düsseldorf University of Applied Sciences public class TestFahrrad{ public static void main(String[] args){ Fahrrad fahrrad1, fahrrad2, fahrrad3; Polymorphie! fahrrad1 = new Fahrrad(20, 10, 1); fahrrad2 = new MountainBike(20, 10, 5, “DualShock”); fahrrad3 = new Rennrad(40, 20, 8, 23); fahrrad1.zeigeBeschreibung(); fahrrad2.zeigeBeschreibung(); fahrrad3.zeigeBeschreibung(); } } Was wird ausgegeben? Informatik 2 13 FH D Fachhochschule Düsseldorf University of Applied Sciences Klassenpolymorphie: Referenztypecasting Wir dürfen Referenzvariablen einen anderen Referenztypen zuweisen, sofern dieser in der Klassenhierarchie tiefer liegt. Dies ist ein Typecast vergleichbar mit z.B. int var1; long var2 = var1;. Es ist erlaubt, da int in long passt. Ähnlich beinhaltet eine Subklasse alles ihrer Superklasse. Daher ist implizites/explizites Typecasting erlaubt. Wichtig, Typecasting von Superklasse nach Subklasse ist im allgemeinen nicht möglich! Auch wenn sich der Typ der Referenz geändert hat, hat sich nicht das Objekt im Speicher geändert! class A Die Referenz wirkt wie eine Schablone: class B extends A A a = new A(); int farbe; void zeigeFarbe(); B b = new B(); int anzahl; void zeigeAnzahl int farbe; void zeigeFarbe(); A ab = new B(); Informatik 2 14 FH D Fachhochschule Düsseldorf University of Applied Sciences Interfacepolymorphie Typcasting nach Interfaces ist genauso erlaubt wie Typcasting zu Superklassen: interface Vergleichbar{ int getVergleichswert(); boolean isEqual(Object o1, Object o2); } class A implements Vergleichbar{ public int wert; public int getVergleichswert(){ return wert; } Achtung: Polymorphie! Zur Laufzeit wird der Cast geprüft (Dynamic Binding). public boolean isEqual(Object o1, Object o2){ Vergleichbar a = (Vergleichbar)o1; Vergleichbar b = (Vergleichbar)o2; if (a.getVergleichswert() == b.getVergleichswert()) return true; else return false; } } Informatik 2 15 FH D Fachhochschule Düsseldorf University of Applied Sciences Informatik 2 Objektorientierte Programmierung in Java Prof. Dr.- Ing. André Stuhlsatz FH D Fachhochschule Düsseldorf University of Applied Sciences Wiederholung: Polymorphie Polymorphie ist die Möglichkeit eines Objektes unterschiedliche Klassen oder Interfaces als Typ annehmen zu können (Dynamic Binding). Das Überladen von Methoden ist bereits (statische) Polymorphie. Methoden sind allgemein polymorph, wenn sie in verschiedenen Klassen die gleiche Signatur besitzen, aber immer neu implementiert sind. Sind Methoden in einem Vererbungszweig auf unterschiedlichen Hierarchieebenen mit gleicher Signatur definiert, wird zur Laufzeit, abhängig vom Typ des Objektes, die richtige Methode aufgerufen (Late Binding). Man nennt den Aufruf dann „virtueller Methodenaufruf“ und die Methoden „virtuelle Methoden“. In Java sind alle Methoden immer virtuell. Informatik 2 2 FH D Fachhochschule Düsseldorf University of Applied Sciences Wiederholung: Referenztypecasting Wir dürfen Referenzvariablen einen anderen Referenztypen zuweisen, sofern dieser in der Klassenhierarchie tiefer liegt. Eine Subklasse erbt alle nicht-privaten Eigenschaften ihrer Superklasse. Daher ist implizites/explizites Typecasting erlaubt. Wichtig, Typecasting von Superklasse nach Subklasse ist im allgemeinen nicht möglich! Auch wenn sich der Typ der Referenz geändert hat, hat sich nicht das real existierende Objekt im Speicher geändert! class A class B extends A Die Referenz wirkt wie eine Schablone: int farbe; void zeigeFarbe(); A a = new A(); B b = new B(); int anzahl; void zeigeAnzahl int farbe; void zeigeFarbe(); A ab = new B(); Mit dem Schlüsselwort instanceof lässt sich der Type einer Instanz abfragen. Informatik 2 FH D Fachhochschule Düsseldorf University of Applied Sciences Wiederholung: Cast zu Interface Typcasting nach Interfaces ist genauso erlaubt wie Typcasting zu Superklassen: interface Vergleichbar{ int getVergleichswert(); boolean isEqual(Object o1, Object o2); } class A implements Vergleichbar{ public int wert; public int getVergleichswert(){ return wert; } Achtung: Polymorphie! Zur Laufzeit wird der Cast geprüft (Dynamic Binding). public boolean isEqual(Object o1, Object o2){ Vergleichbar a = (Vergleichbar)o1; Vergleichbar b = (Vergleichbar)o2; if (a.getVergleichswert() == b.getVergleichswert()) return true; else return false; } } Informatik 2 4 FH D Fachhochschule Düsseldorf University of Applied Sciences Achtung: Private Methoden und Polymorphie Achtung bei privat deklarierten Methoden im Zusammenhang mit Polymorphie: class A { private final int wert = 10; private void zeigeWert(){ System.out.println(“Der Wert von A lautet” + wert); } public void ausgeben(){ zeigeWert(); } } class B extends A{ private final int wert = 20; public void zeigeWert(){ System.out.println(“Der Wert von B lautet” + wert); } } Was wird ausgegeben? Informatik 2 5 FH D Fachhochschule Düsseldorf University of Applied Sciences Referenztypcasting von Superklasse nach Subklasse? Wichtig, Typecasting von Superklasse nach Subklasse ist im allgemeinen nicht möglich: class A {} class B extends A{} class C{ public static void main(String[] args){ A a = new A(); A ab = new B(); Was passiert hier? B b = (B)a;// Typecast von Superklasse zu Subklasse!!! B bb = (B)ab;// Typecast von Superklasse zu Subklasse!!! Eselsbrücke: Referenzen wirken wie eine Schablone auf das Objekt. Informatik 2 6 FH D Fehlerbehandlung: Exceptions Fachhochschule Düsseldorf University of Applied Sciences Zur Behandlung und Erkennung von (Laufzeit-)Fehlern werden in der Java Laufzeitumgebung sogenannte Exceptions ausgelöst. Exceptions sind Instanzen einer speziellen Klasse der Standardbibliothek. In der Standardbibliothek gibt es dafür eine Fehlerklassenhierarchie: Throwable Exception IO Runtime Exception Exception Error und viele, viele mehr… (siehe Java Reference) Informatik 2 7 FH D Fachhochschule Düsseldorf University of Applied Sciences Exceptions-Hierarchie und „Werfen“ von Exceptions Throwable: Ist die Superklasse für alle Fehler und Ausnahmen die von der JVM (Java Virtual Machine) „geworfen“ werden können. Zum „Werfen“ von Exceptions dient die Anweisung throw. Zum Beispiel: class Fehler{ public static void main(String[] args){ throw new RuntimeException(); } } Error: Diese Klasse repräsentiert die schwersten Fehler im System. In der Regel wird bei diesen Fehler das Programm vollständig beendet. Exception: Wichtigste Klasse für allgemeine Ausnahmen. Alle benutzerdefinierten Exceptions sollten hiervon abgeleitet sein. RuntimeException: Behandelt Programmierfehler, die während des Programmablaufes auftreten können. Dazu gehören u.a.: fehlerhafte Typenkonvertierung Zugriff über Arraygrenzen hinaus Zugriff auf null-Zeiger IOException: Input-/Outputfehler, wie zum Beispiel Schreib-/Lesefehler Informatik 2 8 FH D Fachhochschule Düsseldorf University of Applied Sciences Kontrollierte und unkrontrollierte Exceptions Alle Methoden in Java die eine Exception auslösen können müssen dies anzeigen (Checked Exceptions): class Fehler{ public static void main(String[] args) throws Exception{ throw new Exception(); } } Das Schlüsselwort hierfür heißt throws. Des Weiteren muss sichergestellt werden, dass eine Exception auch „gefangen“ wird: try{ //Anweisungen } catch(Typ Objekt){ //Anweisungen } Ausnahme bilden hierbei Error und RuntimeException und deren Subklassen (Unchecked Exceptions). Informatik 2 9 FH D Fachhochschule Düsseldorf University of Applied Sciences Beispiel: Exception werfen und fangen Beispiel: class TestFehler{ public static void werfeFehler() throws Exception{ throw new Exception(); } public static void main(String[] args){ Achtung: Hier steht immer try{ der Typ der Exception die werfeFehler(); gefangen werden soll! } catch(Exception e){ System.out.println(“Fehler gefangen!”); } } } Exceptions können auch weiter geworfen werden. Informatik 2 10 FH D Catch-Block Fachhochschule Düsseldorf University of Applied Sciences Mit Hilfe des catch-Blocks fängt man eine oder mehrere Ausnahmen vom entsprechenden Ausnahmetyp: try{ //Anweisungen } catch(Typ1 Objekt){ //Anweisungen } catch(Typ2 Objekt){ //Anweisungen } catch(Typ3 Objekt){ //Anweisungen } Tritt eine Ausnahme aus kann also gezielt auf diese reagiert werden. Jeder Exception-Typ darf dabei nur einmal verwendet werden! Informatik 2 11 FH D Fachhochschule Düsseldorf University of Applied Sciences Benutzerdefinierte Exceptions Um eigene Ausnahmen auslösen zu können, muss von einer der in der Exception-Hierarchie befindlichen Klassen geerbt werden. In der Regel wird dies die Klasse Exception sein. Ableiten von Error sollte man vermeiden, da diese Art von Ausnahmen schwere Fehler darstellen und einen sofortigen Abbruch des Programms zur Folge haben. class DivisionDurchNull extends Exception{ public DivisionDurchNull(){ super("Division durch Null"); } } Informatik 2 12 FH D Fachhochschule Düsseldorf University of Applied Sciences Benutzerdefinierte Exceptions public class TestException { public static double dividiere(double zähler, double nenner) throws DivisionDurchNull{ if (nenner == 0) throw new DivisionDurchNull(); else return zähler/nenner; } public static void main(String[] args){ // TODO code application logic here try{ System.out.println("Ergebnis 3/5 = " + dividiere(3,5)); System.out.println("Ergebnis 2/0 = " + dividiere(2,0)); } catch(Exception e){ System.out.println(e.getMessage()); } } } Informatik 2 13 FH D Finally… Fachhochschule Düsseldorf University of Applied Sciences Optional darf nach einem catch-Block noch eine finally-Block stehen: try{ //Anweisungen } catch(Typ1 Objekt){ //Anweisungen } catch(Typ2 Objekt){ //Anweisungen } finally{ //Anweisungen } Der finally-Block ist nützlich um nach einer Exception noch wichtigen Programmcode auszuführen, z.B. Freigabe von Resourcen oder Schließen von Dateien. Der finally-Block wird quasi immer ausgeführt. Informatik 2 14 FH D Fachhochschule Düsseldorf University of Applied Sciences Behandeln von Ausnahmen innerhalb der Hierarchie Generell hat man die Möglichkeit durch catch(Throwable e) auf alle erdenklichen Exceptions zu reagieren. Praktisch könnte man dann z.B. mit instanceof im einzelnen auf Ausnahmen reagieren. Dies ist schlechter Stil! Man sollte im Allgemeinen auf einzelne Exception über einen entsprechenden catch-Block reagieren. Dabei gilt, dass man sich vom Speziellen (Subklasse) zum Allgemeinen (Superklasse) in der Exception-Hierarchie „durchhangelt“. public static void main(String[] args){ try{ System.out.println("Ergebnis 2/0 = " + dividiere(2,0)); } catch (DivisionDurchNull) { System.out.println(“Fehler bei Division: “+ e.getMessage); } catch(Exception e){ System.out.println(“Allgemeiner Fehler: “+ e.getMessage()); } } Informatik 2 15 FH D Fachhochschule Düsseldorf University of Applied Sciences Informatik 2 Objektorientierte Programmierung in Java Prof. Dr.- Ing. André Stuhlsatz FH D Fachhochschule Düsseldorf University of Applied Sciences Wiederholung: Exceptions in Java Ausnahmen (Exceptions) sind Instanzen einer speziellen Klassehierarchie der Standardbibliothek: Throwable Exception IO Runtime Exception Exception Error Zum Auslösen oder „Werfen“ von Exceptions dient die Anweisung throw: class Fehler{ public static void main(String[] args){ throw new RuntimeException(); } } Informatik 2 2 FH D Wiederholung: Exceptions Fachhochschule Düsseldorf University of Applied Sciences Alle Methoden in Java die eine Exception auslösen können, müssen dies mittels throws anzeigen (Checked Exceptions): class Fehler{ public static void main(String[] args) throws Exception{ throw new Exception(); } } Des Weiteren muss mit catch sichergestellt werden, dass eine Exception auch „gefangen“ wird: Versuch (try) eine try{ Anweisung //Anweisungen auszuführen, die } catch(Typ Objekt){ eine Ausnahme //Anweisungen erzeugen könnte. } Ausnahme bilden hierbei Error, RuntimeException und deren Subklassen (Unchecked Exceptions). Informatik 2 3 FH D Fachhochschule Düsseldorf University of Applied Sciences Wiederholung: try/catch-Block Mit Hilfe des catch-Blocks fängt man eine oder mehrere Ausnahmen vom entsprechenden Ausnahmetyp: try{ //Anweisungen } catch(Typ1 Objekt){ //Anweisungen } catch(Typ2 Objekt){ //Anweisungen } finally{ //Anweisungen } Jeder Exception-Typ darf in einem try-catch-Block nur einmal abgefragt werden! Optional darf nach einem catch-Block noch ein finally-Block stehen. Der finally-Block wird quasi immer ausgeführt. Informatik 2 4 FH D Wiederholung: Benutzerdefinierte Exceptions Fachhochschule Düsseldorf University of Applied Sciences Eigene Ausnahmen werden durch Ableiten von der throwable-Klasse bzw. ihrere Subklassen (in der Regel von der Klasse Exception) ermöglicht: class DivisionDurchNull extends Exception{ public DivisionDurchNull(){ super("Division durch Null"); } } Generell hat man die Möglichkeit durch catch(Throwable e) auf alle erdenklichen Exceptions zu reagieren. Man sollte im Allgemeinen auf einzelne Exception über einen entsprechenden catch-Block reagieren. Dabei gilt, dass man sich vom Speziellen (Subklasse) zum Allgemeinen (Superklasse) in der Exception-Hierarchie „durchhangelt“. Informatik 2 5 FH D Fachhochschule Düsseldorf University of Applied Sciences Innere Klassen/Interfaces Klassen (oder) Interfaces können zur besseren Strukturierung ineinander verschachtelt werden. Eine Definition von inneren Klassen/Interfaces (inner class/inner interface) erfolgt innerhalb einer anderen Klasse/Interface (outer class/outer interface). Bisherige Klassen werden „Top-Level-Klasssen“ genannt. class TopLevelClass{ … } class OuterClass{ class InnerClass{ … } … } Motivation von inneren Klassen/Interfaces ist die Bereitstellung von Hilfsklassen/-interfaces möglichst nahe und gekapselt, wo sie benötigt werden. Innere Klassen/Interfaces können auf Eigenschaften der äußeren Klasse zugreifen (auch auf private!). Informatik 2 6 FH D Fachhochschule Düsseldorf University of Applied Sciences Typen von inneren Klassen in Java Es gibt vier Arten von inneren Klassen in Java: Geschachtelte Klassen sind Top-Level-Klassen, obwohl sie innerhalb einer anderen Klasse definiert sind. Elementklassen sind ganz allgemein innere Klassen. Lokale Klassen werden innerhalb einer Methode oder eines Blockes definiert. Anonyme Klasse sind lokal und namenlos. Informatik 2 7 FH D Fachhochschule Düsseldorf University of Applied Sciences Geschachtelte Klassen Geschachtelte Top-Level-Klassen sind mit static deklarierte innere Klassen: class OuterClass{ static int i; int j; public static class StaticInnerClass{ public void setzeI(){ i = 20; Zugriff ist nur auf { statische Elemente } der äußeren Klasse … möglich! } Objekte von geschachtelten Klassen können auch ohne ein Objekt der äußeren Klasse existieren: OuterClass a = new OuterClass(); OuterClass.StaticInnerClass ab = new OuterClass.StaticInnerClass(); Geschachtelte Top-Level-Klassen dienen nur der Strukturierung (Namensraumerweiterung). Informatik 2 8 FH D Elementklassen Fachhochschule Düsseldorf University of Applied Sciences Element Klassen sind echte innere Klassen und dienen nicht nur der Strukturierung. Elementklassen haben auf alle Elemente der äußeren Klasse Zugriff, auch auf private. Elementklassen werden analog Top-Level-Klassen gebildet und verwendet, sie dürfen aber keine statischen Elemente enthalten. Objekte von Elementklassen sind immer mit Objekten der äußeren Klasse verbunden: class A{ } private int i; public class B{ public class C{ public C(){i = 5}; } Objekterzeugung: public void init(){ A a = new A(); i = 0; j = 0; A.B b = a.new B(); { } A.B.C c = b.new C(); Informatik 2 FH D Lokale Klassen Fachhochschule Düsseldorf University of Applied Sciences Lokale Klassen sind nicht auf oberster Ebene zugreifbar, sondern nur in Methoden oder Blöcken in denen sie definiert sind: class A{ … public void doSomething(){ int i = 0; class Worker implements Runnable{ public void run{…}; } new Worker().run(); … } … } Lokale Klassen dürfen daher nicht als private,public protected oder static deklariert werden! Informatik 2 10 FH D Lokale Klassen Fachhochschule Düsseldorf University of Applied Sciences Lokale Klassen dürfen keine statischen Elemente haben. Lokale Klassen dürfen nicht den gleichen Namen tragen wie eine umgebene Klasse. Eine lokale Klasse kann nur auf Konstanten (final) des umgeben Codeblocks zugreifen: class A{ int j = 0;// Zugriff möglich public void doSomething(){ int i = 0;// kein Zugriff möglich final k = 0;// Zugriff möglich, weil final class Worker implements Runnable{ int n=0; public void run{ n = (k++) * (j++); }; } new Worker().run(); … } … } Informatik 2 11 FH D Fachhochschule Düsseldorf University of Applied Sciences Anonyme Klassen Anonyme Klassen kann man als lokale „wegwerf“-Klassen bezeichnen. Sie werden wie lokale Klassen in Methoden bzw. Anweisungsblöcken definiert. Sie haben die gleichen Einschränkungen wie lokale Klassen. Sie besitzen keinen Namen und auch keinen Konstruktor. Anonyme Klassen können nicht mit den Schlüsselwörten extends und implements verwendet werden. Bei Definition entsteht immer gleich das Objekt: class A{ public void doSomething(){ Runnable Worker = new Runnable(){ public void run{ // mach was… }; } Worker.run(); … } … } Informatik 2 12