Java Grundlagen 2 - OOP

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

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

Vorkurs Informatik WiSe 15/16

Vorkurs Informatik WiSe 15/16

Programmierung Nachklausurtutorium

Algorithmen und Datenstrukturen

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

Vererbung, Polymorphie

12 Abstrakte Klassen, finale Klassen und Interfaces

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

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Algorithmen und Datenstrukturen 07

Fragen zur OOP in Java

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

Programmieren in Java

IT I: Heute. abstrakte Methoden und Klassen. Interfaces. Interfaces List, Set und Collection IT I - VO 7 1

6. Globalübung (zu Übungsblatt 8)

Schlussendlich geben wir die Listen aus. Es kommt zu folgender Ausgabe:

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Programmieren in Java -Eingangstest-

! 1. Unterklassen und Vererbung! 2. Abstrakte Klassen und Interfaces! 3. Modularität und Pakete. II.4.2 Abstrakte Klassen und Interfaces - 1 -

4. Vererbung Die Klasse Object. Die Klasse Object

Javakurs für Anfänger

Grundelemente objektorientierter Sprachen (1)

Objektorientierte Programmierung Studiengang Medieninformatik

II.4.2 Abstrakte Klassen und Interfaces - 1 -

Grundelemente objektorientierter Sprachen (1)

Vererbung und Polymorphie

Tag 8 Repetitorium Informatik (Java)

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

Das Interface-Konzept am Beispiel der Sprache Java

Repetitorium Informatik (Java)

Informatik II Übung 6

Grundzüge der Programmierung. Wiederverwendung VERERBUNG

Einführung in die Programmiersprache Java II

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

Implementieren von Klassen

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Probeklausur: Programmierung WS04/05

Programmieren II. Innere Klassen. Heusch 10, Ratz 5.2.1, Institut für Angewandte Informatik

Objektorientierung (OO)

Java Methoden. Informatik 1 für Nebenfachstudierende Grundmodul. Kai-Steffen Hielscher Folienversion: 1. Februar 2017

Informatik II Übung 06. Benjamin Hepp 5 April 2017

Objektorientierte Programmierung III

Einführung in das Programmieren Probeklausur Lösungen

Programmiermethodik 1. Klausur

Programmieren in Java

Methoden und Klassen. Silke Trißl Wissensmanagement in der Bioinformatik

Silke Trißl Wissensmanagement in der Bioinformatik. Objektorientierte Programmierung (OOP) Vorstellung wie in der realen Welt: Farbe Hubraum Tank...

Universität Karlsruhe (TH)

Java Vererbung. Inhalt

Polymorphie/Späte Bindung Abstrakte Klassen Interfaces. Polymorphie/Späte Bindung Abstrakte Klassen Interfaces

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

IT I: Heute. Klasse Object. equals, hashcode, tostring. HashSet IT I - VO 6 1

Objektorientierte Programmierung Studiengang Medieninformatik

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

Arten von Klassen-Beziehungen

Einstieg in die Informatik mit Java

14 Abstrakte Klassen, finale Klassen, Interfaces

Wiederholung. Klassenhierarchie:

AuD-Tafelübung T-B5b

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

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

Interfaces und Vererbung

II.4.5 Generische Datentypen - 1 -

14 Abstrakte Klassen, finale Klassen, Interfaces

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

Polymorphie. 15. Java Objektorientierung II

Einstieg in die Informatik mit Java

EINFÜHRUNG IN DIE PROGRAMMIERUNG

Polymorphie. 15. Java Objektorientierung II

Propädeutikum Programmierung in der Bioinformatik

Überschreiben von Methoden

Transkript:

Institut für Programmierung und Reaktive Systeme Java Grundlagen 2 - OOP Markus Reschke 20.08.2014

Eine kleine Geschichte 1 Spezifikation Es sollen Formen in einer GUI angezeigt werden: Ein Quadrat, ein Kreis und ein Dreieck. Wenn der Benutzer auf eine Form klickt, so soll diese sich um 360 drehen und es soll eine AIF Audiodatei abgespielt werden, welche für jede Form eine andere ist. Zwei Programmierer: Larry und Brad Wer zuerst liefert, bekommt einen neuen Bürostuhl. Larry arbeitet prozedual Brad arbeitet objektorientiert 1 Entnommen aus Head First Java - Second Edition, Kapitel 2

