Objektorientierung verstehen



Ähnliche Dokumente
Programmieren in Java

Programmieren in Java

Unterprogramme. AnPr. Wiederholungen im Code werden vermieden. Programme werden leichter lesbar. Die Entwicklung und der Test werden vereinfacht.

Programmieren in Java

Einstieg in die Informatik mit Java

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

Begriffe 1 (Wiederholung)

Implementieren von Klassen

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 23.5.

Vererbung, Polymorphie

Programmierung Nachklausurtutorium

Repetitorium Informatik (Java)

Einstieg in die Informatik mit Java

Algorithmen und Datenstrukturen

3 Objektorientierte Konzepte in Java

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Institut für Programmierung und Reaktive Systeme. Java 7. Markus Reschke

Vererbung P rogram m ieren 2 F örster/r iedham m er K apitel 11: V ererbung 1

C++ - Objektorientierte Programmierung Konstruktoren und Destruktoren

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Gerüstbeispiel. Vererbungshierarchie: Typ 0

Fragen zur OOP in Java

Was du ererbt von Deinen Vätern hast, erwirb es, um es zu besitzen. J. W. v. Goethe.

Anwendungsentwicklung mit Java. Grundlagen der OOP, Vererbung, Schnittstellen, Polymorphie

Einstieg in die Informatik mit Java

Kapitel 13. Abstrakte Methoden und Interfaces. Fachgebiet Knowledge Engineering Prof. Dr. Johannes Fürnkranz

C++ - Objektorientierte Programmierung Vererbung

Java Vererbung. Inhalt

Vorkurs Informatik WiSe 15/16

Grundzüge der Programmierung. Wiederverwendung VERERBUNG

Java für Bauingenieure

Propädeutikum Programmierung in der Bioinformatik

Programmierkurs C++ Abstrakte Klassen und Methoden

Objektorientierte Programmierung

Programmiertechnik Objektorientierung

Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer. Programmiertechnik Objektorientierung

Methoden und Klassen. Silke Trißl Wissensmanagement in der Bioinformatik

Übung zur Vorlesung Wissenschaftliches Rechnen Sommersemester 2012 Auffrischung zur Programmierung in C++, 2. Teil

Umsetzung einer Klassenkarte in einer Programmiersprache

Tafelübung 07 Algorithmen und Datenstrukturen

Javakurs für Anfänger

Einstieg in die Informatik mit Java

Schlussendlich geben wir die Listen aus. Es kommt zu folgender Ausgabe:

7. Übung Informatik II - Objektorientierte Programmierung

Objektorientierte Programmierung und Klassen

Objektorientierte Programmierung Studiengang Medieninformatik

OOP und Angewandte Mathematik. Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik

C++ - Objektorientierte Programmierung Polymorphie

Vererbung. Generalisierung und Spezialisierung Vererbung und Polymorphismus

7. Objektorientierung. Informatik II für Verkehrsingenieure

Silke Trißl, Prof. Ulf Leser Wissensmanagement in der Bioinformatik. Jede Applikation braucht eine Klasse mit einer main-methode

6. Globalübung (zu Übungsblatt 8)

Objekte und Klassen. INE2 M. Thaler, Office TG ZHAW, M. Thaler, K. Rege, G. Burkert, E.

Beispiele für Ausdrücke. Der imperative Kern. Der imperative Kern. Imperativer Kern - Kontrollstrukturen. Deklarationen mit Initialisierung

9. Vererbung und Polymorphie. Informatik Vererbung und Polymorphie 1

Algorithmen und Datenstrukturen 07

Programmieren in Java

Abstrakte Klassen und Interfaces

Java Einführung Vererbung und Polymorphie. Kapitel 13

Objektorientierte Programmierung Studiengang Medieninformatik

Inhaltsüberblick. I. Grundbegriffe - Objekte und Klassen. Organisatorisches. I. Grundbegriffe - Objektorientierte Konzepte

Grundelemente objektorientierter Sprachen (1)

