Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 5. Objekte und Klassen 1

Ähnliche Dokumente
Kapitel 6. Kontrollstrukturen im Kontext von Klassen und Objekten

Kapitel 6. Kontrollstrukturen und Methoden im Kontext von Klassendeklarationen

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 9. Arrays. Arrays 1

Kapitel 6. Vererbung

Kapitel 6. Vererbung

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 8. Arrays. Arrays

Kapitel 6. Vererbung

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 12/13. Kapitel 3. Grunddatentypen, Ausdrücke und Variable

Repetitorium Informatik (Java)

Einstieg in die Informatik mit Java

Kapitel 3. Grunddatentypen, Ausdrücke und Variable

Objektorientierte Programmierung und Klassen

C++ - Objektorientierte Programmierung Konstruktoren und Destruktoren

Einstieg in die Informatik mit Java

C++ - Objektorientierte Programmierung Konstante und statische Elemente

Klassen mit Instanzmethoden

3 Objektorientierte Konzepte in Java

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

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

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

Vererbung, Polymorphie

Einstieg in die Informatik mit Java

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Objektorientierung (OO)

Letztes Mal. static int ggt(int a, int b) { if (a == b) return a; else if (a > b) return ggt(a-b,b); else if (a < b) return ggt(a,b-a);

12 Abstrakte Klassen, finale Klassen und Interfaces

Universität Paderborn Prof. Dr. Heike Wehrheim. Betreutes Arbeiten. Ab diese Woche: freitags, 14 16, E-Pool (während Tutorium Knopf) GPI, WS 07/08

Einstieg in die Informatik mit Java

Vorkurs C++ Programmierung

Einführung in die Programmierung für NF. Vererbung

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

Abschnitt 6: Klassen, Objekte und Methoden in Java

Vererbung. Martin Wirsing. Ziele. Vererbung

Javakurs für Anfänger

Fragen zur OOP in Java

3.2 Objekte und Klassen. Wir werden uns in diesem Kapitel näher mit Objekten und Klassen in Java beschäftigen.

3 Objektorientierte Konzepte in Java

Kapitel 9: Klassen und höhere Datentypen. Klassen und höhere. Objekte, Felder, Methoden. Küchlin/Weber: Einführung in die Informatik

C++ - Objektorientierte Programmierung Vererbung

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

5.5.8 Öffentliche und private Eigenschaften

Einführung in die Programmierung mit Java

Umsetzung einer Klassenkarte in einer Programmiersprache

Klassen in Java Software Entwicklung 1

Java Einführung Klassendefinitionen

Java Einführung Methoden in Klassen

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1. Kapitel 11. Listen. Listen

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Referenzen. Referenzen

Javakurs für Anfänger

Vererbung. Generalisierung und Spezialisierung Vererbung und Polymorphismus

1 Klassen und Objekte

Methoden und Wrapperklassen

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

Arrays Fortgeschrittene Verwendung

Organisatorisches. Neue Übungsblätter: Nur mehr elektronisch? Abgabe Di, , 14 Uhr bis Do, , 8Uhr

5.4 Klassen und Objekte

Vererbung. Oberklassen und Unterklassen

Objektorientierte Programmierung

Programmieren in Java

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

Algorithmen und Datenstrukturen II

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Einstieg in die Informatik mit Java

Statische Methoden, Vererbung, Benutzereingabe

Einführung in die Programmierung für NF MI. Übung 04

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 13. Listen. Listen 1

Folienpaket 7 Themenschwerpunkte: Methoden in OOP /2016 Dr. Daniel Haase - Vorkurse Informatik V3/V4

Organisatorisches. drei Gruppen Gruppe 1: 10:10-11:40, Gruppe 2: 11:45-13:15 Gruppe 3: 13:20-14:50

Probeklausur: Programmierung WS04/05

Algorithmen implementieren. Implementieren von Algorithmen

Klassen und ihre Beziehungen III: Mehrfache Vererbung, Rollen, Schnittstellen und Pakete

1. Grundzüge der Objektorientierung 2. Methoden, Unterprogramme und Parameter 3. Datenabstraktion 4. Konstruktoren 5. Vordefinierte Klassen

Computeranwendung und Programmierung (CuP)

Javaprogrammierung mit NetBeans. Variablen, Datentypen, Methoden

Klassen und Objekte. Einführung in Java. Folie 1 von Mai Ivo Kronenberg

Arrays. Einleitung. Deklarieren einer Array Variablen

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

3. Exkurs in weitere Arten der Programmierung

Sortieren von Objekten

Arrays von Objekten. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Programmierkurs. Manfred Jackel

Einführung in die Programmierung mit BlueJ

Objektorientierte Programmierung Studiengang Medieninformatik

2. Unterprogramme und Methoden

Prof. W. Henrich Seite 1

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Tücken der dynamischen Bindung

Exkurs: ANONYME KLASSEN. Techniken der Programmentwicklung Prof. Dr. Wolfgang Schramm

14 Abstrakte Klassen, finale Klassen, Interfaces

Praktische Informatik 1

Statische Methoden, Vererbung, Benutzereingabe

6. Globalübung (zu Übungsblatt 8)

Einführung in die Informatik 1

14 Abstrakte Klassen, finale Klassen, Interfaces. Auswertung von Ausdrücken. Beispiel. Abstrakte Methoden und Klassen

Einstieg in die Informatik mit Java

Programmieren I + II Regeln der Code-Formatierung

Web-Techniken Einführung in JavaScript

Grundzüge der Programmierung. Wiederverwendung VERERBUNG

Intuitive Einführung. Informatik B Objektorientierte Programmierung in Java. Vorlesung 01: Objektorientierte Programmierung (Teil 1)

Transkript:

Kapitel 5 Objekte und Klassen Objekte und Klassen 1

Ziele Grundbegriffe objektorientierter Programmierung kennenlernen Klassen in Java deklarieren können Das Speichermodell für Objekte verstehen Typen, Ausdrücke und deren Auswertung im Kontext von Klassendeklarationen verstehen Objekte und Klassen 2

Überblick Kapitel 3-5 Kapitel 5 Kapitel 3 Grunddatentypen Werte Operationen Ausdrücke Typisierung Auswertung bzgl. Zustand (Stack) erweitert um erweitert um erweitert um erweitert um erweitert um Klassendeklarationen Objekte und Objekthalde (Heap) Klassentypen Referenzen und null ==,!= für Referenzen und null Attributzugriff, Methodenaufruf mit Ergebnis, Objekterzeugungsausdruck Objekthalde (Heap) Objekte und Klassen 3

Objektorientierte Programmierung In der objektorientierten Programmierung werden Daten und Methoden, die Algorithmen implementieren, zu geschlossenen Einheiten (Objekten) zusammengefasst. Beispiele: Bankkonto Daten: Kontostand, Zinssatz; Methoden: einzahlen, abheben, Punkte, Linien, Kreise in einem Zeichenprogramm Daten: geometrische Form; Methoden: verschieben, rotieren, Ein objektorientiertes System besteht aus einer Menge von Objekten, die Methoden bei anderen Objekten (oder bei sich selbst) aufrufen. Die Ausführung einer Methode führt häufig zu einer Änderung der gespeicherten Daten (Zustandsänderung). Objekte und Klassen 4

Objekte Objekte und Klassen Objekte speichern Informationen (Daten). Objekte können Methoden ausführen zum Zugriff auf diese Daten und zu deren Änderung. Während der Ausführung einer Methode kann ein Objekt auch Methoden bei (anderen) Objekten aufrufen. Klassen Klassen definieren die charakteristischen Merkmale von Objekten einer bestimmten Art: Attribute, Methoden (und deren Algorithmen). Jede Klasse kann Objekte derselben Art erzeugen. Jedes Objekt gehört zu genau einer Klasse; es ist Instanz dieser Klasse. Objekte und Klassen 5

public class Point { private int x,y; Beispiel: Klasse Point public Point(int x0, int y0){ this.x = x0; this.y = y0; public void move(int dx, int dy){ this.x = this.x + dx; this.y = this.y + dy; public int getx(){ return this.x; public int gety(){ return this.y; Objekte und Klassen 6

public class Point { Klassenname Konstruktordeklaration vordefinierte lokale Variable this; bezeichnet das gerade aktive Objekt Ergebnistyp Return-Anweisung mit Ergebniswert Beispiel: Klasse Point private int x,y; public Point(int x0, int y0){ this.x = x0; this.y = y0; public void move(int dx, int dy){ this.x = this.x + dx; this.y = this.y + dy; public int getx(){ return this.x; public int gety(){ return this.y; 2 Attribute (Felder, Instanzvariable) vom Typ int formale Parameter Zugriff auf y-koordinate von this Methode ohne Ergebnis Methode mit Ergebnis vom Typ int Objekte und Klassen 7

Mit Javadoc kommentierte Klasse Point Zur Erzeugung von Kommentaren zu Klassen, Konstruktoren, Methoden, /** * Diese Klasse repraesentiert einen Punkt in der Ebene. * @author Prof. Dr. Hennicker */ public class Point { private int x, y; /** * Konstruktor eines Punkts, * wobei dessen x- und y-koordinate gegeben sein muessen. * @param x0 * x-koordinate des Punkts * @param y0 * y-koordinate des Punkts */ public Point(int x0, int y0) { this.x = x0; this.y = y0; Objekte und Klassen 8

/** * Diese Methode versetzt den Punkt um dx auf der x-achse und dy auf der y-achse. * @param dx * gibt an, um wieviel der Punkt auf der x-achse versetzt werden soll * @param dy * gibt an, um wieviel der Punkt auf der y-achse versetzt werden soll */ public void move(int dx, int dy) { this.x = this.x + dx; this.y = this.y + dy; /** * Diese Methode gibt die x-koordinate des Punkts zurueck * @return die x-koordinate des Punkts */ public int getx() { return this.x; /** * Diese Methode gibt die y-koordinate des Punkts zurueck * @return die y-koordinate des Punkts */ public int gety() { return this.y; Objekte und Klassen 9

Ansicht der Dokumentation Objekte und Klassen 10

Objekte und Klassen 11

Objekte und Klassen 12

Erzeugung der Dokumentation Mit dem Befehl javadoc Point.java wird automatisch eine Beschreibung der Klasse Point erzeugt und in die Datei Point.html geschrieben. Einführung und Grundbegriffe 13

Spezielle Tags für Javadoc @see @author @version @param @return für Verweise für Namen des Autors für die Version für die Methodenparameter für die Ergebniswerte von Methoden Einführung und Grundbegriffe 14

Beispiel: Klasse Line benützt die Klasse Point public class Line { private Point start; private Point end; public Line(Point s, Point e){ this.start = s; this.end = e; public void move(int dx, int dy){ this.start.move(dx,dy); this.end.move(dx,dy); public double length(){ int startx = this.start.getx(); int endx = this.end.getx(); int diffx = Math.abs(startX - endx); int starty = this.start.gety(); int endy = this.end.gety(); int diffy = Math.abs(startY - endy); //oder int diffy = Math.abs(this.start.getY()-this.end.getY()); return Math.sqrt(diffX * diffx + diffy * diffy)); Objekte und Klassen 15

Klassendeklarationen in Java (ohne Vererbung) public class C { private type 1 attr 1 ;... private type n attr n = expression n ; public C(params) {body... public void methodname 1 (params 1 ) {body 1... public type methodname k (params k ) {body k Beachte: 1. In einer Datei kann höchstens eine public Klasse deklariert sein. 2. Zu jeder konkreten Klasse C gibt es einen vordefinierten Standardkonstruktor C(). 3. Der Ergebnistyp einer Methode kann auch leer sein, dargestellt durch void. Objekte und Klassen 16

Klassendeklarationen in Java (ohne Vererbung) überall sichtbar nur in derselben Klasse verwendbar (empfohlen bei Attributen) Konstruktordeklaration Methodendeklaration public class C { private type 1 attr 1 ;... private type n attr n = expression n ; public C(params) {body... public void methodname 1 (params 1 ) {body 1... Klassenname Attribut/Instanzvariable/ Feld (engl. field) Formale Parameter public type methodname k (params k ) {body k Ergebnistyp Methodenkopf Methodenrumpf Objekte und Klassen 17

Grammatik für Klassendeklarationen (ohne Vererbung) ClassDeclaration = ["public"] "class" Identifier ClassBody ClassBody = "{"{FieldDeclaration ConstructorDeclaration MethodDeclaration"" FieldDeclaration = [Modifier ] VariableDeclaration Modifier = "public " "private" MethodDeclaration = Header Block Header = [Modifier ] (Type "void") Identifier "(" [FormalParameters] ")" FormalParameters = Type Identifier {"," Type Identifier ConstructorDeclaration ist wie MethodDeclaration, jedoch ohne (Type "void") im Header. Der Identifier im Header muss hier gleich dem Klassennamen sein. Methoden, deren Header einen Ergebnistyp Type hat, nennt man Methoden mit Ergebnis(typ). Objekte und Klassen 18

Objekte und ihre Speicherdarstellung Ein Objekt ist ein Behälter mit einer eindeutigen Objektidentität (Adresse), unter der man die Daten (Attributwerte) des Objekts findet => Objektzustand. Die aktuell während eines Programmlaufs existierenden Objekte werden mit ihrem aktuellen Zustand auf einem Heap ( Halde ) abgelegt. @123:Point x = 1 y = 2 Heap @345:C attr_1 =... attr_n = @234:Point x = 2 y = 1 Abstrakte Darstellung des Heaps: { <(@123,Point),[(x,1),(y,2)]>, <(@234,Point),[(x,2),(y,1)]>, <(@345,C),[(attr_1, ),...,(attr_n, )]> Objekte und Klassen 19

Wdh: Überblick Kapitel 3-5 Kapitel 5 Kapitel 3 Grunddatentypen Werte Operationen Ausdrücke Typisierung Auswertung bzgl. Zustand (Stack) erweitert um erweitert um erweitert um erweitert um erweitert um Klassendeklarationen Objekte und Objekthalde (Heap) Klassentypen Referenzen und null ==,!= für Referenzen und null Attributzugriff, Methodenaufruf mit Ergebnis, Objekterzeugungsausdruck Objekthalde (Heap) Objekte und Klassen 20

Klassentypen Im Folgenden werden die in Kapitel 3 und 4 eingeführten Konzepte für Typen, Ausdrücke und Anweisungen erweitert. (Eine nochmalige Erweiterung erfolgt später bei der Einführung von Arrays.) Type = PrimitiveType ClassType ( neu) ClassType = Identifier Mit jeder Klassendeklaration wird ein neuer Typ eingeführt (Klassentyp), der den Namen der Klasse hat. Die Werte eines Klassentyps sind Referenzen (Verweise, Zeiger, Links) auf Objekte der Klasse sowie das Element null ( leere Referenz). Dementsprechend speichern lokale Variable eines Klassentyps Referenzen auf Objekte oder den Wert null. Objekt-Referenzen können mit den Operationen == und!= auf Gleichheit bzw. Ungleichheit getestet werden. Achtung: Objekte einer Klasse K Werte des Klassentyps K. Objekte und Klassen 21

Zustand = Stack + Heap Ein Zustand (s,h) eines objektorientierten Java-Programms besteht aus einem Stack (Keller) s für die lokalen Variablen und einem Heap (Halde) h für die aktuell existierenden Objekte int i; boolean b; Line ln; Point p; i b ln p 3 false @345 @123 @123:Point x = 1 y = 2 @345:Line start=@123 end = @234 Point q; q @234 @234:Point x = 2 Lokale Variablen Stack s Heap h y = 1 Objekte und Klassen 22

Zustand mit Zeigerdarstellung i b ln p q 3 true :Point x = 1 y = 2 :Line start = end = :Point x = 2 Stack s Heap h y = 1 Beachte: Der Attributwert eines Objekts kann selbst wieder ein Verweis auf ein (anderes) Objekt sein. Objekte und Klassen 23

Gleichheit von Objektreferenzen i b ln p q 3 false :Point x = 2 y = 1 :Point :Line start = end = x = 2 Stack s Heap h y = 1 (p==q)= (s,h) false, (p!=q)= (s,h) true, (q==ln.end)= (s,h) true Objekte und Klassen 24

Wdh: Überblick Kapitel 3-5 Kapitel 5 Kapitel 3 Grunddatentypen Werte Operationen Ausdrücke Typisierung Auswertung bzgl. Zustand (Stack) erweitert um erweitert um erweitert um erweitert um erweitert um Klassendeklarationen Objekte und Objekthalde (Heap) Klassentypen Referenzen und null ==,!= für Referenzen und null Attributzugriff, Methodenaufruf mit Ergebnis, Objekterzeugungsausdruck Objekthalde (Heap) Objekte und Klassen 25

Erweiterte Grammatik für Ausdrücke im Kontext von Klassendeklarationen Expression = Variable Value Expression BinOp Expression UnOp Expression "(" Expression ")" MethodInvocation ( neu) InstanceCreation ( neu) Variable = NamedVariable FieldAccess ( neu) NamedVariable = Identifier FieldAccess = Expression "." Identifier ( neu) Value = IntegerValue FloatingPointValue CharacterValue BooleanValue "null" ( neu) Objekte und Klassen 26

Grammatik für Methodenaufruf- und Objekterzeugungs-Ausdrücke MethodInvocation = Expression "." Identifier "(" [ActualParameters] ") " ActualParameters = Expression {"," Expression InstanceCreation = ClassInstanceCreation ClassInstanceCreation = "new" ClassType "(" [ActualParameters] ") " Objekte und Klassen 27

Typ und Auswertung der neuen Ausdrücke Ein Ausdruck ist (wie bisher) typkorrekt, wenn ihm ein Typ zugeordnet werden kann. Die Auswertung eines Ausdrucks e erfolgt (jetzt) unter einem Zustand (s,h), d.h. wir berechnen e = (s,h) Der Attributzugriff mit "." und der Methodenaufruf mit "." haben die höchste Präzedenz 15. Wir bestimmen nun Regeln für Typkorrektheit und Auswertung für jeden neu hinzugekommenen Ausdruck. "null" : null ist ein Wert, dessen (namenloser) Typ passend zu jedem Klassentyp ist. Objekte und Klassen 28

Attributzugriff FieldAccess = Expression "." Identifier Der Ausdruck Expression muss einen Klassentyp haben und der Identifier muss ein Attribut der Klasse (oder einer Oberklasse, vgl. später) bezeichnen. Das Attribut muss im aktuellen Kontext sichtbar sein. FieldAccess hat dann denselben Typ wie das Attribut Identifier. Beispiel: Seien Point p; Line ln; lokale Variable. p.x hat den Typ int, ln.start hat den Typ Point, ln.start.y hat den Typ int. Objekte und Klassen 29

Attributzugriff: Auswertung i b ln p q 3 false :Point x = 1 y = 2 :Point :Line start = end = x = 2 Stack s Heap h y = 1 p.x, q.y, ln.end, ln.end.x, sind Variablen, deren Werte in einem Zustand (s,h) die Attributwerte der referenzierten Objekte sind. p.x = (s,h) 1, q.y = (s,h) 1, ln.end.x = (s,h) 2, Achtung: Falls kein Objekt referenziert wird, z.b. falls p = (s,h) null, dann erfolgt bei der Auswertung von p.x ein Laufzeitfehler. Objekte und Klassen 30

Methodenaufruf-Ausdruck MethodInvocation = Expression "." Identifier "(" [ActualParameters] ")" ActualParameters = Expression {"," Expression Ein Methodenaufruf-Ausdruck hat also die Form e.m(a 1,,a n ) Der Ausdruck e muss einen Klassentyp C haben und der Identifier m muss eine in der Klasse C (oder einer Oberklasse von C, vgl. später) deklarierte Methode mit Ergebnis bezeichnen: Type m (T 1 x 1,,T n x n ) {body Die aktuellen Parameter a 1,,a n sind Ausdrücke, die in Anzahl und Typ zu den formalen Parametern der Methodendeklaration passen müssen. Der Ausdruck e.m(a 1,,a n )hat dann als Typ den Ergebnistyp der Methode. Objekte und Klassen 31

Methodenaufruf-Ausdruck: Beispiele und Auswertung Seien Point p; Line ln; lokale Variable. p.getx() hat den Typ int, ln.start.gety() den Typ int. Sei (s,h) der Zustand von oben. p.getx() = (s,h) 1, ln.start.gety() = (s,h) 2. Bemerkungen: Die Berechnung der Ergebnisse von Methodenaufrufen basiert auf der Ausführung von Methodenrümpfen (vgl. unten). Im allgemeinen ist es möglich, dass der Aufruf einer Methode mit Ergebnistyp nicht nur einen Ergebniswert liefert sondern auch eine Zustandsänderung bewirkt (vgl. Kapitel 6). Objekte und Klassen 32

Objekterzeugungs-Ausdruck ClassInstanceCreation = "new" ClassType "(" [ActualParameters] ") " Eine Objekterzeugungs-Ausdruck hat also die Form new C(a 1,,a n ) C muss eine deklarierte Klasse sein. Wenn die aktuelle Parameterliste nicht leer ist, muss in der Klasse C ein Konstruktor definiert sein mit n formalen Parametern: C (T 1 x 1,,T n x n ) {body Die aktuellen Parameter a 1,,a n sind Ausdrücke, deren Typen zu den Typen T 1,,T n passen müssen. Der Ausdruck new C(a 1,,a n ) hat dann den Typ C. Beachte: Zu jeder Klasse C gibt es implizit einen Standard-Konstruktor C() ohne Parameter. Objekte und Klassen 33

Objekterzeugungs-Ausdruck: Beispiele und Auswertung Sei int i; eine lokale Variable. new Point() hat den Typ Point, new Point(1,2) hat den Typ Point, new Point(1,i) hat den Typ Point, (new Point(1,i)).getX() hat den Typ int. Mit dem Ausdruck new Point() wird 1. ein neues Objekt der Klasse Point erzeugt und auf den Heap gelegt, 2. die Felder des Objekts mit Defaultwerten initialisiert (0 bei int, false bei boolean, null bei Klassentypen), 3. eine Referenz auf das neu erzeugte Objekt als Ergebniswert geliefert. Mit dem Ausdruck new Point(1,2) wird der Rumpf des benutzer-definierten Konstruktors ausgeführt und damit den Attributen x, y des neu erzeugten Objekts die Werte 1 und 2 zugewiesen. (Allgemeine Vorschrift zur Ausführung von Objekterzeugung vgl. Kapitel 6). Objekte und Klassen 34