Praktische Informatik 1

Slides:



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

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
Kapselung , toString , equals , Java API
der Universität Oldenburg
Objektorientierte Programmierung Definition von Klassen
Java: Objektorientierte Programmierung
Java: Dynamische Datentypen
Indirekte Adressierung
Java: Referenzen und Zeichenketten
Java: Grundlagen der Objektorientierung
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 5 Polymorphismus Sommersemester 2003 Lars Bernard.
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 3 Klassen, Objekte, Arrays und Kontrollstrukturen Sommersemester 2003 Lars Bernard.
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Einführung in die OOP in Java
Programmieren mit JAVA
Programmieren mit JAVA
Vererbung Spezialisierung von Klassen in JAVA möglich durch
PKJ 2005/1 Stefan Dissmann Zusammenfassung Bisher im Kurs erarbeitete Konzepte(1): Umgang mit einfachen Datentypen Umgang mit Feldern Umgang mit Referenzen.
DVG Interfaces. DVG mehrfache Vererbung 4 Mehrfache Vererbung ist die Ableitung einer Klassen von mehreren anderen Klassen. –farbigerPunkt.
07-GraphischeObjekte Graphische Objekte in EMMA301Paint.
DVG Klassen und Objekte
DVG Einfache Klassen 1 Einfache Klassen. 2DVG Einfache KlassenStrukturen Beispiel: Personendaten bestehen aus String name String name.
Einführung in die Programmierung Klassendefinition und Objekte
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
Prof. Dr. Gerhard Schmidt pres. by H.-J. Steffens Software Engineering SS 2009Folie 1 Objektmodellierung Objekte und Klassen Ein Objekt ist ein Exemplar.
IT2 – WS 2005/20061Oct 10, 2005 Externes Verhalten – Quelltext (source code) Durch Aufrufe der Konstruktoren und Methoden kann das externe Verhalten (=die.
Klassendefinitionen in Java
CuP - Java Elfte Vorlesung Montag, 11. November 2002.
Copyright 2011 Bernd Brügge, Christian Herzog Grundlagen der Programmierung TUM Wintersemester 2011/12 Kapitel 11, Folie 1 2 Dr. Christian Herzog Technische.
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.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung Wintersemester 2011/12 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
EPROG Tutorium #6 Philipp Effenberger
Informatik I : Software höhere Programmiersprachen Java Klassen: hat Methoden (Funktionen) und Daten (Variablen) es kann mehrere Klassen geben nur eine.
OOP-Begriffe Abstraktion Modellieren Klasse Objekt Attribute Methoden
Einführung in die Programmierung mit Java
Java-Kurs Übung Besprechung der Hausaufgabe
Java-Kurs - 5. Übung Besprechung der Übungsaufgabe Klassen und Objekte
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer, Dr. Gerhard Gröger Einführung in die Programmierung mit Java 5. Vorlesung WS 2002/2003.
IT2 – WS 2005/20061Nov 14, 2005 Visibility  public: Sichtbar in allen Paketen  protected: Sichtbar innerhalb des Pakets und in den Unterklassen  (default,
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer, Dr. Thomas H. Kolbe Einführung in die Programmierung mit Java 9. Vorlesung WS 2001/2002.
Abstrakte Klassen und das Interface-Konzept
Objektorientierte Programmierung (OOP)
C++ FÜR cOMPUTERSPIELENTWICKLER
Tutorium Software-Engineering SS14 Florian Manghofer.
Vererbung in Java. public abstract class Form { protected int breite; protected int hoehe; protected String farbe; /** * Erzeuge eine Form der Breite.
© Tenbusch Oberstufenzentrum Informations- und Medizintechnik Objektorientierte Programmierung mit Java.
Konstruktoren.
Praktische Informatik 1
„Was du ererbt von Deinen Vätern hast, erwirb es, um es zu besitzen.“
OOP II.
Java-Kurs - 8. Übung Klassen und Objekte: Vererbung
Einführung in die Programmierung mit Java
Java-Kurs Übung Klassen und Objekte: Vererbung (Fortsetzung)
Einführung in die Programmierung mit Java
Grundkurs Informatik 11-13
Raphael Fischer Informatik II - Übung 06 Raphael Fischer
Arrays in Java Ein Array ist eine Variable, die aus einer An-zahl von Elementen des gleichen Datentyps besteht, die aufeinanderfolgend im Speicher liegen.
2. Vererbung und Kapselung
Definition Felder Konstruktor Methoden Beispiel
1. Die rekursive Datenstruktur Liste 1
9. Vererbung und Polymorphie
Implementieren von Klassen
 Präsentation transkript:

Praktische Informatik 1 Prof. Dr. H. Schlingloff 14. 1. 2008

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

(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

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()

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

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()

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)

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; }

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…)

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; } …

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

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 ?

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

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.

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

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.

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

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)

7.3 Vererbung und Polymorphie Vererbung ist das fundamentale Konzept der oo- (objektorientierten) Programmierung © http://www.javabuch.de/

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.

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.

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

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

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)

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

Ü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

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.

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); */ }

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

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); }

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)