Grundelemente objektorientierter Sprachen (1)

C++ - Objektorientierte Programmierung Konstante und statische Elemente

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Innere Klassen. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java

Objektorientierte Programmierung III

PYTHON. 06 Objektorientierung II

Silke Trißl Wissensmanagement in der Bioinformatik. Objektorientierte Programmierung (OOP) Vorstellung wie in der realen Welt: Farbe Hubraum Tank...

Tag 7 Repetitorium Informatik (Java)

Teil 2: OOP und JAVA (Vorlesung 11)

3 Objektorientierte Konzepte in Java

JAVA 05: Objektorientierte Konzepte

Objektorientierte Programmierung OOP

Grundelemente objektorientierter Sprachen (1)

Einführung in die Programmiersprache Java II

HSR Rapperswil 2001 Markus Rigling. Programmieren: Vererbung. 1 Variante 2

Praxis der Programmierung

Vererbung und Polymorphie

Objekte. Theorieteil. Inhaltsverzeichnis. Begriffe. Programmieren mit Java Modul 5. 1 Modulübersicht 3

Javakurs für Anfänger

Einstieg in die Informatik mit Java

ÜBUNGEN ZUR OBJEKTORIENTIERTEN MODELLIERUNG

Überblick. Überblick. Abstrakte Klassen - rein virtuelle Funktionen Beispiele

Vorlesung Datenstrukturen

Vererbung, Polymorphismus

5 Vererbung. Subklassen, Superklassen, Pakete Zugriffsrechte

Programmierkurs Java

Programmieren. Warum Objektorientierung? Objektorientierung. Beispiele für Busobjekte der realen Welt

Programmieren in Java

Vorlesung Programmieren. Bisher: Klassen und Objekte. Was ist mit ähnlichen Klassen? Vererbung und Polymorphismus

Teil 2: Weitere Aspekte der Objektorientierung

14. Java Klassen. Klassen (Java) vs. Records (Pascal) Klassen - Konzeptuell. Klassen - Technisch

14. Java Klassen. Klassen, Typen, Objekte, Deklaration, Instanzierung, Konstruktoren, statische Felder und Methoden, Datenkapselung

Probeklausur: Programmierung WS04/05

1 Abstrakte Klassen, finale Klassen und Interfaces

Einführung in die Programmiersprache Java II

Transkript:

Name Klasse Datum 1 Das Klassenkonzept in der realen Welt Im realen Leben wenden wir den Gedanken der Klassen oder besser der Klassifizierung unbewusst an. Wir wissen, dass ein Hund und ein Vogel Tiere sind. Tiere sind wiederum genau wie Pflanzen Lebewesen; wir haben also eine Klasse als Subklasse einer anderen identifiziert. Alle Elemente einer Klasse zeichnen sich durch gemeinsame Eigenschaften und Fähigkeiten aus. So sind Tiere in der Lage sich aus eigener Kraft fortzubewegen. Alle Lebewesen werden geboren und sterben, um nur einige Gemeinsamkeiten zu nennen. Grafisch können diese Beziehungen in verschiedenster Weise dargestellt werden im IT Bereich wird dies üblicherweise mit UML (Unified Modeling Language) durchgeführt. Hier wird ein Pfeil auf die darüber liegende Klasse gezeichnet; man spricht von einer Generalisierung. Pflanze Standort Lebewesen Geburtsdatum Gewicht In der Programmierung wurde dieses Konzept als sinnvoll erkannt und in die Designs von neuen Objektorientierten Programmiersprachen einbezogen. Moderne höhere Programmiersprachen bedienen sich in aller Regel am Konzept der Objektorientierung, so wie Java, C++ und C#. Die Idee, die dahinter steckt ist, Programmstrukturen zu schaffen, welche Eigenschaften und Fähigkeiten aufweisen man spricht hier von Attributen und Methoden. Diese zeichnen jeweils eine Klasse (einer Programmstruktur) aus. Wir werden im Nachgang noch sehen, was dies im Einzelnen bedeutet. Hund Anzahl Zähne Tier Bewegungsgeschwindigk. Vogel Schnabelgröße Geo3DObjekt Höhe Kreis Radius Geometrieobjekt Farbe Fläche Geo2DObjekt Umfang Dreieck Länge a Länge b Länge c Länge Breite Viereck Für die Einführung dieses Konzeptes in eine Programmiersprache, bedienen wir uns der Geometrie. Ausgehend vom Geometrieobjekt hangeln wir uns immer tiefer in die einzelnen möglichen Klassen: Für die weiteren Übungen werden wir uns an diesem Konzept orientieren. Im Laufe der nächsten Schritte werden noch weitere Eigenschaften und auch Fähigkeiten der einzelnen Klassen identifiziert und umgesetzt. Bis dahin bleiben wir jedoch bei dem hier gezeigten Schema. ANPR_01_Objektorientierung_v01.docx Seite 1

