Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Praktische Informatik 1

Ähnliche Präsentationen


Präsentation zum Thema: "Praktische Informatik 1"—  Präsentation transkript:

1 Praktische Informatik 1
Prof. Dr. H. Schlingloff

2 7.2 Klassen und Objekte Klasse = Zustandsvariablen + Methoden
Eine Klasse ist die Java-Realisierung eines abstrakten Datentyps. In der objektorientierten Programmierung sind Klassen das grundlegende Strukturierungsmittel. Zustandsvariablen sind nichtstatische Datenfelder Methoden sind Funktionen bzw. Operationen zur Erzeugung und Verarbeitung von Objekten der Klasse (Aktionen, die ausgeführt werden können) Klasse = Zustandsvariablen + Methoden

3 (fast) synonyme Sprechweisen
Die folgenden Begriffe werden fast synonym verwendet (Achtung, subtile Unterschiede!) Klasse ~ Typ ~ Art Objekt ~ Instanz ~ Exemplar Datenfeld ~ Objektattribut ~ Instanzvariable ~ Eigenschaft (passives Merkmal) Methode ~ Funktion/Prozedur ~ Operation ~ Fähigkeit (aktives Merkmal) Parameter ~ Argument ~ Eingabewert

4 UML-Klassendiagramme
Klassen werden graphisch durch ein Rechteck mit den drei Teilen Name, Datenfelder, Methoden (getrennt durch horizontale Linien) gezeichnet Beispiel: Philosoph hungrig: boolean denken() essen()

5 Beispiele Wichtig: Klassen können strukturiert sein!
Objekt Datenfeld Methode Philosoph sokrates hungrig denken Auto herbie tankinhalt fahren Planet erde masse drehen Kreis kreis1 radius farbeAendern Wichtig: Klassen können strukturiert sein! Lebewesen: Säuger – Insekten – Reptilien Lebewesen – Philosoph – Grieche Fahrzeug – Auto – Porsche

6 Pakete Eine Gruppe von Klassen heißt Paket (Java: package)
Einschränkung des Namensraums auf das aktuelle Paket qualifizierter Zugriff paketname.klassenname.bezeichner Darstellung in UML: Rahmen mit Kopfbereich package Buchhaltung Einkauf budget: int bestellen() reklamieren() Finanzen erträge: int verbindl: int auszahlen()

7 Methoden und Klassensignaturen
Methoden können einen oder mehrere Parameter haben und Ergebnisse abliefern Im Kopf der Methode wird der Typ der Parameter und der Typ des Ergebnisses vermerkt Die Einhaltung des richtigen Typs beim Aufruf wird vom Compiler strikt überprüft (streng getypte Sprache) Falls eine Methode kein Ergebnis liefert („Prozedur“), ist der Typ void Das Tupel i1 × i2 × … × in  o wird als Signatur der Methode bezeichnet. Die Menge aller Methodensignaturen bildet die Signatur der Klasse (vgl. abstrakte Datentypen)

8 Reporter und Akteure Es ist guter Programmierstil, Methoden so zu entwerfen, dass sie entweder Reporter oder Akteure sind: Reporter liefern den Wert gewisser Datenfelder, ohne etwas zu verändern (sondierende Methoden, Funktionen) Akteure verändern Datenfelder, ohne Ergebnisse abzuliefern (verändernde Methoden, Prozeduren) Kapselung des direkten Zugriffs auf Datenfelder! void denken() {...; hungrig = true; ...} boolean istHungrig() { return this.hungrig; }

9 Objekterzeugung und Initialisierung
Mit new wird (dynamisch) ein neues Objekt erzeugt. Man nennt diesen Vorgang auch “instanziieren” und das Objekt eine „Instanz“ der Klasse. z.B. Philosoph sokrates = new Philosoph(); Dadurch werden die objektspezifischen Datenfelder angelegt, d.h., es wird ausreichend Speicherplatz im Adressraum reserviert. Dieser Speicherplatz wird automatisch wieder freigegeben, wenn das Objekt nicht mehr erreichbar ist („garbage collection“) Primitive Datenobjekte (Zahlen oder Zeichen) müssen nicht erzeugt werden, sie existieren sowieso. Vom Instanziieren zu unterscheiden ist das Initialisieren von Objekten: den Datenfeldern werden Anfangswerte zugewiesen; z.B. int x = 0; Eine nichtinitialisierte Variable enthält u.U. einen unvorhersagbaren Wert (was zufällig an dieser Stelle im Speicher stand…)

