3. Klassen Klassen als strukturierter Datentyp 3. Klassen • Die Komponentenvariablen heißen hier Instanzvariablen. • Eine Klasse kann als Bauplan für Objekte verstanden werden. • Eine konkrete Realisierung einer Klasse K bezeichnen wir als Instanz der Klasse K bzw. als Objekt der Klasse K . • Jedes Objekt verfügt über eine separate Version der Instanzvariablen. • Komponentenvariablen, die in der Deklaration mit static versehen sind, sind dagegen Klassenvariablen (siehe voriges Kapitel). • Klassenvariablen beschreiben üblicherweise eine Eigenschaft der Klasse, nicht eines einzelnen Objektes (später mehr). Klassen als strukturierte Datentypen Klassen als Konzept zur Kapselung Instanzmethoden Konstruktoren statische Komponenten von Klassen Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 53 3. Klassen Klassen als strukturierter Datentyp Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 3. Klassen Was sind Klassen? • selbst definierter Datentyp (Referenzdatentyp) • Modellierung neuer Strukturen • Sammlung von Variablen verschiedener Typen • Beispiel: Adresse • Eine Adresse soll als Ganzes repräsentiert werden können. • Teile des Ganzen haben unterschiedliche Datentypen. • Eine Klasse fasst die Komponentenvariablen zusammen. • Darstellung: UML-Klassendiagramm Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 Klassen als strukturierter Datentyp Erläuterungen und Terminologie: Wir werden schrittweise unser Verständnis über Klassen erweitern: • • • • • 3. Klassen radius farbe Adresse name: strasse: hausnummer: postleitzahl: wohnort: mail: kommentar: 55 Klassen als strukturierter Datentyp radius = 1.0 farbe = blau Kreis a radius = 0.5 farbe = grün Kreis b radius = 1.3 farbe = rot Kreis c class Kreis String String int int String String String 54 Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 56 3. Klassen Klassen als strukturierter Datentyp 3. Klassen Klassen als strukturierter Datentyp Deklaration von Klassen Syntax zur Deklaration von Klassen (vorläufig): public class Klassenname { Variablendeklaration ... Variablendeklaration } Instanziierung von Objekten Beispiel: public class Adresse { String name; String strasse; int hausnummer; int postleitzahl; String wohnort; String mail; String kommentar; } Instanzen einer Klasse erzeugen wir mit dem new-Operator: Variablenname = new Klassenname(); Man bezeichnet dies als Instanziierung. Beispiel: Adresse a; a = new Adresse(); 1. Wir schreiben die Deklaration der Klasse Adresse in die Datei Adresse.java. Natürlich ist es auch möglich, Variablendeklaration und Instanziierung in einer Anweisung zu formulieren: 2. Wir compilieren Adresse.java. Damit entsteht Adresse.class. Adresse a = new Adresse(); Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 3. Klassen 57 Klassen als strukturierter Datentyp Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 3. Klassen 59 Klassen als strukturierter Datentyp Initialisierung von Instanzvariablen 3. Nun steht uns der neue Datentyp Adresse zur Verfügung. Eine Variablendeklaration der Form: Adresse a; a ist nun möglich. name ☞ Instanzvariablen werden (automatisch) initialisiert wie Komponenten von Feldern. ☞ Mit Klassen sind stets Referenzdatentypen verbunden. ☞ Also steht uns nach Adresse a; Hier: noch kein Objekt der Klasse Adresse zur Verfügung. • postleitzahl, hausnummer: 0 • und alle anderen Komponeten: null, da Referenzdatentypen. a strasse hausnummer 0 postleitzahl 0 wohnort mail kommentar Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 58 Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 60 3. Klassen Klassen als strukturierter Datentyp 3. Klassen Zugriff auf Instanzvariablen Felder von Objekten Natürlich können wir auch Felder deklarieren, die als Komponententyp eine Klasse haben. Adresse[] adressen = new Adresse[20]; Zugriff auf Komponenten eines Objekts: Variablenname.Komponentenname Adresse a = new Adresse(); a.wohnort = "Musterhausen"; a.postleitzahl = 47111; Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 3. Klassen 61 Klassen als strukturierter Datentyp a Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 adressen[18] adressen[19] 63 Prinzipien der objektorientierten Programmierung • Objekte waren bisher nichts weiter als schlichte Datenspeicher, Klassen die Baupläne dieser Datenspeicher. • In der objektorientierten Programmierung wird diese Sicht erweitert. • Objekte sind hier mehr als reine Datenspeicher, sie haben insbesondere: – einen Zustand und – weisen ein bestimmtes Verhalten auf. • Eine Klasse beschreibt die möglichen Zustände und das Verhalten der zugehörigen Instanzen. Sie ist eine abstrakte Beschreibung der Objekte (Instanzen). name • Klassen definieren Referenzdatentypen. • Konsequenz: Eine Zuweisung sorgt nicht dafür, daß ein Objekt kopiert wird. • Analog zu Feldern: Nur die Referenz wird kopiert! adressen[17] Prinzipien der objektorientierten Programmierung Objekte und Referenzen b adressen[2] Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 3. Klassen adressen[0] adressen[1] for (int i=0 ; i<20 ; i++) adressen[i] = new Adresse(); System.out.println( "PLZ: " + a.postleitzahl ); System.out.println( "Ort: " + a.wohnort ); a = new Adresse(); b = a; adressen • Der obige Aufruf erzeugt nur das Feld für die Referenzen auf Instanzen von Adresse, nicht die Objekte selbst. • Die Feldkomponenten sind mit null initialisiert (siehe rechts). • Erzeugung der Objekte: Beispiele: Adresse a; Adresse b; Klassen als strukturierter Datentyp strasse hausnummer 0 postleitzahl 0 wohnort mail kommentar 62 Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 64 3. Klassen Prinzipien der objektorientierten Programmierung 3. Klassen Prinzipien der objektorientierten Programmierung Klassen als Modelle Vorteile des objektorientierten Ansatzes • In der Softwareentwicklung transferieren wir die Problemwelt auf den Computer, indem wir ein Modell der Problemwelt erstellen. • Klassen sind wesentliche Bestandteile dieses Modells. Jede Klasse ist ein Modell für eine Gruppe gleichartiger Objekte der Problemwelt. • Durch die Instanziierung von Klassen erhalten wir Objekte. Diese Objekte stellen auf dem Rechner das Äquivalent zu Gegenständen, Eigenschaften oder Personen unserer Problemwelt dar. • Ein Entwurf wird in unabhängige Komponenten (Klassen/Objekte) unterteilt, die zusammen das Gesamtsystem bilden. • Wie die Einzelteile eines Modellbaukastens werden diese Objekte zu einer Gesamtheit zusammengefügt. Vorteile: 1. Durch die Aufteilung in (kleine) unabhängige Komponenten wird die Komplexität verringert. 2. Die einzelnen Komponenten können unabhängig entwickelt und getestet werden. 3. Der Anbau weiterer Komponenten ist ohne besondere Probleme möglich. Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 3. Klassen 65 Prinzipien der objektorientierten Programmierung Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 3. Klassen 67 Prinzipien der objektorientierten Programmierung Grundpfeiler der objektorientierten Programmierung • • • • Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 66 Generalisierung Vererbung Kapselung Polymorphismus Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 68 3. Klassen Prinzipien der objektorientierten Programmierung Kapselung Grundidee der Kapselung: Vgl. Hinweis auf der Rückseite eines Fernsehgeräts: Gerät steht unter Spannung und darf nur vom Fachmann geöffnet werden! 1. Das Öffnen des Geräts ist für Unbefugte nicht ungefährlich. Wollen Sie sich von einem Fernsehmechaniker am Blinddarm operieren lassen? 2. Normale Benutzer sollten nicht wissen müssen, wie der Fernseher intern funktioniert. Hierzu dienen die Bedienelemente als Schnittstelle zur Außenwelt. In der objektorientierten Programmierung: 1. Der interne Aufbau einer Klasse bleibt verborgen (Data Hiding). Zur Benutzung der Klasse reichen Kenntnisse über deren Schnittstelle. 2. Der interne Aufbau einer Klasse kann geändert werden, ohne daß dies Auswirkungen auf andere Teile der Software hat. Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 69