2 Das Klassenkonzept bei Programmiersprachen 2.1 Allgemeines Programme sind im Regelfall dazu gedacht, Daten auf verschiedenste Art und Weise einzulesen, zu verarbeiten und auszugeben. Bis jetzt wurde dies in einfachen (Unter-) Programmen realisiert, ohne auf Klassen oder ähnliche Konzepte einzugehen. Diese Art der Programmierung nennt man prozedural, da hier die gesamte Ausführung in Prozeduren umgesetzt wurde. Der Objektorientierte Gedanke besagt nun, dass nicht mehr Unterprogramme die Daten verarbeiten, sondern die Daten selbst bringen Methoden mit, welche für die Anpassung von Datenwerten herangezogen werden. Um dies zu verdeutlichen, soll folgendes überlegt werden. Gesetz dem Fall, dass man programmiertechnisch ein Konstrukt geschaffen hat nennen wir es Kreis welches als Eigenschaft den Radius besitzt. Der Programmierer möchte nun eine Funktionalität umsetzen, die Fläche auszurechnen. Er hat nun die Möglichkeit eine Funktion zu schreiben, welche den Kreis als Parameter aufnimmt, den Radius erfragt und die Fläche berechnet: Wie im rechten Struktogramm gezeigt, muss das berechnende Programm zuerst die Eigenschaften des Objektes kennen, bevor es die Berechnung durchführen kann. Jedes geometrische Objekt hat eine eigene Formel für die Flächenberechnung. Sehr viel praktischer wäre es nun, dass das Objekt selbst die Berechnungsformel mitbringt. Das Struktogramm würde somit wie folgt aussehen: Das Objekt ist selbstständig in der Lage, die Flächenberechnung durchzuführen. Der Nutzer dieser Objekte muss sich nicht mehr um die einzelnen Berechnungsformeln kümmern, sondern er holt sich lediglich die Eigenschaft ab, bzw. lässt sie berechnen. Seite 2

