Fragen zur OOP in Java

Ähnliche Dokumente
Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

3 Objektorientierte Konzepte in Java

Einstieg in die Informatik mit Java

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Javakurs für Anfänger

Silke Trißl, Prof. Ulf Leser Wissensmanagement in der Bioinformatik. Jede Applikation braucht eine Klasse mit einer main-methode

Repetitorium Informatik (Java)

Algorithmen und Datenstrukturen

Java Vererbung. Inhalt

Programmieren in Java

3 Objektorientierte Konzepte in Java

Prof. W. Henrich Seite 1

Vorkurs C++ Programmierung

Java Einführung Klassendefinitionen

Einstieg in die Informatik mit Java

Java Einführung Methoden in Klassen

Aufbau von Klassen. class punkt {...

Inhaltsüberblick. I. Grundbegriffe - Objekte und Klassen. Organisatorisches. I. Grundbegriffe - Objektorientierte Konzepte

5.5.8 Öffentliche und private Eigenschaften

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

Java Schulung (Java 2 Java Development Kit 5 / 6)

Grundzüge der Programmierung. Wiederverwendung VERERBUNG

AuD-Tafelübung T-B5b

Objektorientierte Programmierung mit Java. Grundlagen Übersicht. Programmiersprachen

Anwendungsentwicklung mit Java. Grundlagen der OOP, Vererbung, Schnittstellen, Polymorphie

3 Klassen, Attribute, Methoden

Probeklausur: Programmierung WS04/05

Klassen in Java. Klassen

Javakurs für Anfänger

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

4 Vererbung, Polymorphie

Objektorientierte Programmierung

Graphische Benutzungsoberflächen mit Java. Einführung in NetBeans

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

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

OOP und Angewandte Mathematik. Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik

Einführung in die Programmierung

Programmieren I. Strategie zum Entwurf von Klassen. Beispiele. Design von Klassen. Dr. Klaus Höppner. Beispiel: Bibliothek

Übersicht. Informatik 2 Teil 3 Anwendungsbeispiel für objektorientierte Programmierung

Programmieren in Java

Java I Vorlesung Vererbung und Sichtbarkeit

Javakurs für Anfänger

Probeklausur: Programmierung WS04/05

Überschreiben von Methoden

Klassen mit Instanzmethoden

Vorlesung Programmieren. Bisher: Klassen und Objekte. Was ist mit ähnlichen Klassen? Vererbung und Polymorphismus

Java Einführung Methoden. Kapitel 6

Javakurs 2013 Objektorientierung

Objektorientierte Programmierung. Kapitel 12: Interfaces

Java I Vorlesung 6 Referenz-Datentypen

Algorithmen und Programmierung II

5.4 Klassen und Objekte

Kapitel 6. Vererbung

Vererbung. Martin Wirsing. Ziele. Vererbung

Vererbung. Was versteht man unter dem Begriff Vererbung?

Programmierkurs Java. Vererbung. Prof. Dr. Stefan Fischer Institut für Telematik, Universität zu Lübeck

Kapitel 6. Vererbung

Übung 1: Object Inspector

Objekt-Orientierte Programmierung

Algorithmen und Datenstrukturen 07

7. Schnittstellen Grundlagen zu Schnittstellen. 7. Schnittstellen

Vererbung & Schnittstellen in C#

Programmierung mit C Zeiger

6 Speicherorganisation

Beispiel für überladene Methode

einkonto.zahle(+100); //Transaktion Einzahlung einkonto.zahle(-20); //Transaktion Auszahlung einkonto.zahle(+30); //Transaktion Einzahlung

Computeranwendung und Programmierung (CuP)

C# im Vergleich zu Java

Interfaces und Vererbung

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 22

Java für Computerlinguisten

5.6 Vererbung. Vererbung

Beispiel: Zwischen der Oberklasse und der abgeleiteten Klasse besteht eine ist ein Beziehung. Eine abgeleitete Klasse stellt eine Spezialisierung der

Kapitel 6. Vererbung

Applet Firewall und Freigabe der Objekte

Einführung in die Informatik

Methoden (fortgeschritten) in C# - 1

Objektorientierte Programmierung. Objektorientierte Programmierung. Klasse. Objekt. Beispiel: Sportfest1. Methode. Eine Einführung mit BlueJ

3D Programmierpraktikum: Einführung in C++ - Teil 2

Java: Vererbung. Teil 3: super()

Theorie zu Übung 8 Implementierung in Java

GetName(), GetName(), GetGeschlecht() und AelterWerden().

Übersicht. 4.1 Ausdrücke. 4.2 Funktionale Algorithmen. 4.3 Anweisungen. 4.4 Imperative Algorithmen Variablen und Konstanten. 4.4.

Der Operator this. Wir betrachten nochmals die Klassendefinition von Ballon.

Einführung in die Java- Programmierung

Java Kurs für Anfänger Einheit 5 Methoden

Präsentation Interfaces

Beispiel: Methode mit einem Fehler. Diese Methode wird problematisch, wenn von außen eine Dauer von 0 Sekunden angegeben wird, etwa im Aufruf

3. Konzepte der objektorientierten Programmierung

5. Tutorium zu Programmieren

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

Programmierung und Angewandte Mathematik

Grundlagen der Programmierung Prof. H. Mössenböck. 10. Klassen

Propädeutikum zur Programmierung

Übungsaufgaben: 1. Objektorientierte Programmierung - Teil 1

13. Tutorium zu Programmieren

Java Einführung Abstrakte Klassen und Interfaces

Java Einführung Umsetzung von Beziehungen zwischen Klassen. Kapitel 7

Wiederholung zur Vorlesung Programmieren

Transkript:

- 1 - Inhalt Was bedeutet OOP?... 2 Was versteht man unter einer Klasse?... 2 Wie nennt man die Mitglieder einer Klasse?... 2 Wie erzeugt man Objekte?... 2 Wie greife ich auf Member einer Klasse zu?... 2 Wie lösche ich eine Instanz?... 3 Worauf ist beim Umgang mit Instanzvariablen zu achten?... 3 Wie kann ich innerhalb einer Klasse auf die Instanz dieser Klasse selbst zugreifen?... 3 Wie kann ich beliebig viele Instanzen einer Klasse speichern?... 3 Wie kann ich alle Objekte einer Liste durchlaufen?... 4 Was versteht man unter statischen Feldern?... 4 Was sind Konstanten?... 4 Vererbung in der OOP... 5 Methoden in abgeleiteten Klassen... 5 Methoden überschreiben... 6 Methoden überladen... 7

- 2 - Fragen zur OOP in Java Was bedeutet OOP? = objektorientierte Programmierung Der Programmierer arbeitet mit Objekten, die Eigenschaften (properties), Methoden und Ereignisse (events) enthalten können. Was versteht man unter einer Klasse? Die Klasse enthält den Bauplan eines Objekts. Deklaration: Wie nennt man die Mitglieder einer Klasse? = member. Damit meint man sowohl Felder (= die im äußersten Block der Klasse definierten Variablen, Konstanten, etc.) als auch Methoden. Von Variablen spricht man nur innerhalb von Methoden! int breite; // member 1: ein Feld breite private void berechnen() // member 2: eine Methode berechnen int x = breite * 2; // eine lokale Variable x in der Methode berechnen Wie erzeugt man Objekte? Durch den Aufruf des Konstruktors, den jede Klasse (automatisch) besitzt und der den gleichen Namen wie die Klasse trägt: public Auto() // der Konstruktor Auto a = new Auto(); // Aufruf des Konstruktors mit new, Startadresse der Instanz wird in der Variable a gespeichert Dieses entsprechend dem Bauplan erzeugte Objekt = Instanz (man instanziert ein Objekt). Sie wird irgendwo im Arbeitsspeicher abgelegt, die Variable a enthält eigentlich nur die Startadresse dieser Instanz und ist daher immer 4 Bytes groß. Wie greife ich auf Member einer Klasse zu? Über die Variable (durch Punkt getrennt), in der ihre Startadresse gespeichert wurde (sog. referenzieren ): a.breite = 100; Auf Felder sollte man allerdings einen solchen Zugriff von außen besser nicht erlauben, sondern stattdessen den Umweg über eigens dafür geschriebene Methoden (sog. Zugriffsmethoden - Getter bzw. Setter ) verwenden (dieses Verbergen von Feldern nennt man Kapselung ):

- 3 - Die Setter und Getter innerhalb der Klasse: public void setbreite(int x) // Setter : erwartet als Parameter einen Wert, den er in das Feld breite schreibt breite = x; public int getbreite() // Getter : liefert den Inhalt des Feldes breite return breite; // return = abschicken Von außen werden nur diese Zugriffsmethoden aufgerufen, nicht mehr das Feld breite selbst: a.setbreite(100); // über den Setter einen Wert in das Feld breite schreiben int b = a.getbreite(); // über den Getter den Inhalt des Feldes breite lesen Wie lösche ich eine Instanz? Indem ich der Variable, die ihre Startadresse enthält, null zuweise. Der sog. Garbage Collector entfernt automatisch das nunmehr verwaiste Objekt aus dem Speicher. a = null; Worauf ist beim Umgang mit Instanzvariablen zu achten? Sie enthalten möglicherweise nicht mehr (oder noch nicht 1 ) eine gültige Adresse. Bevor man über sie auf die Instanz zugreift, muss man daher (wenn man sich nicht sicher ist) ihre Gültigkeit überprüfen: if(a!= null) a.breite = 100; Wie kann ich innerhalb einer Klasse auf die Instanz dieser Klasse selbst zugreifen? Mit dem Schlüsselwort this (typische Anwendung: im Konstruktor soll ein Feld durch einen Parameter, der dem Konstruktor mitgeschickt wird, initialisiert werden): string typ; // Feld, das im Konstruktor initialisiert werden soll public Auto(string typ) // der Konstruktor erwartet einen string-parameter this.typ = typ; // da Parameter und Feld den gleichen Namen tragen, muss this zur Unterscheidung eingesetzt werden Wie kann ich beliebig viele Instanzen einer Klasse speichern? In einer ArrayList. Sie muss davor allerdings selbst einmal instanziert werden! In eckiger Klammer wird die Klasse eingetragen, deren Instanzen in dieser ArrayList gespeichert werden dürfen (in unserem Beispiel: Klasse Auto ), danach können mit der Methode add beliebig viele Instanzen dieser Klasse ( Auto ) in die Liste aufgenommen werden: ArrayList<Auto> liautos; // Variable deklarieren, die die Instanz der Liste selbst speichert. In eckiger Klammer: nur Instanzen der Klasse Auto dürfen in diese Liste aufgenommen werden liautos = new ArrayList<>(); // Liste erzeugen und in der Variablen liautos speichern Auto a = new Auto(); // eine neue Instanz der Klasse Auto erzeugen liautos.add(a); // diese neue Auto-Instanz der Liste hinzufügen 1 wenn eine Instanzvariable deklariert, aber noch nicht mit new der Konstruktor aufgerufen wurde, enthält sie noch nichts: Auto a; // diese Instanzvariable wurde vorerst nur deklariert. Sie enthält noch nichts

- 4 - Weitere Methoden der ArrayList: liautos.remove(a); // eine bestimmte Instanz aus der Liste entfernen. Wenn dies nicht möglich ist (z.b. weil diese Instanz in der Liste gar nicht existiert), liefert die Methode als Rückgabewert false liautos.remove(10); // das 11.Objekt der Liste löschen liautos.removeall(); // die Liste leeren Auto a = liautos.get(5); // liefert das 6.Objekt der Liste int anzahl = liautos.size(); // liefert die Anzahl der Objekte, die die Liste enthält Wie kann ich alle Objekte einer Liste durchlaufen? In einer for-schleife (die Anzahl der Objekte liefert size(), der Zugriff erfolgt über get() ): for(int i=0; i < liautos.size(); i++) liautos.get(i).setbreite(100); // in allen Autos dieser Liste das Feld breite beschreiben Für den Lesezugriff (d.h. wenn man keinem Feld etwas zuweist) ist auch eine einfachere for-schleife erlaubt: for (Auto a : liautos) a.berechnen(); // kein Schreibzugriff, sondern nur Aufruf einer Methode Was versteht man unter statischen Feldern? Felder, die mit dem Schlüsselwort static gekennzeichnet werden und nur in der Klassendeklaration, nicht aber in den Instanzen vorhanden sind (sie existieren also nur einmal). Zugriff daher über den Klassennamen, nicht über den Instanznamen: static int leistung; int l = Auto.leistung; // Zugriff über Klassennamen Statische Felder eignen sich gut als globale Felder, auf die alle Klassen zugreifen können Was sind Konstanten? = statische Felder mit dem Schlüsselwort final. Sie enthalten nur den Startwert, mit dem sie initialisiert wurden und können danach nicht mehr verändert werden: final static int HAUS = 0; final static int BAUM = 1; Konstanten werden üblicherweise groß geschrieben und dienen in erster Linie dazu, statt Zahlen aussagekräftigere Wörter verwenden zu können: arbilder = new Image[BAUM + 1]; // Array für 2 Bilder erzeugen arbilder[haus] = ImageIO.read(new File("haus.png")); // das erste Bild laden arbilder[baum] = ImageIO.read(new File("baum.png")); // das zweite Bild laden

- 5 - Vererbung in der OOP Eine Klasse kann von einer anderen Klasse mit dem Schlüsselwort extends abgeleitet werden und erbt dadurch alle Member, die nicht private sind: public class Obj Image img; private int anzahl; // dieses Feld wird nicht vererbt, weil es private ist public class Gebäude extends Obj // die abgeleitete Klasse hat automatisch Zugriff auf die Felder img und pos der Basisklasse, aber nicht auf das private Feld anzahl Wenn in der Basisklasse ein Konstruktor deklariert wurde, muss dieser auch in der abgeleiteten vorhanden sein (mit denselben Parametern) und vor allen anderen Anweisungen mit super() aufgerufen werden public Obj public Obj(Point pos) // Konstruktor mit Point-Parameter this.pos = pos; public class Gebäude extends Obj public Gebäude(Point p) // Konstruktor mit Point Parameter wie in der Basisklasse (der Name des Parameters kann beliebig sein, der Datentyp muss aber übereinstimmen) super(p); // als erste Anweisung den Konstruktor der Basisklasse aufrufen und alle Parameter übergeben, die dieser erwartet (hier: ein Parameter vom Datentyp Point ) Nach super() kann die abgeleitete Klasse beliebige neue Anweisungen in ihren Konstruktor einbauen. Sie werden ausgeführt, nachdem der Konstruktor der Basisklasse abgearbeitet wurde. Methoden in abgeleiteten Klassen Alle Member, also auch die Methoden der Basisklasse, werden vererbt und sind somit in der abgeleiteten Klasse automatisch verfügbar: public Obj void zeichnen(graphics g)// Methode in der Basisklasse deklarieren g.drawimage(img, pos.x, pos.y, null);

- 6 - Zugriff auf diese Methode ist nun sowohl in Instanzen der Basisklasse als auch in Instanzen der abgeleiteten Klasse möglich: Obj o = new Obj(new Point(10,10)); // Instanz der Basisklasse Obj erzeugen o.zeichnen(g); // Aufruf der zeichnen-methode in der Instanz der Basisklasse Gebäude geb = new Gebäude(new Point(100,34)); // Instanz der abgeleiteten Klasse Gebäude geb.zeichnen(g); // Aufruf der zeichnen-methode auch in der Instanz der abgeleiteten Klasse Gebäude Methoden überschreiben So praktisch die Vererbung von Methoden auch ist, kommt es denoch oft vor, dass sie in der abgeleiteten Klassen in veränderter Form benötigt werden. Z.B. könnte bereits in der Basisklasse eine Methode action() deklariert sein, weil in unserem Programm alle Objekte in irgendeiner Art Aktionen durchführen sollen. Im Detail aber unterscheiden sich diese Aktionen möglicherweise erheblich (ein Bauer mäht Getreide, ein Soldat hält nach Feinden Ausschau, ein Wolf jagt Rehe, die ihrereseits grasen, Bäume bewegen sich im Wind,...). Mit @Override (einer sog. Annotation ) vor der Methode wird sie als überschrieben gekennzeichnet. Nach wie vor erbt die Klasse die Methode, aber ihr Inhalt kann völlig anders sein als in der public Obj void action()// Methode in der Basisklasse deklarieren... // in der Basisklasse vorhandene Anweisungen public Bauer extends Obj @Override // als überschrieben markieren void action()... // eigene Anweisungen in der abgeleiteten Klasse Wenn man alle Objekte in einer ArrayList speichert, kann man in einer einzigen Schleife die Methode action() von all diesen Objekten aufrufen, ohne wissen zu müssen, was sie denn eigentlich tun. Die Objekte selbst kümmern sich darum. Im folgenden Beispiel gehen wir davon aus, dass es eine ArrayList liobj gibt, die alle Objektinstanzen enthält, die im Programm erzeugt wurden: for(int i=0; i < liobj.size(); i++) liobj.get(i).action(); // von jedem in der ArryList gespeicherten Objekt die Methode action() aufrufen Manchmal sollen die Anweisungen nicht vollständig ersetzt, sondern lediglich ergänzt werden. In diesem Fall kann man mit super.action() zuerst die Anweisungen der Basisklasse ausführen lassen:

- 7 - public Bauer extends Obj @Override void action() super.action(); // zuerst die Anweisungen der Basisklasse ausführen...; // erst danach die neuen Anweisungen hinzufügen, die für die abgeleitete Klasse benötigt werden Methoden überladen Überladene Methoden sind Methoden mit dem gleichen Namen, aber unterschiedlichen Parametern. Java selbst verwendet solche überladene Methoden ausgiebig. Von drawimage z.b. gibt es 6 Varianten (in Originalgröße, vergrößert, nur Ausschnitt,...), die alle drawimage heißen: g.drawimage(img, x, y, null); g.drawimage(img, x, y, breite, höhe, null); g.drawimage(img, x, y, breite, höhe, ausx, ausy, ausbreite, aushöhe, null);