Die erste Version Larry überlegt sich: Was muss das Programm machen? Welche Methoden werden dazu gebraucht? rotate und playsound rotate ( shapenum ) { // Rotiere Form um 360 Grad } playsound ( shapenum ) { // Schau nach, welche AIF zur Form gehoert // Spiele Datei ab } Brad überlegt sich: Welche Dinge tauchen im Programm auf? Die Formen, aber auch der User, der Click, der Sound etc. (diese werden hier vernachlässigt) class Triangle { rotate () { // Drehe ein Dreieck } playsound () { // Spiele AIF fuer ein Dreieck ab } } class Circle { rotate () { // Drehe einen Kreis } playsound () { // Spiele AIF fuer einen Kreis ab } } class Square { rotate () { // Drehe ein Rechteck } playsound () { // Spiele AIF fuer ein Rechteck ab } }

Aber... Larry wird als erster fertig. Aber es gibt eine Änderung der Spezifikation: Erweiterung der Spezifikation Es soll nun eine amöbenartige Form in der GUI geben. Wenn sie angeklickt wird, soll sie sich wie die anderen Formen drehen und eine HIF Sounddatei abspielen. (Bild aus HFJ)

V2 Larry muss zwar nicht viel an seinem Code ändern, aber er muss bereits getesteten und erprobten Code ändern. 1 playsound ( shapenum ) { 2 if (/* Form ist keine Amoebe */) { 3 // Schau nach, welche AIF zur Form gehoert 4 // Spiele Datei ab 5 } else { 6 // Spiele Amoeben HIF Sounddatei ab 7 } 8 } Brad schreibt eine neue Klasse für die Amöbe. Den bereits existierenden Code für die anderen Formen muss er nicht anfassen. 1 class Amoeba { 2 rotate () { 3 // Drehe Amoebe 4 } 5 playsound () { 6 // Spiele HIF fuer ein Amoebe ab 7 } 8 }

Der Projektmanager schlägt wieder zu Larry wird wieder als erster fertig. Aber es noch gibt eine Änderung der Spezifikation: Änderung der Spezifikation Brad und Larry haben die Amöbe um den Mittelpunkt des kleinsten Rechtecks um die Amöbe gedreht. Die Amöbe soll sich um einen frei festlegbaren Punkt drehen. (Bild nach HFJ)

V3 Larry muss diesmal viel ändern, da rotate neue Paramter bekommen hat. Er muss also auch alle Stellen ändern, andenen rotate benutzt wird. 1 rotate ( shapenum, xpt, ypt ) { 2 if (/* Form ist keine Amoebe */) { 3 // Rotiere um Box - Mittelpunkt 4 } else { 5 // Rotiere um xpt und ypt 6 } 7 } Brad passt die rotate-methode der Amöben-Klasse an. Für den Rotationspunkt erweitert er die Klasse um zwei Attribute. Ansonsten muss er nur Stellen verändern, an denen Amöben erzeugt werden, anderen Code muss er nicht anfassen. 1 class Amoeba { 2 int xpoint 3 int ypoint 4 rotate () { 5 // Drehe Amoebe um xpoint und ypoint 6 } 7 playsound () { 8 // Unveraendert 9 } 10 }

Der Trick mit der Vererbung Verursacht Brads OOP Ansatz dopelten Code zwischen den Methoden? Nicht umbedingt Auslagern gemeinsamer Eigenschaften in übergeordnete Klasse Vererbung Bild aus Head First Java - Second Edition

Bild aus Head First Java - Second Edition Noch ein Trick: Spezialisierung durch Überschreiben Nun würden aber alle Formen gleich rotieren Die Amöbe würde das Verhalten der Elternklasse erben. Methoden können in Unterklassen geändert werden Überschreiben von Methoden

OOP Objekte = Verhalten (durch Methoden) + Daten (durch Attribute) Klassen = Baupläne für Objekte Kapselung von Programmteilen Einfacheres Ändern von Programmen Wiederverwendung von Programmteilen Markus Reschke Java Grundlagen 2 - OOP 10 Institut für Programmierung und Reaktive Systeme

Klassen in Java 1 ZugriffsBeschraenker class KlassenName { 2 // Attribute 3 // Methoden 4 } Eine Klasse mit public-zugriffsbeschränker pro.java-datei

Attribute in Java Attribute beschreiben die Daten, die jedes Objekt speichert Klasse gibt an, welche Attribute Objekte dieser Klasse haben Jedes Objekt verfügt über eine eigene Kopie dieser Attribute Änderungen an den Attributen eines Objektes wirken sich nur auf dieses Objekt aus Attribute sollen fast immer private sein. Werden fast wie lokale Variablen definiert. 1 ZugriffsBeschraenker class KlassenName { 2 T attributsname ; 3 T attributsname = Initialisierungswert. 4 // Methoden 5 }

Methoden Methoden sind die Aktionen, die mit einem Objekt ausgeführt werden können Statische Methoden kennen wir schon Unterschied zu statischen Methoden: Sie arbeiten auf einzelne Objekte 1 ZugriffsBeschraenker class KlassenName { 2 // Attribute 3 Zugriffsbeschraenker Rueckgabetyp name ( T1 Paramter1,...) { 4 // Anweisungen 5 } 6 }

Zugriffsbeschränker Zugriffsbeschränker erlauben es, Elemente von Klassen vor dem Zugriff von außen versteckt. Dies erschwert unsachgemäße Verwendung von Objekten und erleichtert Kapselung. Beschränker Klasse Paket Unterklassen Rest public Y Y Y Y protected Y Y Y N keine Angabe Y Y N N private Y N N N Normalerweise reichen public und private. Markus Reschke Java Grundlagen 2 - OOP 14 Institut für Programmierung und Reaktive Systeme

Beispiel: Counter 1 public class Counter { 2 private int count ; 3 4 public void increase () { 5 count ++; 6 } 7 8 public int getcount () { 9 return count ; 10 } 11 12 public void reset () { 13 count = 0; 14 } 15 }

Erzeugen von Objekten Wir können nun selber Klassen erstellen, wie werden diese nun verwendet? new erzeugt neue Objekte auf dem Heap. Syntax: new Klassenname(Konstruktorparameter) new gibt eine Referenz auf das neue Objekt zurück Stack Heap obj, Counter, Counter { count, int, 1 description, String, } String {... } 1 Counter c = new Counter ();

Der. Operator Wir können jetzt neue Objekte erzeugen. Wie benutzt man nun ein Objekt? Der.-Operator kann auf eine Referenz angewendet werden, um auf die Attribute und Methoden des referenzierten Objektes zuzugreifen. Voraussetzung ist, dass der Zugriff erlaubt ist (Beschränker) Syntax: referenz.element 1 Counter c = new Counter (); 2 c. increase (); 3 c. increase (); 4 c. reset (); Markus Reschke Java Grundlagen 2 - OOP 17 Institut für Programmierung und Reaktive Systeme

Konstruktoren Oft müssen beim Erzeugen von Objekten Attribute initialisiert werden Vom Benutzer der Klasse zu verlangen, dass er die Attribute selber nach dem Erzeugen setzt, kann zu Fehlern führen Konstruktoren sind Methoden, die beim Erzeugen des Objektes aufgerufen werden. Kein Rückgabetyp, Gleicher Name wie Klasse Falls keiner selber definiert: Default Konstruktor ohne Parameter Klassenname() wird automatisch erzeugt Konstruktoren werden nicht vererbt

Beispiel: Counter 1 public class Counter { 2 private int count ; 3 4 public Counter () { 5 this (1) ; 6 } 7 8 public Counter ( int start ) { 9 count = start ; 10 } 11 12 public void increase () { 13 count ++; 14 } 15 16 public int getcount () { 17 return count ; 18 } 19 20 public void reset () { 21 count = 0; 22 } 23 }

Verdecken von Attributen und this Lokale Variablen und Methodenparameter können Attribute verdecken Zugriff auf lokale Variable anstatt aufs Attribut this ist eine Referenz auf das aktuelle Objekt. Kann benutzt werden, um trotz des Verdeckens auf das Attribut zuzugreifen. Markus Reschke Java Grundlagen 2 - OOP 20 Institut für Programmierung und Reaktive Systeme

Was Passiert? 1 public class Counter { 2 private int count = 100; 3 4 public void nichtverdeckt () { 5 System. out. println ( count ); 6 } 7 8 public void verdeckt () { 9 int count = 0; 10 System. out. println ( count ); 11 } 12 13 public void verdecktparam ( int count ) { 14 System. out. println ( count ); 15 } 16 17 public void verdecktthis () { 18 int count = 0; 19 System. out. println ( this. count ); 20 } 21 }

static static markiert Elemente von Klassen als statisch Wird normalerweise hinter dem Zugriffsbeschränker angegeben Für statische Attribute existiert nur eine einzige Kopie, die von allen Objektinstanzen dieser Klasse geteilt wird. Statische Methoden können ohne Objektinstanz genutzt werden, dürfen aber auch nur auf statische Elemente der Klasse zugreifen Nicht-statische Attribute existieren ja nur für Objektinstanzen, statische Methodenaufrufe operieren auf keinem Objekt Zugriff mit Klassenname.Element Markus Reschke Java Grundlagen 2 - OOP 22 Institut für Programmierung und Reaktive Systeme

Was Passiert? 1 public class Statisch { 2 public int a = 0; 3 public static int b = 1; 4 5 public static void main ( String [] args ) { 6 Statisch n1 = new Statisch (); 7 n1. a = 1; 8 Statisch n2 = new Statisch (); 9 n2. a = 2; 10 System. out. println (n1.a); 11 System. out. println (n2.a); 12 n1. b = 5; 13 System. out. println (n1.b); 14 System. out. println (n2.b); 15 System. out. println ( Statisch.b); 16 } 17 }

Überladen von Methoden Mehrere Methoden in einer Klasse können den selben Namen haben Müssen sich in der Parameterliste unterscheiden (durch andere Typen, andere Anzahl von Parametern oder beidem) Rückgabetyp wird nicht zur Unterscheidung herangezogen Auswahl der passenden Methode geschieht zur Kompilierzeit Markus Reschke Java Grundlagen 2 - OOP 24 Institut für Programmierung und Reaktive Systeme

Was Passiert? 1 public class Overload { 2 3 public void foo ( Object a) { 4 System. out. println (" Das war ein Object "); 5 } 6 7 public void foo ( String a) { 8 System. out. println (" Das war ein String "); 9 } 10 11 public static void main ( String [] args ) { 12 Overload o = new Overload (); 13 Object obj = new String (" Foobar "); 14 o. foo ( obj ); 15 String str = new String (" Foobar "); 16 o. foo ( str ); 17 } 18 19 }

final final vor Attributen und lokalen Variablen verhindert das Ändern derer Werte Für Referenttypen heißt dies: Es kann nicht geändert werden, worauf die Referenz zeigt. Das referenzierte Objekt ansich ist jedoch noch veränderbar. final vor Klassen: Von der Klasse kann nicht geerbt werden final vor Methoden: Kein Überschreiben möglich 1 import java. util.*; 2 public class Fin { 3 public static final List < String > l = new ArrayList < String >() ; 4 public static final int ANSWER = 42; 5 6 public static void main ( String [] args ) { 7 System. out. println (l); 8 // Geht nicht, da l final ist 9 // l = new ArrayList < String >() ; 10 // Das referenzierte Objekt selbst kann geaendert werden 11 l. add (" Test "); 12 System. out. println (l); 13 } 14 }

Vererbung in Java Vererbung ermöglicht es, Klassen zu spezialisieren Wiederverwendung vorhandener Klassen Kindsklasse erhält alle Attribute und Methoden der Elternklasse Syntax: class Kindsklasse extends Elternklasse... Objekte der Kindsklasse sind auch Objekte der Elternklasse Kindsklasse kann Methoden ändern (überschreiben), Zugriff auf Version der Elternklasse mit super Jede Klasse hat genau eine direkte Elternklasse, ohne Angabe Object

Ein schneller Counter 1 public class Counter { 2 private int count ; 3 4 public Counter ( int start ) { 5 this. count = start ; 6 } 7 8 protected setcount ( int count ) { 9 this. count = count ; 10 } 11 12 public void increase () { 13 count ++; 14 } 15 16 public int getcount () { 17 return count ; 18 } 19 20 public void reset () { 21 count = 0; 22 } 23 }

Ein schneller Counter Wichtig: Kindsklasse darf nicht auf private Elemente der Elternklasse zugreifen! Wichtig: Konstruktoren werden nicht vererbt! setcount ist protected, damit die Unterklasse, den Counter freier setzen kann Alternativ: Mehrfache Benutzung von increase der Elternklasse 1 public class FastCounter extends Counter { 2 3 public FastCounter ( int start ) { 4 super ( start ); 5 } 6 7 public void increase () { 8 setcount ( getcount () + 2); 9 } 10 } 1 public void increase () { 2 super. increase (); 3 super. increase (); 4 }

Polymorphie Jedes Objekt einer Kindsklasse ist auch ein Objekt seiner Elternklassen. 1 Counter c = new FastCounter (0) ; Java löst Methodenaufrufe auf Objekte zur Laufzeit auf 1 c. increase (); // Ruft increase von FastCounter auf, obwohl c eine Counter - Referenz ist 2 System. out. println (c. getcount ()); // <- 2 Es wird die Methode des Typs des referenzierten Objektes aufgerufen, nicht die vom Typ der Referenz! Das Objekt selbst weiß, wie es was tun muss

Was passiert? 1 public class A { 2 public void say () { 3 System. out. println (" Klasse A"); 4 } 5 } 6 7 public class B extends A { 8 public void say () { 9 System. out. println (" Klasse B"); 10 } 11 } 12... 13 A a = new A(); 14 a. say (); 15 B b = new B(); 16 b. say (); 17 A b2 = new B(); 18 b2.say ();

== und Referenzen == vergleicht für Referenzdatentypen nur, ob beide Referenzen auf das selbe Objekt zeigen. 1 Counter a = new Counter (0) ; 2 Counter b = new Counter (0) ; 3 System. out. println (a == b); 4 Counter c = a; 5 System. out. println (a == c);

equals Alle Klassen erben von Object Object hat Methode public boolean equals(object o) Ohne Überschreiben wie == Kann in Unterklasse überschrieben werden, um wertemäßig zu vergleichen Da eine Referenz auf ein Object übergeben wird, muss man beim überschreiben auf zwei Sachen achten: null und den richtigen Typ o intanceof Klasse gibt true zurück, wenn o nicht null ist und ein Objekt vom Typ der angegebenen Klasse ist

Counter equals() 1 public class Counter { 2 public boolean equals ( Object o) { 3 if (!( o instanceof Counter )) { 4 return false ; // o null oder falscher Typ 5 } 6 Counter c = ( Counter ) o; 7 return o. getcount () == getcount (); 8 } 9 } 10 11 Counter a = new Counter (0) ; 12 Counter b = new Counter (0) ; 13 System. out. println (a. equals (b)); 14 Counter c = a; 15 System. out. println (a. equals (c));

Abstrakte Klassen Klassen, von denen keine Objektinstanzen erzeugt werden können Baupläne für andere Klassen Sind mit abstract markiert. Können Methoden ohne Implementierung enthalten Diese Methoden müssen auch mit abstract markiert werden. Markus Reschke Java Grundlagen 2 - OOP 35 Institut für Programmierung und Reaktive Systeme

Ein abstrakter Counter 1 public abstract class IntCounter { 2 private int count ; 3 4 public IntCounter ( int start ) { 5 this. count = start ; 6 } 7 8 protected setcount ( int count ) { 9 this. count = count ; 10 } 11 12 public abstract void increase (); 13 14 public int getcount () { 15 return count ; 16 } 17 18 public void reset () { 19 count = 0; 20 } 21 }

Interfaces Interfaces geben an, über welche Methoden eine Klasse verfügt Es wird jedoch keine Implementierung mitgegeben. Eine Klasse kann beliebig viele Interfaces implementieren (im Vergeich zum Erben) Die Definition eines Interfaces wird mit interface eingeleitet. Klassen implementieren Interfaces mit implements. Interfaces sind Typen Gegen Interfacetyp programmieren Implementierungen einfach austauchbar 1 ZugriffsBeschraenker interface KlassenName { 2 // Statische Konstanten ( public, static, final sind implizit ) 3 int ANSWER = 42; 4 // Abstrakte Methoden ( abstract, public sind implizit ) 5 void foo (); 6 }

Demo Demo: UnaryCounter.java ICounter.java IntCounter.java Main.java Markus Reschke Java Grundlagen 2 - OOP 38 Institut für Programmierung und Reaktive Systeme

Überblick und Ausblick Warum OOP? Klassen Attribute Methoden static Vererbung Abstrakte Klassen und Interfaces Morgen: Weitere Sprachfeatures von Java Markus Reschke Java Grundlagen 2 - OOP 39 Institut für Programmierung und Reaktive Systeme