Objektorientierung verstehen 2.2 Klassendefinitionen in Java Die Frage ist nun, wie das in Java umgesetzt wird. Folgender Code ist ein Beispiel für die Deklaration einer Klasse: public class Geometrieobjekt public class Geometrieobjekt Sichtbarkeit (siehe nächstes Kapitel) Hinweis, dass eine Klasse deklariert wird Name der Klasse Programmierstilhinweis 1 : Namensgebung Wie bei Variablen auch, sollen die Klassen sprechende Namen erhalten. Es ist üblich Klassennamen mit einem Großbuchstaben beginnen zu lassen. Die oben gezeigte Klasse besitzt noch keine Eigenschaften und keine Methoden. Um dies nun zu ermöglichen, wird die Fläche und Farbe als Eigenschaft implementiert und die Methoden getcolor() und setcolor() vorgesehen: public class Geometrieobjekt protected double dflaeche; private int ifarbe; public void setfarbe(int ineuefarbe) this.ifarbe = ineuefarbe; public int getfarbe() return this.ifarbe; public, private, protected dflaeche, ifarbe setfarbe, getfarbe this. Programmierstilhinweis: Sichtbarkeit und Getter/Setter Methoden Sichtbarkeit (siehe nächstes Kapitel) Klassenvariablen Methoden der Klasse Referenz auf Klassenvariable, wobei this. immer für das aktuelle Objekt steht. Auf die Objektinstanziierung wird weiter unten eingegangen. Bei der Deklaration von Eigenschaften und Methoden ist immer die Sichtbarkeit anzugeben. Hier ist darauf zu achten, dass nur diejenigen Eigenschaften und Methoden sichtbar gemacht werden, welche auch vom außenstehenden Nutzer zu verwenden sind. Auf die Sichtbarkeit wird unten näher eingegangen. Im Regelfall sollten Klassenvariablen private sein und nur über Getter/Setter nach außen geführt werden. Die Klasse hat nun zwei Eigenschaften und zwei Methoden. Wichtig zu verstehen ist nun, dass im Regelfall 2 eine Klasse nur eine Definition, ähnlich eines Bauplanes ist. Um nun die Methoden einer Klasse nutzen zu 1 Diese sind keine Industrieweite Normung. Im Rahmen des Unterrichts wird hierauf Wert gelegt, in Ihrem Betrieb werden wahrscheinlich nicht die gleichen, aber ähnliche Regelungen gelten. 2 Bei statischen Methoden/Attributen gilt dies nicht Seite 3

können, muss ein Objekt dieser Klasse instanziiert werden. In einem Testprogramm wird nun das Objekt instanziiert und das Verhalten des Objektes der Klasse geprüft: public class GeoTest public static void main(string[] args) Geometrieobjekt meingeoobjekt = new Geometrieobjekt(); meingeoobjekt.setfarbe(283214); System.out.println(meinGeoobjekt.getFarbe()); main Geometrieobjekt meingeoobjekt new Geometrieobjekt() Einstiegspunkt für Virtual Machine Klassentyp für folgende Variable Variable für Objekt der Klasse Geometrieobjekt Schlüsselwort für die Instanziierung eines Objektes (Standard)Konstruktor der Klasse Geometrieobjekt. Das obige Beispiel zeigt nun, dass innerhalb der Main Methode ein Objekt der Klasse Geometrieobjekt deklariert und anschließend instanziiert wird. Mittels des Punkt-Operators kann nun auf die Eigenschaften und Methoden der Klasse zugegriffen werden, welche als public deklariert wurden. Zugriff auf private Eigenschaften und Methoden ist an dieser Stelle nicht möglich. 2.3 Sichtbarkeitskennungen / Zugriffsebenen Das Schlüsselwort public ist seit dem ersten HelloWorld Programm ein Begriff, wenngleich die Hintergründe dieses Schlüsselwortes bis dato nie eine Rolle gespielt haben. An dieser Stelle soll die Bedeutung der einzelnen Möglichkeiten nun kurz dargestellt werden: Schlüsselwort: private protected public Bedeutung: Die Methode/Eigenschaft kann nur innerhalb der Klassendefinition angesprochen werden. Die Methode/Eigenschaft kann nur innerhalb der Klassendefinition, oder einer vererbten Klassendefinition angesprochen werden. Die Methode/Eigenschaft kann überall angesprochen werden. Somit kann also gesteuert werden, ob ein Programm, welches die Klasse instanziiert, die Methoden verwenden kann oder nicht. Man hat somit die Möglichkeit ein definiertes Interface an den Programmierer zu übergeben, welcher die Klasse nutzen möchte (daher auch der Name API Application Programming Interface). Es zeugt von gutem Programmierstil, wenn man Klasseneigenschaften grundsätzlich als privat oder protected deklariert und die Zugriffe von außen ausschließlich über Getter- und Setter-Methoden realisiert, wie es bei der Klasseneigenschaft ifarbe realisiert wurde. Der Vorteil von dieser Methodik ist, dass man vor allem beim Setzen eines Wertes über eine Setter-Methode diese bspw. mit Validitätsprüfungen versehen kann (bspw. wenn eine Gradzahl von 380 angegeben wird, kann dies auf einen Wert zwischen 0 und kleiner 360 korrigiert werden). Ein weiteres, wichtiges Schlüsselwort ist static. Wie oben geschildert, sind die Eigenschaften und Methoden einer Klasse nur dann nutzbar, wenn auch ein Objekt instanziiert wurde. Es gibt jedoch Situationen, in denen man eine Funktionalität nutzen möchte, ohne ein Objekt zu instanziieren. Dies wurde beispielsweise bei Integer.parseInt() benötigt. Man kann die Methode parseint() der Klasse Integer nutzen, ohne ein Objekt der Klasse Integer zu instanziieren. Seite 4

