Programmieren I Überblick „Objektorientierung“ Heusch 12 Ratz 7 Institut für Angewandte Informatik KIT – Die Forschungsuniversität in der Helmholtz-Gemeinschaft www.kit.edu Objektorientierte Softwarenentwicklung Grundlegendes Konzept der Objektorientierten Softwareentwicklung: Ein Programm wird als eine Ansammlung diskreter Objekte betrachten. Diese vereinen sowohl Daten (Variablenwerten) als auch Verhalten (Operationen) in sich. Dieses Konzept unterscheidet sich von der konventionellen Programmierung, bei der Software als eine Ansammlung von Prozeduren betrachtet wird. Zentrale Eigenschaften des objektorientierten Ansatzes: Klassifikation Identität Kapselung Vererbung Polymorphismus (deutsch: „Vielgestaltigkeit“) 2 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Eigenschaften von Objekten: Klassifikation (1) Objekte der gleichen Art, d.h. mit den gleichen Variablen (Daten) und den gleichen Operationen, werden zu Objekten einer Klasse gruppiert. Die Klasse selbst ist eine Abstraktion, welche die Variablen und Operationen der Gattung von Objekten beschreibt. Die Objekte werden als Instanz ihrer Klasse bezeichnet. Jede Instanz besitzt eigene Werte für ihre Variablen, während die Variablennamen und Operationen für alle Instanzen der Klasse gleich sind. Die Definition einer Klasse erfolgt im Hinblick auf eine Anwendung. Die Wahl von Klassen hängt von der Anwendung ab und ist grundsätzlich beliebig. 3 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Klassifikation (2) In Java besteht eine Klasse aus: Attributen Methoden Die Attribute beschreiben die Variablen (Daten) eines Objektes der Klasse. Die Methoden beschreiben die Operationen (das Verhalten, die Funktionen) eines Objekts der Klasse. Eine Klasse ist ein benutzerdefinierter Datentyp (kurz: Typ). Sie kann der (Daten-)Typ einer Variablen sein. Eine Variable, deren Typ eine Klasse ist, speichert eine Referenz auf ein Objekt der Klasse (Referenzvariable). 4 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Klassifikation: Beispiel (1) Deklaration einer Klasse class Cat { // Attribute = Daten int age; // Methoden = Verhalten void setAge(int a) { age = a; } int getAge() { return age; } Erzeugen von Instanzen, Deklaration von (Referenz-)Variablen und Aufruf von Methoden public static void main(String args[]) { Cat frisky = new Cat(); frisky.setAge(5); frisky.meow(); Cat tony; tony = new Cat(); tony.setAge(6); tony.meow(); } void meow() { System.out.println("Meow!"); } } 5 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Klassifikation: Beispiel (2) Zusätzl.: Konstruktoren der Klasse class Cat { // Attribute = Daten int age; // Konstruktoren Cat() { } Cat(int a) { age = a; } // Methoden = Verhalten int getAge() { return age; } void setAge(int a) { age = a; } Aufruf: bei Erzeugung der Instanz public static void main(String args[]) { // Attribut setzen via setter-Methode Cat frisky = new Cat(); frisky.setAge(5); frisky.meow(); // Attribut setzen via Konstruktor Cat tony; tony = new Cat(6); tony.meow(); } Konstruktoren haben den gleichen Namen wie die Klasse. void meow() { System.out.println("Meow!"); } } 6 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Eigenschaften von Objekten: Identität Objekte sind diskrete, unterscheidbare Entitäten mit jeweils eigenen Daten (Attributwerten). Beispiele: Figuren in einem (Computer-)Schachspiel Fenster einer Benutzeroberfläche Absätze in einem Dokument Jedes Objekt besitzt eine eigene, inhärente ("ihm innewohnende") Identität. Selbst wenn alle Attributwerte von zwei Objekten gleich sind, sind die zwei Objekte separate, eigenständige Entitäten . 7 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Identität: Beispiel public static void main(String args[]) { Cat frisky = new Cat(); frisky.setAge(5); frisky.meow(); Cat tony; tony = new Cat(6); tony.meow(); Erzeugung einer weiteren Katze mit dem gleichen Alter. Cat lulu = new Cat(); lulu.setAge(5); lulu.meow(); } Es sind dennoch zwei unterschiedliche Objekte mit jeweils eigener Identität. 8 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Eigenschaften von Objekten: Kapselung Unter Kapselung versteht man das Verbergen von Daten vor dem Zugriff von außen. Der direkte Zugriff auf gekapselte (interne) Daten wird unterbunden. Der Zugriff erfolgt statt dessen über definierte Schnittstellen. („Black-Box-Modell“). In Java kann die Kapselung von Daten (Sichtbarkeit) über Modifikatoren festgelegt werden, z.B. private, public. Heusch 12.7 Ratz 7.3.3 9 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Kapselung – Beispiel (1) – ohne Kapselung – public class Fraction { public int numerator = 0; public int denominator = 1; // public --> Variablen nach // außen sichtbar } 10 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Kapselung – Beispiel (2) – mit Kapselung – public class Fraction { private int numerator = 0; // private --> Variablen sind nicht private int denominator = 1; // von außen sichtbar /** * Setzen des Nenners (denominator). * Bei Übergabe von d==0 wird der Nenner nicht gesetzt. */ public void setDenominator(int d) { if (d != 0) { // Abfrage dient zur Fehlervermeidung denominator = d; } } public int getDenominator() { return denominator; } Getter- und Setter-Methoden } 11 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Eigenschaften von Objekten: Vererbung (1) Wozu Vererbung und Ober-/Unterklassen? Attribute (Variablen) class Dog { int age; class Cat { int age; Cat() { } Dog() { } Cat(int a) { age = a; } Dog(int a) { age = a; } int getAge() { return age; } void setAge(int a) { age = a; } int getAge() { return age; } void setAge(int a) { age = a; } void meow() { System.out.println("Meow!"); } void bark() { System.out.println("Woof!"); } } } Methoden (Operationen ) 12 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Vererbung (2) Es können allgemeinere Klassen (Oberklassen) definiert werden. Diese können dann in detaillierteren Klassen (Unterklassen) verfeinert werden (=> Klassenhierarchie). Jede Unterklasse übernimmt (erbt) alle Attribute (Variablen) und alle Methoden (Operationen) ihrer Oberklasse Daneben fügt sie ihre eigenen, individuellen Attribute und Methoden hinzu. Aber: Konstruktoren werden nicht vererbt. 13 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Beispiel für Vererbung (1) – Klassen-Deklarationen – Oberklasse class Animal { int age; Animal() { } Animal(int a) { age = a; } int getAge() { return age; } void setAge(int a) { age = a; } } Unterklassen class Cat extends Animal { void meow() { System.out.println("Meow!"); } } 14 W. Geiger, W. Süß, T. Schlachter, C. Schmitt class Dog extends Animal { void bark() { System.out.println("Woof!"); } } Institut für Angewandte Informatik Beispiel für Vererbung (2) – Objekte – Erzeugen von Objekten und Deklaration von Variablen der Klassen Animal, Cat und Dog public static void main(String args[]){ Cat frisky = new Cat(); frisky.setAge(5); frisky.meow(); Dog pluto = new Dog(); pluto.setAge(5); pluto.bark(); Das geht nicht: public static void main(String args[]){ Cat frisky = new Cat(5); Dog pluto; pluto = new Dog(4); Animal hugo = new Animal(4); hugo.bark(); } Animal hugo = new Animal(); hugo.setAge(4); } 15 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Eigenschaften von Objekten: Überladen, Überschreiben, Polymorphismus (1) Überladen In der gleichen Klasse darf es mehrere Methoden mit gleichen Namen, aber mit unterschiedlichen Parametern (Parameteranzahl oder -typen), geben. Anzahl und Typ der Parameter im Aufruf entscheidet, welche von diesen Methoden ausgeführt wird. Überladung wird zur Übersetzungszeit aufgelöst. Überschreiben In einer Klassenhierarchie dürfen in unterschiedlichen Klassen Methoden mit gleichen Namen und gleichen Parametern sein. Die Methode der Unterklasse überschreibt dann die Methode der Oberklasse in der Unterklasse. 16 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Eigenschaften von Objekten: Überladen, Überschreiben, Polymorphismus (2) Polymorphismus (auch: Polymorphie; dt. „Vielgestaltigkeit“): Gibt es in einer Klassenhierarchie sich überschreibende Methoden, dann gilt für die ausgeführte Methode: Das Softwaresystem sucht sich zur Laufzeit, passend zum tatsächlichen Typ des Objektes, die auszuführende Methode aus. D.h. der Typ (die Klasse) des Objekts entscheidet – zur Laufzeit – über die ausgeführte Methode (nicht der Typ der Variable). Überladung ist kein Polymorphismus! Heusch 12.3.4 Ratz 7.3.4 17 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Beispiel für Überladen class Bird { void move() { System.out.println("I fly up in the air: flutter flutter!"); } void move(String parameter) { System.out.println("I fly up in the air: " + parameter); } public static void main(String[] args) { Bird b = new Bird(); b.move(); b.move("glide glide!"); } } > java Bird I fly up in the air: flutter flutter! I fly up in the air: glide glide! 18 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Beispiel für Überschreiben u. Polymorphismus (1) – Deklaration der Klassen – class Bird { void move(){ System.out.println("I fly up in the air: flutter flutter!"); } } class Songbird extends Bird { } class Penguin extends Bird { void move() { // Überschreiben System.out.println("I swim in the water: float float!"); } } 19 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Beispiel für Überschreiben u. Polymorphismus (2) – Instanzen und Methodenaufrufe – public static void main(String[] args) { Bird b = new Bird(); b.move(); Songbird s = new Songbird(); s.move(); Penguin p = new Penguin(); p.move(); Bird b2; b2 = p; b2.move(); Ausgabe I I I I fly up in the air: fly up in the air: swim in the water: swim in the water: flutter flutter! flutter flutter! float float! float float! // zulässig // Polymorphismus } 20 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Mehrfachvererbung In Java gibt es keine echte Mehrfachvererbung. Über Schnittstellen (Interfaces) ist eine Art Mehrfachvererbung möglich. Das folgende Beispiel aus C++ zeigt eine mögliche Mehrfachvererbung. 21 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Mehrfachvererbung in C++ class Bird { public: void move() { cout<<"I fly up in the air: flutter!"; }; }; class FlyingCat: public Cat, public Bird { }; 22 W. Geiger, W. Süß, T. Schlachter, C. Schmitt class Cat { private: int age; public: int getAge(); void setAge(int a); void meow(); }; void main() { FlyingCat superCat; superCat.setAge(5); superCat.meow(); superCat.move(); }; Institut für Angewandte Informatik