10 Konstruktoren Zu jeder Klasse gibt es die Möglichkeit, eine spezielle Konstruktor-Methode zu deklarieren. Der Konstruktor wird bei der Erzeugung eine Instanz der Klasse automatisch aufgerufen und dient dazu, das betreffende Objekt zu initialisieren. Der Konstruktor hat den selben Namen wie die Klasse selbst und kann auch Eingabeparameter enthalten, liefert jedoch kein Ergebnis. class Student { … String matrikelnummer; int scheine; Student (String matrNr) // Konstruktor- Methode { matrikelnummer = matrNr; … scheine = 0; }

11 UML-Objektdiagramme zeigt eine Sicht auf einen „Schnappschuss“ des Systems (welche Objekte existieren gerade) Beispiel: Sokrates:Philosoph hungrig=false Plato:Philosoph hungrig=true Lehrer Schüler

12 statische Datenfelder
Neben Instanzvariablen gibt es statische Datenfelder (Schlüsselwort static): Diese beschreiben Attribute, die alle Objekte der Klasse gemeinsam haben Beispiel: static int anzahl_Finger = 10; als Attribut der Klasse Philosoph Solange kein Objekt einer Klasse erzeugt wurde, muss nur der Speicherplatz für statische Variablen angelegt werden. Der Speicherplatz für Objekte wird erst beim Aufruf von new reserviert. Frage: Unterschied nullstellige Funktion – statisches Feld – Instanzvariable ?

13 Klassendefinition - Syntax (Auszug)
ClassDefinition ::= [ public | protected | private ] [ static ] [ abstract | final | native | …] class Name [ extends Superclass ] [ implements Interface { , Interface } ] { {FieldDeclaration | MethodDeclaration | ConstructorDeclaration | … } }

14 Modifikatoren Klassen, Datenfelder und Operationen können durch Modifikatoren näher attributiert werden. Diese betreffen vorwiegend die Zugriffsmöglichkeiten auf die betreffende Komponente. final (für ein Datenfeld): Das Datenfeld ist eine Konstante, hat also für alle Objekte der Klasse stets den gleichen, unveränderlichen Wert. (für eine Operation): Die Operation kann in Unterklassen nicht verändert (überschrieben) werden. static : Die Komponente ist klassenbezogen, d.h. für alle Objekte der Klasse in gleicher Weise verfügbar und wertgleich. Für eine Operation bedeutet das: Die betreffende Operation darf nur static-Datenfelder benutzen.

15 Modifikatoren (2) private : Die Komponente darf nur innerhalb der aktuellen Klasse benutzt werden (aber von beliebigen Objekten der Klasse). public : Die Komponente ist öffentlich, darf also unbeschränkt von außen benutzt werden. protected : Auf die Komponente kann man nur innerhalb des Pakets zugreifen, das die betreffende Klasse enthält, und zusätzlich von deren Unterklassen. package (default-Einstellung): Zugriff wie bei protected, aber auf das aktuelle Paket beschränkt. Aufgabe: Was ist wann wo wie zugreifbar

16 Modifikatoren (3) abstract : Die Klassen- oder Methodendeklaration enthält nur die Signatur (keine Methodenrümpfe). native : in einer anderen Sprache codiert. strictfp : float- und double-Ausdrücke werden strikt nach Norm ausgewertet (keine intermediäre Typausweitung). Inkompatibel mit native! transient : Die Variable wird bei der Serialisierung (z.B. zum Speichern) ausgelassen. volatile : Die Variablen kann asynchron, also außerhalb des aktuellen Threads, modifiziert werden. synchronized : Ununterbrechbare kritische Region.

17 Modifikatoren in UML "−" für private "+" für public "#" für protected
"~" für package Philosoph -hungrig: boolean = false +denken() #essen()

18 Klassenhierarchien Klassendefinitionen können auf verschiedene Weise hierarchisch strukturiert sein. Klassen dürfen lokale Klassen als Deklaration enthalten Klassen können zu Paketen zusammengefasst werden Zwischen Klassen kann eine Erbschaftsbeziehung (Super/Subklassenhierarchie) bestehen Zwischen abstrakten und konkreten Klassen kann eine Implementierungsrelation bestehen (später)

19 7.3 Vererbung und Polymorphie
Vererbung ist das fundamentale Konzept der oo- (objektorientierten) Programmierung ©

20 Ingenieurswesen und Software-Engineering
Hierarchische Strukturierung gemäß dem Aufbau: Fahrzeug – Getriebe – Zahnrad Fahrzeug besteht aus vielen Einzelteilen, oo-Software besteht aus vielen Klassen Typenreihen-Strukturierung gemäß Weltsicht: runde/ovale Zahnräder, Zähne innen/außen, …; Mercedes, C-Klasse, T-Modell, C240, C240 4Matic; Einteilung entspricht Vererbungsstruktur; es gibt verschiedene Zahnrad-Bautypen, die sich voneinander im Detail unterscheiden; es gibt aber auch gewisse Gemeinsamkeiten, die uns veranlassen, von einem „Zahnrad“ zu sprechen Genauso: es gibt verschiedene PKW-Marken, aber alle haben 4 Räder und einen Tankinhalt.

21 oo-Design Wenn ein Ingenieur ein Getriebe konstruiert, überlegt er sich eine Dekomposition in Komponenten (bzw. einen Bauplan zum Zusammensetzen aus Einzelteilen) und schlägt in Katalogen mit Zahnkranz-Bautypen nach oder modifiziert bestehende Bautypen geeignet. In der oo-Programmierung besteht Softwaredesign aus der Dekomposition des Problems in einzelne Klassen (bzw. der Strukturierung in eine Klassenhierarchie) und dem Zusammenfügen bzw. der Modifikation vorhandener Bibliotheksklassen.

22 Beispiel public class Fahrzeug { private int tachostand;
public Fahrzeug() { tachostand = 0; } public int gibTachostand() { return tachostand; public void fahre(int strecke) { tachostand += strecke;

23 syntaktische Realisierung
class LKW extends Fahrzeug {…} Alle Datenfelder und Methoden von Fahrzeug sind auch für LKW verfügbar Ausnahme: private Datenfelder und Methoden LKW kann zusätzliche Variablen oder Methoden enthalten oder Methoden abändern z.B. nutzlast oder transportiere z.B. fahre mit zusätzlichem Argument ladung Zugriff auf die Methoden mit Member-Selektor (Punkt), z.B. lkw1.ladung

24 Vererbung in UML Vererbung wird durch einen Pfeil mit nichtgefüllter Spitze gekennzeichnet Fahrzeug -tachostand: int +fahre(km) LKW +nutzlast: int +fahre(km,ladg) PKW +sitze: int +fahre(km,insas)

25 Die Klasse Object Jede Klasse ist von der allgemeinsten Klasse Object abgeleitet und erbt von dieser gewisse Eigenschaften Object clone() boolean equals(Object) String toString() Die generische Definition der Methoden muss ggf. abgeändert werden

26 Überlagerung In abgeleiteten Klassen dürfen alle ererbten Methoden neu definiert werden (Ausnahmen: private, final) Dies realisiert den Umstand, dass im Speziellen zusätzliche Maßnahmen gegenüber dem Allgemeinen durchgeführt werden Beispiel: ein LKW kann nicht rückwärts fahren, daher prüft fahre zunächst ob das Argument positiv ist: public void fahre(int strecke){ if (strecke > 0) super.fahre(strecke); } Die speziellere Methode überlagert die allgemeinere aus der übergeordneten Klasse

27 Polymorphie Unter Polymorphie versteht man die Tatsache, dass unterschiedliche Methoden gleich bezeichnet sein dürfen. Beispiele: + für Int-, Float-Addition, String-Konkatenation Beispiel: neue Methode fahre in Klasse LKW mit zusätzlichem Argument last prüft zunächst ob die angegebene Nutzlast überschritten wurde: public void fahre(int strecke, int last) { if (last > nutzlast) System.out.println("überladen!"); else fahre(strecke); } In jedem Fall muss an Hand der Signatur oder des Objekttyps entscheidbar sein, welche Methode gemeint ist.

28 im Beispiel public class LKW extends Fahrzeug { private int nutzlast;
public LKW(int nutzlast){ this.nutzlast = nutzlast; } public void fahre(int strecke){ if (strecke > 0) super.fahre(strecke); public void fahre(int strecke, int last) { if (last > nutzlast) System.out.println("überladen!"); else fahre(strecke); public void transportiere (int last, int start, int ziel) { /* belade(last); fahre(ziel - start, last); */ }

29 dynamisches Binden Es ist nicht immer statisch entscheidbar, welche Methode gerade gemeint ist: Fahrzeug kfz = new LKW(…); kfz.fahre (… ladung); … if (…) kfz = new PKW(); kfz.fahre(… personen); Compiler erzeugt zusätzlichen Code für diesen Zweck Ausnahmen: private, static, final

30 konkretes Beispiel public class Fuhrpark { private static Fahrzeug f;
public static void sampleMethod() { f = new LKW(20000); // ein 20-Tonner f.fahre(-100); // welches fahre? //f.fahre(100, 10000); // nicht erlaubt f = new PKW(4); // ein 4-Sitzer ((PKW)f).fahre(123,5); }

31 Bindungsregeln und Objektinitialisierung
Beim Erzeugen eines Objektes mittels new werden zunächst die Konstruktoren der vererbenden Klassen (Eltern, Großeltern etc.) aufgerufen. Die eigenen Merkmale können mit dem Deskriptor this, die der jeweiligen Elternklasse mit super aufgerufen werden. Eventuelle Typumwandlung (engl. Type Cast) durch vorgestelltes (Typ)


Herunterladen ppt "Praktische Informatik 1"

Ähnliche Präsentationen


Google-Anzeigen