Objektorientierung verstehen Dieses Verhalten kann mit der Eigenschaft static realisiert werden: public class Geometrieobjekt public static String sversion = "1.0.0"; public class GeoTest public static void main(string[] args) System.out.println(Geometrieobjekt.sVersion); static Zugriffsmöglichkeit via Klasse Üblicherweise sind Klasseneigenschaften, welche als static implementiert wurden als konstant definiert (Schlüsselwort final), da Klassen im Regelfall intern nicht verändert werden sollen. 2.4 Vererbung von Eigenschaften und Methoden Klassen haben sich unter anderem durch gemeinsame Eigenschaften ihrer Subklassen definiert. Um dies programmtechnisch zu realisieren, wurde der Mechanismus der Vererbung geschaffen. Wir wollen nun ein 2DObjekt erzeugen, welches jedoch Eigenschaften vom Geometrieobjekt übernimmt: public class Geo2DObjekt extends Geometrieobjekt private double dumfang; public void setdumfang(double dumfang) this.dumfang = dumfang; public double getdumfang() return dumfang; public boolean flaechegroesserals(double dvergleichsflaeche) return (super.dflaeche > dvergleichsflaeche); extends super. Schlüsselwort indiziert, dass die Klasse die Eigenschaften einer Superklasse erbt. Zugriff auf eine Variable der Superklasse, welche die Eigenschaften vererbt. Dies ist im Regelfall nur dann notwendig, wenn innerhalb der Klasse eine Variable deklariert wurde, welche den gleichen Namen hat, wie die der Superklasse. In dem genannten Beispiel wäre ein gleichbedeutender Code: return (dflaeche > dvergleichsflaeche); bzw.: return (this.dflaeche > dvergleichsflaeche); Sämtliche public und protected Eigenschaften und Methoden der Klasse Geometrieobjekt sind nur auf die Klasse Geo2DObjekt übergegangen. Seite 5

