1 WS 2012 Software-Engineering II Einführung / Objektorientierung.

Slides:



Advertisements
Ähnliche Präsentationen
der Universität Oldenburg
Advertisements

der Universität Oldenburg
Objektorientierte Programmierung
der Universität Oldenburg
der Universität Oldenburg
DVG Einfache Klassen Einfache Klassen. DVG Einfache Klassen 2 Strukturen Beispiel: Personendaten bestehen aus –String name –String vorname.
Einführung in die Programmierung Zusammenfassung
Kritische Betrachtung
PKJ 2005/1 Stefan Dissmann Vorwoche - Klasse public class Studierende { private String name, vorname, studiengang; private int matNr, semester; private.
Kapselung , toString , equals , Java API
Progwerkstatt JAVA Klasse, Objekte, Konstruktoren, Methoden
Objektorientierte Programmierung
Abstrakte Klassen HS Merseburg (FH) WS 06/07.
Ausnahmen HS Merseburg (FH) WS 06/07.
Java: Objektorientierte Programmierung
Java: Dynamische Datentypen
Indirekte Adressierung
Java: Referenzen und Zeichenketten
Java: Grundlagen der Objektorientierung
FH-Hof Fehlerbehandlung Richard Göbel. FH-Hof Konzept Fehler können mit dem Operator throw einer übergeordneten Funktion signalisiert werden. Parameter.
Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,
Konstruktoren.
Objekte und Arbeitsspeicher
Interface bzw. Schnittstelle anschaulich: Hüllenklasse
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 4 Vererbung Sommersemester 2003 Lars Bernard.
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 5 Polymorphismus Sommersemester 2003 Lars Bernard.
Programmieren mit JAVA
Programmieren mit JAVA
Vererbung Spezialisierung von Klassen in JAVA möglich durch
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
PKJ 2005/1 Stefan Dissmann Ausblick Es fehlen noch: Möglichkeiten zum Strukturieren größerer Programme Umgang mit variabler Zahl von Elementen Umgang mit.
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Bisher im Kurs erarbeitete Konzepte(1): Umgang mit einfachen Datentypen Umgang mit Feldern Umgang mit Referenzen.
PKJ 2005/1 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant Object.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste.
1 WS 2012 Software-Engineering II Aspektorientierung.
DVG Kommentare1 Kommentare. DVG Kommentare 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht.
DVG Interfaces. DVG mehrfache Vererbung 4 Mehrfache Vererbung ist die Ableitung einer Klassen von mehreren anderen Klassen. –farbigerPunkt.
Abstrakte Klassen, Interface
DVG Klassen und Objekte
DVG Einfache Klassen 1 Einfache Klassen. 2DVG Einfache KlassenStrukturen Beispiel: Personendaten bestehen aus String name String name.
EDV Parallelprogrammierung1 Parallelprogrammierung mit JAVA.
DVG Kommentare 1 Kommentare. 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht bis zum Ende der Zeile.
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
EPROG Tutorium Einheit 4 Klassen und Objekte. Wiederholung Schleifen do... while while for break/continue Strings String char Methoden für Strings Arrays.
Grundlagen der Programmierung
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
OOP-Begriffe Abstraktion Modellieren Klasse Objekt Attribute Methoden
Dynamische Datentypen
Variablenkonzept Klassisch, in Java Basistyp
Reinhard Stumptner Seminar Softwareentwicklung Dynamisches Laden und Binden in Java.
Objektorientierte Programmierung
EPROG Tutorium #5 Philipp Effenberger
Learning By Doing Ausnahmebehandlung Exceptions (Ausnahmebehandlung) Typische Fehlverhalten zur Laufzeit: s. Buch S. 287ff -Verwendung von null-Objekten.
Mittwoch Informatik II, 1. Teil
Programmiervorkurs WS 2014/15 Instanzmethoden
CuP - Java Achte Vorlesung Entspricht ungefähr Kapitel 4.1 des Skriptums Montag, 28. Oktober 2002.
Informatik I : Software höhere Programmiersprachen Java Klassen: hat Methoden (Funktionen) und Daten (Variablen) es kann mehrere Klassen geben nur eine.
Robuste Programme durch Ausnahmebehandlung
Java-Kurs Übung Besprechung der Hausaufgabe
Einführung in die Programmierung mit Java
Abstrakte Klassen und das Interface-Konzept
Objektorientierte Programmierung (OOP)
Java Programme nur ein bisschen objektorientiert.
Tutorium Software-Engineering SS14 Florian Manghofer.
„Was du ererbt von Deinen Vätern hast, erwirb es, um es zu besitzen.“
OOP II.
Implementieren von Klassen
 Präsentation transkript:

1 WS 2012 Software-Engineering II Einführung / Objektorientierung

2 WS 2012 This is a dummy text to make powerpoint think, the slide is landscape

3 WS 2012 Einführung »Objektorientierung »Aspektorientierung »Vorgehensmodelle »UML »Analyse- & Entwurfsmuster »Objektorientiertes Testen »Versionsverwaltung »Refactoring »Labor (Praktischer Teil)

4 WS 2012 Objektorientierung (OOP) Java ist auch eine Insel Christian Ullenboom Galileo Press 1478 Seiten ISBN: ( Deutsch)

5 WS 2012 Objektorientierung (OOP) »Programmierparadigma (Prinzip) »Ziel: Nachbildung der realen Welt in Programmiersprachen »Klassen sind abstrakte Beschreibungen von Daten und Aktionen »Objekte sind Instanzen von Klassen

6 WS 2012 Klassen und Objekte »Es können beliebig viele Instanzen von Klassen (also Objekte) erstellt werden »Der Zustand von Objekten wird durch Inhalte von Attributen (Variablen) bestimmt »Durch das Ausführen von Methoden (Funktionen) kann der Zustand der Attribute geändert werden

7 WS 2012 Beispiel class DHBWStudent { String name; String geburtsDatum; double note; void setName( String name ) { this.name = name; } void setNote( double note ) { this.note = note; } /* … */ } class DHBWDozent { String name; String geburtsDatum; void setName( String name ) { this.name = name; } void benote( BAStudent st ) { st.setNote( … ); } /* … */ }

8 WS 2012 Beispiel class DHBWStudent { String name; String geburtsDatum; double note; void setName( String name ) { this.name = name; } void setNote( double note ) { this.note = note; } /* … */ } class DHBWDozent { String name; String geburtsDatum; void setName( String name ) { this.name = name; } void benote( DHBWStudent st ) { st.setNote( … ); } /* … */ } gemeinsame Eigenschaften

9 WS 2012 Vererbung I class DHBWPerson { String name; String geburtsDatum; void setName( String name ) { this.name = name; } void setGeburtsdatum( String geburtsDatum ) { this.geburtsDatum = geburtsDatum; }

10 WS 2012 Vererbung II class DHBWStudent extends DHBWPerson { double note; void setNote( double note ) { this.note = note; } class DHBWDozent extends DHBWPerson { void benote( DHBWStudent st ) { double note = Math.Random() * 5; note++; st.setNote( note ); } class DHBWPerson { … void setName( String name ) { … } void setGeburtsdatum( String geburtsDatum ) { … } }

11 WS 2012 Packages »In vielen objektorientierten Programmiersprachen kann man Klassen in Gruppen, sogenannten Packages, organisieren »Ziele: »Strukturierung »Sichtbarkeitseinschränkung (durch Access Modifier) »Achtung: »In Java wird jede Klasse, die keinem Package zugewiesen wurde dem default package zugewiesen »Da dabei die Übersichtlichkeit im Projekt verloren geht, werden gute Package-Definitionen empfohlen

12 WS 2012 Access Modifiers »Man kann in Java Klassen, Methoden und Attributen die Access Modifiers public, protected oder private zuweisen: » public Alle Klassen » protected Sub-Klassen, selbes Package » [ohne] Alle Klassen des Packages » private Aktuelle Klasse

13 WS 2012 static »Mit dem Schlüsselwort static markierte Methoden und Attribute sind nicht an eine Instanz einer Klasse gebunden class DHBWDozent extends DHBWPerson { static double notenBereich[] = { 1, 6 }; // Verwendung eines Array für die Speicherung static void benote( DHBWStudent st ) { double note = Math.Random(); double spanne = DHBWDozent.notenBereich[1] – DHBWDozent.notenBereich[0]; note *= spanne; note += DHWBDozent.notenBereich[0]; st.setNote( note ); }

14 WS 2012 Exceptions (I) »Tritt in einem Programm eine Ausnahme ein, kann diese mit der catch-Anweisung abgefangen werden class Demo { public static void main( String[] args ) { try { // Datei öffnen o.ä. } catch( java.io.FileNotFoundException e ) { System.out.println( Fehler! ); }

15 WS 2012 Exceptions (II) »Exceptions können mit dem Befehl throw ausgelöst werden »Jede Exception muss von der Klasse java.lang.Throwable erben »Methoden, die Exceptions auslösen, müssen dies durch throws bekanntgeben »Hat eine Methode eine Exception in throws notiert, muss jede aufrufende Methode diese Exception mit try…catch behandeln »Dies macht es möglicht, dass in Java Fehler seltener zum Programmabsturz führen class Demo { void f() throws MyException { throw new MyException(); } void x() { this.f(); // nicht erlaubt ohne // try…catch } class MyException extends Exception { // … }

16 WS 2012 Exceptions (III) »Fehler werden generell mit Exceptions signalisiert »Bei normalen Operationen kann es auch zu Fehlerfällen kommen »NullPointerException (Bei Zugriff auf Null-Variable) »ArithmeticException (Bsp.: Division durch 0) »ClassCastException (Typecast auf falschen Klassentyp) »IndexOutOfBoundsException (Fehlerhafter Array-Zugriff) »Damit man nicht um jede Zeile try..catch schreiben muss: »Unchecked Exceptions »Müssen nicht mit throws deklariert werden »Erben von java.lang.RuntimeException »Beispiele: Siehe oben »Checked Exceptions »Alle anderen Exceptions »Mit try..catch abfangen oder throws weiter werfen!

17 WS 2012 Speicherverwaltung »Die Virtual Machine speichert Variableninhalte an zwei verschiedenen Stellen: »Stack »Die Menge des allokierten Speichers kann nicht geändert werden »Speichert primitive Datentypen »Funktioniert als Stapel und speichert die Variablen aller Methoden in Reihenfolge »Heap »Kann Elemente, die ihre Größe ändern, speichern »Objekte werden hier abgespeichert »Auf die Stelle des Objektes notiert der Stack eine Referenz... int x = 12; boolean y = false; String z = Hallo;... Stack Heap FF 0.. I: B: FALSE R: Hallo-String-Objekt

18 WS 2012 Method Calls »Bei einem Methodenaufruf werden die Werte auf dem Stack der aufrufenden Methode übergeben »Dadurch erhalten Methoden bei »primitiven Datentypen den tatsächlichen Wert »Objekten eine Referenz auf das Objekt »Nur wenn die aufgerufene Methode eine Referenz erhält hat sie Zugriff auf die ursprüngliche Variable und kann deren Inhalte verändern void method1() { int x = 12; String y = Y; method2( x, y ); } Stack Heap FF 0.. I: R: Y-String-Objekt I: R: m1{ m2{

19 WS 2012 Garbage Collector »Java ist Managed Code »Die Speicherverwaltung wird vom System automatisch übernommen »Vgl. C++: Jede auf dem Heap reservierte Speicherstelle muss explizit wieder freigegeben werden »Bei Java erledigt dies der Garbage Collector »Stellen im Heap, auf die vom Stack aus nicht mehr referenziert werden, können entfernt werden »Der Garbage Collector läuft regelmäßig im Hintergrund

20 WS 2012 Speicherüberlauf »Der Heap ist begrenzt: »Natürliche Grenze durch die Menge an Arbeitsspeicher »Künstliche Grenze der Virtual Machine zum Schutz anderer Programme »Wenn der Heap voll ist, wird der Garbage Collector explizit aktiviert »Reicht die gewonnene Speichermenge nicht aus, schlägt die aktuelle Anweisung mit einem OutOfMemoryError fehl

21 WS 2012 Konstruktor/Destruktor »Konstruktoren/Destruktoren sind Methoden, die beim Erzeugen/Zerstören eines Objektes aufgerufen werden »Um einen Konstruktor zu definieren, implementiert man in Java eine Methode, die den Namen der Klasse trägt »Eigentliche Destruktoren gibt es in Java nicht, es wird jedoch die Methode finalize() aufgerufen, wenn ein Objekt vom Garbage Collector zerstört wird »Performance-Einbußen »Aufruf nicht garantiert class BADozent extends BAPerson { BADozent( String name ) { /* * Diese Methode wird aufgerufen, sobald * eine neue Instanz dieser Klasse erzeugt wird. */ }

22 WS 2012 Polymorphismus class DHBWVerwaltung { void addPerson( DHBWPerson person ) {…} void bezahleGehalt( DHBWDozent dozent ) {…} } DHBWVerwaltung verwaltung = new DHBWVerwaltung(); DHBWDozent dozent = new DHBWDozent( ); DHBWStudent student = new DHBWStudent(); verwaltung.addPerson( student ); // DHBWStudent: Subklasse von DHBWPerson verwaltung.addPerson( dozent ); // DHBWDozent: Subklasse von DHBWPerson verwaltung.bezahleGehalt( dozent ); // DHBWDozent wird erwartet… verwaltung.bezahleGehalt( student ); // nicht erlaubt - DHBWStudent ist // keine Subklasse von DHBWDozent Die Eigenschaft, dass man Subklassen an jeder Stelle statt ihrer Superklassen einsetzen darf, wird Polymorphismus genannt.

23 WS 2012 Overriding »Als overriding bezeichnet man das Überschreiben von vererbten Methoden »Methoden, die final markiert sind, können nicht überschrieben werden class DHBWDozent extends DHBWPerson { public void setName( String name ) { super.setName([Dozent] + name); } class DHBWPerson { private String name; public void setName( String name ) { this.name = name; } … }

24 WS 2012 Overloading »Mehrere Methoden mit demselben Namen können in Java gleichzeitig deklariert werden: »Solange sie unterschiedliche Übergabeparameter besitzen »Rückgabewerte sind hier nicht ausschlaggebend class DHBWDozent extends DHBWPerson { void benote( DHBWStudent st ) { this.benote( st, true ); } void benote( DHBWStudent st, boolean fair ) { float max = 6; float min = fair ? 1 : 4; st.setNote( ( Math.Random() * (max-min) ) + min ); }

25 WS 2012 Abstrakte Methoden »Abstrakte Methoden enthalten keine Implementierung »Klassen, die abstrakte Methoden beinhalten, müssen ebenfalls als abstrakt markiert werden »Abstrakte Klassen können nicht instanziert werden »Zweck: Subklassen von abstrakten Klassen implementieren die abstrakten Methoden und bilden so eine instanzierbare Klasse abstract class DHBWPerson { abstract void inVorlesungSein(); } class DHBWStudent extends DHBWPerson { void inVorlesungSein() { System.out.println( Zuhören… ); } class DHBWDozent extends DHBWPerson { void inVorlesungSein() { System.out.println( Erzählen… ); }

26 WS 2012 Mehrfachvererbung I abstract class DHBWPerson { abstract void inVorlesungSein(); public void setName( String name ) {…} } abstract class PartyPerson { // jeder feiert auf seine Art abstract void feiern(); } class Schueler extends PartyPerson { void feiern() { System.out.println( Dance till 12… ); }

27 WS 2012 Mehrfachvererbung II abstract class DHBWPerson { abstract void inVorlesungSein(); public void setName( String name ) {…} } abstract class PartyPerson { // jeder feiert auf seine Art abstract void feiern(); } class DHBWStudent extends DHBWPerson, PartyPerson { void inVorlesungSein() { System.out.println( Zuhören… ); } void feiern() { System.out.println( Dance all night… ); } class Schueler extends PartyPerson { void feiern() { System.out.println( Dance till 12… ); }

28 WS 2012 Mehrfachvererbung III »Java verbietet Mehrfachvererbung »Grund: »Zwei Basisklassen implementieren eine gleich benannte Methode »Überschreibt die Subklasse die Methode der Superklassen nicht, ist unklar, welche Methode verwendet werden soll »Alternative: Interfaces »Alle Methoden sind automatisch abstrakt »Alle Attribute sind static und final

29 WS 2012 Interfaces abstract class DHBWPerson { abstract void inVorlesungSein(); public void setName( String name ) {…} } interface PartyPerson { // jeder feiert auf seine Art void feiern(); } class DHBWStudent extends DHBWPerson implements PartyPerson { void inVorlesungSein() { System.out.println( Zuhören… ); } void feiern() { System.out.println( Dance all the night… ); } class Schueler implements PartyPerson { void feiern() { System.out.println( Dance till 12… ); }

30 WS 2012 Generische Programmierung »Bestandteil von Java seit 5.0 »Dient dazu, Algorithmen möglichst unabhängig von den Datenstrukturen zu implementieren »Ziel: Wieder verwendbare Bibliotheken »Typsicherheit, da keine Typecasts

31 WS 2012 java.util.Vector in Java 1.4 »Speichert eine Menge von Elementen »Wichtigste Methoden »void addElement( Object element ) »void removeElement( Object element ) »Object elementAt( int position ) »int size()

32 WS 2012 java.util.Vector in Java 1.4 »Der Return-Typ von elementAt(int) ist Object »Damit Klassenspezifische Methoden aufgerufen werden können, ist ein Typecast nötig »Wird aus Versehen ein falsches Element hinzugefügt, entsteht dann eine ClassCastException void doSomething() { Vector kurs = new Vector(); kurs.addElement( new DHBWStudent( Max Mustermann ) ); kurs.addElement( new DHBWStudent( Klaus Müller ) ); kurs.addElement( new DHBWDozent( Timo Holzherr ) ); Object element = kurs.elementAt( 2 ); DHBWStudent stud = (DHBWStudent) element; stud.inVorlesungSein(); } Laufzeitfehler!!

33 WS 2012 java.util.Vector in Java 5.0 »Signatur der vorherigen Methoden »void addElement( element ) »void removeElement( element ) » elementAt( int position ) »int size() » steht für einen generischen Typ »Generischer Typparameter »Beim Instanzieren des Vectors wird der Typ angegeben

34 WS 2012 java.util.Vector in Java 5.0 »Der Return-Typ von elementAt(int) ist, also DHBWStudent »Damit klassenspezifische Methoden aufgerufen werden können, ist kein Typecast nötig »Es kann kein falsches Element hinzugefügt werden, dies würde in einem Compile-Error führen »Bei Java 1.4 würde das Programm kompilieren aber mit einer Exception abstürzen void doSomething() { Vector kurs = new Vector (); kurs.addElement( new DHBWStudent( Max Mustermann ) ); kurs.addElement( new DHBWStudent( Klaus Müller ) ); kurs.addElement( new DHBWDozent( Timo Holzherr ) ); DHBWStudent stud = kurs.elementAt( 0 ); stud.inVorlesungSein(); } Compile-Error!!

35 WS 2012 Deklaration generischer Klassen »Durch die Angabe einer Typvariable in der Klasse wird eine Klasse generisch »Diese Typvariable kann jederzeit an Stelle eines Typs verwendet werden class MyClass { public E forceNotNull( E element ) throws Exception { if( element == null ) { throw new Exception( Element ist null ); } return element; }

36 WS 2012 Mehrere generische Typparameter »Es können mehrere generische Typparameter eingeführt werden »Bsp: java.util.HashMap »K = Hash-Key »V = Hash-Value class MyHashMap { … }

37 WS 2012 Generics und Polymorphismus »Herkömmlicher Polymorphismus kann natürlich auch bei generischen Klassen verwendet werden »Es können Subklassen der Parameterklasse eingesetzt werden DHBWStudent student = new DHBWStudent( Max Mustermann ); DHBWDozent dozent = new DHBWDozent( Timo Holzherr ); Vector kurs = new Vector (); kurs.addElement( student ); Kurs.addElement( dozent );

38 WS 2012 Grenzen des Polymorphismus »Polymorphismus gilt jedoch nicht für den generischen Typparameter Vector studs = new Vector (); Vector persons = studs; »Ist das Objekt Vector einmal initialisiert, erwartet es Objekte vom Typ DHBWStudent oder von Subklassen dessen »Könnte man es einer Variable vom Typ Vector zuweisen, wäre es nun bspw. möglich, Elemente vom Typ DHBWDozent in den Vector zu legen, obwohl er im Objekt studs als Vector verwendet wird Nicht erlaubt

39 WS 2012 Wildcards »Mithilfe von Wildcards ist es möglich, den Typ frei zu lassen »Der generische Typparameter der Klasse wird bei Return-Typen wie Object behandelt »Sind generische Typen in Methodenparametern enthalten, so sind diese Methoden nicht mehr verwendbar Vector studs = new Vector (); Vector persons = studs; Object firstPerson = persons.elementAt( 0 ); persons.addElement( A string is an object ); Nicht erlaubt

40 WS 2012 Upper Bound Wildcard »Wildcards ohne Typ sind oft zu unspezifisch »Der Return-Typ muss wie Object behandelt werden »Wieder ist ein Type-Cast nötig »Mithilfe einer Upper Bound Wildcard kann angegeben werden, von welchem Typ der generische Parameter mindestens sein muss Vector studs = new Vector (); Vector persons = studs;

41 WS 2012 Upper Bound Wildcard »Bei Return-Typen wird dann der generische Typ-Parameter ( ) durch den Typ der Upper Bound Wildcard ersetzt »Sind generische Typen in Methodenparametern enthalten, so sind auch bei Upper Bound Wildcards diese Methoden nicht mehr verwendbar Vector studs = new Vector (); Vector persons = studs; DHBWPerson firstPerson = persons.elementAt( 0 ); persons.addElement( new DHBWDozent( Timo Holzherr ) ); Nicht erlaubt

42 WS »Zusatzinformationen für Klassen und Methoden »Erlaubt Einbinden von Metadaten in den Quellcode »Bsp. void toString(){...} »Diese Methode überschreibt eine Methode der Superklasse. Sollte dies nicht der Fall sein, gibt der Compiler einen Fehler aus class MyJLabel {... } »Kennzeichnet Klassen oder Methoden, dass sie nicht mehr verwendet werden sollen »Wird oft von Frameworks verwendet »Beispiele: »AspectJ: *.*(*))) nullable=false, length=512)