2.5 Überschreiben von Methoden Es kommt mitunter vor, dass in der Superklasse Methoden implementiert wurden, welche in der abgeleiteten Klasse in der Form nicht zu einem richtigen Ergebnis führen würden. Solche Methoden können in der abgeleiteten Klasse überschrieben werden. Folgendes Beispiel soll dies verdeutlichen. Gehen wir davon aus, dass in der Klasse Geometrieobjekt folgende Methode implementiert wurde: public double berechneflaecheneu() return this.dflaeche; Danach wurde von der Klasse Geo2DObjekt eine weitere Klasse vererbt, namens Rechteck. Diese Klasse, soll in der Lage sein, die Fläche neu zu berechnen und zurückzugeben: public class Rechteck extends Geo2DObjekt private double dlaenge = 2; private double dbreite = 3; public double berechneflaecheneu() this.dflaeche = this.dlaenge * this.dbreite; return this.dflaeche; Wenn nun ein Rechteck Objekt instanziiert wird, so wird beim Aufruf der Methode berechneflaecheneu() die überschriebene Methode ausgeführt und nicht die ursprüngliche der Superklasse. Mehr noch wenn nun ein Rechteck Objekt in einer Variable vom Typ Geometrieobjekt abgelegt wird, so würde bei Aufruf der Methode berechneflaecheneu() ebenfalls die überschriebene Methode ausgeführt werden: public class GeoTest public static void main(string[] args) Geometrieobjekt meinrechteck = new Rechteck(); System.out.println(meinRechteck.berechneFlaecheNeu()); Dieses Verhalten ermöglicht es nun, jedem Geometrieobjekt eine individuelle Neuberechnung der Fläche zu implementieren, diese aber einheitlich über Variablen des Typs Geometrieobjekt aufzurufen. Es können also beliebige geometrische Objekte erzeugt werden (Kreis, Rechteck, Dreieck ), bei denen alle eine individuelle Methode berechneflaecheneu() implementiert wurde. Egal welche Instanz erzeugt wurde (Kreis, Rechteck, Dreieck usw.) und in einer Variable mit dem Typ Geometrieobjekt gespeichert wurde, der Aufruf variablenname.berechneflaecheneu() wird immer die Implementierung des richtigen Objektes aufrufen. In dem Oben geschilderten Fall dass eine Methode in der Elternklasse leer erzeugt wird und die sinnvolle Implementierung erst in den abgeleiteten Klassen erfolgt spricht man von abstrakten Methoden. Abstrakt steht also dafür, dass die Implementierung nur eine Art Platzhalter darstellt, welche erst bei den Kindklassen mit Funktionen versehen werden. Darüber hinaus kommt es jedoch durchaus vor, dass die Elternklassen eine funktionierende Implementierung aufweisen, welche für die abgeleiteten Klassen keinen Sinn ergeben und dort somit neu erstellt werden. Seite 6

Objektorientierung verstehen 2.6 Überladen von Methoden Unter Überladung versteht man, dass ein Methodenname mehrfach mit unterschiedlicher Signatur vorkommt - also mit unterschiedlichen Parametern aufgerufen wird. Hier ein Beispiel: public class Rechteck extends Geo2DObjekt private double dlaenge = 2; private double dbreite = 3; public double berechneflaecheneu() this.dflaeche = this.dlaenge * this.dbreite; return this.dflaeche; public void setflaeche(double dflaeche) this.dflaeche = dflaeche; public void setflaeche() this.berechneflaecheneu(); Im Beispiel wird die Methode setflaeche zwei Mal umgesetzt, einmal mit dem Parameter dflaeche und einmal ganz ohne Parameter. Je nachdem welche Signatur beim Aufruf verwendet wird, führt die Virtual Machine die eine, oder andere Methode aus. Die Signatur wird somit bestimmt durch die Anzahl und den Datentypen der Übergabeparameter. 2.7 Konstruktoren Wie in den obigen Beispielen dargestellt, werden Objekte mittels des Schlüsselworts new und einem Konstruktor instanziiert. Der Standardkonstruktor, welcher von Java immer akzeptiert wird, ist gleichnamig mit der Klasse und eine sich öffnenden und schließenden Klammer: new Geometrieobjekt(); Dieser kann jedoch auch überschrieben werden: public Geometrieobjekt() this.ifarbe = 0; Insofern können eventuelle Initialisierungen vorgenommen werden. Auch kann ein Konstruktor überladen werden, indem bspw. ein Übergabeparameter vorgesehen wird: public Geometrieobjekt(int ifarbe) this.ifarbe = ifarbe; 2.8 Destruktoren In manchen objektorientierten Programmiersprachen (bspw. C++) gibt es sogenannte Destruktoren. Bei Aufruf dieser werden Abschlussarbeiten durchgeführt und anschließend alle Ressourcen des Objektes freigegeben. In Java gibt es dies nicht, da die Ressourcenfreigabe über den Garbage Collector automatisch erfolgt, wenn keine Referenz mehr auf das Objekt existiert. Seite 7

3 Lizenz Diese(s) Werk bzw. Inhalt von Maik Aicher (www.codeconcert.de) steht unter einer Creative Commons Namensnennung - Nicht-kommerziell - Weitergabe unter gleichen Bedingungen 3.0 Unported Lizenz. Seite 8