Inhalt der Vorlesung INE2 Objektorientierte Programmierung Lernziele ■Sie kennen die Grundsätze und Grundbegriffe der objektorientierten Programmierung anhand von Java Inhalt ■Objekte und Klassen ■Vererbung ■GUI, Eventhandling ■Applets vs. Applications ■Fehlersuche und Testen ■Exceptionhandling ■Abstrakte Klassen und Interfaces ■Threads ■Dateisystem, IO-Klassen, Streams ■Collections ■ Motivation ■ Objekte und Klassen ■ Kapselung und Geheimnisprinzip ■ Umgang mit einzelnen Objekten ■ Interaktion von Objekten ■ Klassenmethoden und Klassenvariablen ■ Entwurf von Klassen School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 2 von 54 Literaturliste und Links ■Java für Studenten Grundlagen der Programmierung Douglas Bell, Mike Parr, Prentice Hall ISBN 3-8273-7045-0 ■Java ist auch eine Insel, Christian Ullenboom, Galileo Computing, OnLineAusgabe: http://openbook.galileocomputing.de/javainsel8/ ■Handbuch der Java-Programmierung, Guido Krüger: on-Line-Ausgabe: http://www.javabuch.de/ ■The Java Programming Language Arnold, Gosling, Holmes ISBN 0-201-70433-1 ■The Java Tutorial, Third Edition A Short Course on the Basics Campione, Walrath, Huml ISBN 0-201-70393-9 Dieses Buch ist auch online verfügbar: http://java.sun.com/docs/books/tutorial/index.html ■Java API Specifications http://java.sun.com/reference/api/index.html School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege Motivation 3 von 54 School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 4 von 54 Motivation … Einführungsübung ■Kommentare zu PPG-Lösung: Aufgabe: Schreiben Sie ein Applet „PlayBalloon“ das 4 Ballone (gefüllte Kreise) unterschiedlicher Grösse und Farbe an unterschiedlichen Positionen darstellt! ■ Schreiben und verwenden Sie dabei eine Methode „drawBallon(...)“, welche einen Ballon zeichnet! ■ ■ ■ Probleme: ■Bei grösserer Anzahl Ballone wird es unübersichtlich Vorgehen: PPG ■Benötigte Variablen deklarieren ■ ■Benötigte Methoden schreiben ■ ■ ■Hauptprogramm (im init und paint) schreiben ■ Knopf „ok “ Æ Alle Ballone in der Grösse verändert und neu gezeichnet Æ ActionListener © A. Meier/M. Braschler/J. Zeman/K. Rege ■ ■ 5 von 54 … Einführungsübung: OOP-Lösung ■ ■ kleine Änderungen haben grosse Auswirkungen an das Programm Fehleranfällig und unflexibel schlechte Wart- und Erweiterbarkeit School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 6 von 54 … Einführungsübung: OOP-Lösung import java.awt.*; ■Bessere Lösung: OOP-Ansatz ■ Die Ballon-Variablen sind im Hauptprogramm deklariert (losgelöst von den Methoden, die sie verwenden) Sie müssen immer jeder Methode als Parameter übergeben werden. Eine Methode „changeSize“ zu schreiben, die den Durchmesser eines bestimmten Ballons verändert ist schwierig ■Wenn man den z.B. 5 Ballone anzeigen möchte,muss man das Programm an mehreren Stellen anpassen!!!!!! Anschliessende Erweiterung: School of Engineering So haben wir´s gelernt: Es ist eine sogenannte prozedurale Lösung (PPG) In der Methode steckt der mehrfach verwendete Code! Das Ganze ist eigentlich ganz gut programmiert! So hat man bis zur Einführung der sogenannten OOP programmiert! Ballone als Objekte einsetzen! PlayBalloon in einer eigenen Klasse programmieren! Balloon in einer eigenen Klasse programmieren! public class Balloon { Eigene EigeneKlasse Klasse„Balloon“ „Balloon“ verändert verändertseine seineGrösse Grösseselber selberund und kann sich selber kann sich selberanzeigen anzeigen private int diameter; private int xCoord, yCoord; private Color color; // Methods -> Die Lösung besteht nun aus 2 Klassen public void changeSize(int change){ diameter = diameter + change; ■Die eigene Klasse Balloon enthält ■ ■ ■ ■ } alle Variablen, die das Objekt charakterisieren (d, x, y, farbe). Mit Veränderung dieser Variablen kann das Objekt jederzeit gezeichnet oder seine Grösse verändert werden. Von aussen her kann man auf diese Variablen gar nicht zugreifen (Kapselung, Geheimnisprinzip). Alle Methoden, die für die Manipulation des Objektes im Programm notwendig sind. ■ Initialisierung der Eigenschaften Æ Konstruktor-Methode „Balloon“, die beim Erzeugen des Objektes (mit new) aufgerufen wird ■ Zeichnen des Ballons Æ „draw“ ■ Veränderung der Grösse Æ „changeSize“ ■ ………. School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 7 von 54 public void draw(Graphics g){ g.setColor(color); g.fillOval(xCoord, yCoord, diameter, diameter); } // Konstruktor public Balloon(int initialDiameter, int initialX, int initialY, Color initialColor){ diameter = initialDiameter; xCoord = initialX; yCoord = initialY; color = initialColor; } } School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 8 von 54 … Einführungsübung: OOP-Lösung import java.awt.*; import java.applet.*; import java.awt.event.*; public class PlayBalloon extends Applet implements ActionListener { TextField textfield; Button button; Balloon[] balloons; public void init() { textfield = new TextField("4"); add(textfield); button = new Button(" ok "); Objekte und Klassen button.addActionListener(this); add(button); balloons = new Balloon[4]; balloons[0] = new Balloon (50, 100, 400, Color.GREEN); balloons[1] = new Balloon (30, 400, 400, Color.RED); balloons[2] = new Balloon (40, 400, 100, Color.YELLOW); balloons[3] = new Balloon (90, 200, 150, Color.BLUE); } public void actionPerformed(ActionEvent ev) { int delta = Integer.parseInt(textfield.getText()); for (int i = 0; i < balloons.length; i++) { balloons[i].changeSize(delta); } repaint(); // …Fortsetzung public void paint(Graphics g) { for (int i = 0; i < balloons.length; i++) { balloons[i].draw(g); } } } } School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 9 von 54 Objekte und Klassen School of Engineering ■Beispiel: Ballon-Klasse ■OO-Programme bestehen aus einer Menge von Objekten, die miteinander kommunizieren/interagieren ■Daten ■ ■ ■Objekte = Daten und die dazugehörigen Methoden ■ 10 von 54 Objekte und Klassen Objekte ■ © A. Meier/M. Braschler/J. Zeman/K. Rege Daten (Synonyme: Attribute, Felder) bestimmen die Eigenschaften (unveränderlich) und den Zustand des Objekts Methoden bestimmen das Verhalten des Objekts und erlauben den Zugriff auf die internen Daten x-,y-Koordinaten Diameter des Ballons ■Methoden ■ ■ Änderung des Diameters Darstellung des Ballons x,y Koordinaten Durchmesser Klassen ■In vielen OOP-Sprachen ist es nicht möglich, ein Objekt direkt zu erzeugen. Zuerst muss die Struktur des Objekts angegeben werden (=Bauplan). Die Deklaration der Struktur heisst Klasse (class) School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 11 von 54 School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 12 von 54 Klassen Deklaration einer Klasse ■Objekte können in Java nicht direkt programmiert werden, sondern nur die Klasse, aus denen zur Laufzeit Objekte erzeugt werden (mittels new) ■Klasse für Ballonobjekte ■Klassendeklaration: ■Die Klasse ist der Bauplan für die Objekte ■Von einer Klasse können beliebig viele Objekte erzeugt (instanziert) werden ■Ein Objekt wird auch als Instanz (engl. instance) der Klasse bezeichnet ■Jedes Java Programm besteht aus mindestens einer Klasse. Bei grösseren Programmen können es auch tausende sein public class Balloon{ //Klassenname private int diameter; //Instanzvariablen private int xCoord, yCoord; private Color color; //Konstruktor zur Initialisierung public Balloon (int initialDiameter, int initialX, int initialY, Color initialColor){ diameter = initialDiameter; xCoord = initialX; (xCoord, yCoord) yCoord = initialY; color = initialColor; diameter } public void changeSize (int change) { diameter = diameter + change; } //Instanzmethode public void draw (Graphics g) { //Instanzmethode g.setColor(color); g.drawOval (xCoord, yCoord, diameter, diameter); } } School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 13 von 54 Deklaration einer Klasse Allgemeiner Aufbau einer Klasse class Klassenname { Instanzvariablen Konstruktorendeklaration Methodendeklaration } School of Engineering ■Spezielle Methode einer Klasse, dient zur Initialisierung der Variablen eines Objekts bei der Erzeugung Darstellung: Darstellung:Einrückung Einrückung beachten beachten! ! ■ ■ ■ ■ Referenzdatentyp, engl. reference type ■ ■Anmerkung: Es gibt in Java drei Arten von Referenzdatentypen: ■ ■ Klassentypen Arrays Schnittstellentypen (später) © A. Meier/M. Braschler/J. Zeman/K. Rege Balloon() {} // Objekt kann Instanziert werden ohne dass Konstruktor angegeben dieser wird wieder entfernt sobald eigener Konstruktor definiert wurde ■Beispiel: Konstruktor der Balloon-Klasse public Balloon (int initialDiameter, int initialX, int initialY, Color initialColor){ diameter = initialDiameter; xCoord = initialX; yCoord = initialY; color = initialColor; } ■Variablen von Referenztypen enthalten nicht Wert sondern Referenz School of Engineering Er hat keinen Rückgabewert Æ kein return und keine void Ein Konstruktor hat eine Parameterliste wie normale Methoden Der Zugriffsmodifikator ist normalerweise public ■Java definiert für alle Klassen Default-Konstruktor = Konstruktor ohne Parameter ■Klasse ist ein neuer benutzerdefinierter Datentyp ■ Der Konstruktor wird automatisch aufgerufen, wenn ein Objekt mit new erzeugt wird Dient zur Initialisierung des Objektzustands ■Der Konstruktor muss den gleichen Namen haben wie die Klasse ■ ■ 14 von 54 Konstruktor (constructor) ■Konvention Klassenname: Gross beginnen, Substantiv im Singular ■ © A. Meier/M. Braschler/J. Zeman/K. Rege 15 von 54 School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 16 von 54 Klassen und Dateien in Java Klassen und Packages ■ Klassen aus anderen Packages werden mittels import sichtbar ■Wie werden die Klassen in Dateien gespeichert? Æ Eine separate Datei pro Klasse. ■ Es ist üblich auch für eigene Klassen Packages zu definieren ■ ■Dabei ist zu beachten: ■ ■ ■ Jede Klasse muss public sein, da sie sonst nicht verwendet werden kann Andere verwendete Klassen werden mit import angegeben ■ import java.awt.Button; // die Klasse Button ■ import java.awt.*; // alle Klassen des Packages java.awt.* ■ Die Klassen sind hierarchisch in Pakete organisiert ■ ■ analog zur Organisation eines Verzeichnisbaumes (übersetzte Klassen und Quellen entsprechend) ■ Die Klasse muss sich im analogen Verzeichnisbaum befinden (zwingend!) package ch.test; public class HelloWorld { ■Werden mehrere Klassen in eine Datei gespeichert: ■ nur einmal und zuoberst im Programm Namen ist im Prinzip frei wählbar, aber oft Umkehrung einer URL; z.B. ch.zhaw.rege Eine Klasse muss public sein und gleich heissen wie Datei Alle übrigen dürfen nicht public sein ■Der Compiler erzeugt für jede Klasse ein eigenes .class-File mit dem Bytecode ■ Beim Aufruf muss der ganze Pfad mitgegeben werden (Gross/Kleinschreibung!) ■ c:\tmp> java ch.test.HelloWord ■ Die IDE erledigt das automatisch School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 17 von 54 School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 18 von 54 Kapselung und Geheimnisprinzip Prinzip der Kapselung (encapsulation) ■Daten und die zugehörigen Methoden werden in einer Einheit zusammengefasst. Geheimnisprinzip (information hiding) ■Eine Einheit (Objekt/Klasse) definiert eine klare Schnittstelle nach aussen Kapselung und Geheimnisprinzip ■Interne Daten (=Attribute) werden versteckt ■ private Attribute speichern Zustand von Objekten ■Schnittstelle bei Objekten: ■ ■ public-Methoden: Schnittstelle zu Objekten, ermöglichen Zugang zu den internen Daten public-Attribute: sollten vermieden werden!! Die Schnittstelle ist der "Vertrag" zwischen Implementator der Klasse und dem Verwender (muss nicht dieselbe Person sein) School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 19 von 54 School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 20 von 54 Kapselung und Geheimnisprinzip Übung public oder private?? ■Verstecken der Attibuten und Methoden: private ■ ■ ■ Zugriff auf Variablen/Attribute soll nur über Methoden erfolgen. Regel: sämtliche Attribute als private deklarieren (Geheimnisprinzip) Veränderung ausschliesslich mittels Setter-/Getter Methoden: Namenskonvention Innenansicht Innenansichtder derKlasse: Klasse: private Color c; public Color getColor() { return c; } public void setColor(Color c) { this.c = c; } ■ private private int int diameter; diameter; private private int int xCoord, xCoord, yCoord; yCoord; public int tuDasNicht; public int tuDasNicht; Nicht für den allgemeinen Gebrauch bestimmte Methoden sollen für den Benutzer nicht sichtbar sein ■Vorteile: ■ ■ ■ Durch den kontrollierten Zugriff auf die Variablen über Methoden bleiben die Daten der Objekte konsistent Vereinfachung (Anwender des Objektes muss nicht jedes Detail können) Implementation kann jederzeit geändert werden d.h. dadurch wird die Abhängigkeit der Benützung eines Objekts von seiner Implementation verkleinert School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 21 von 54 Sicht Sichtvon vonaussen aussen(für (fürden denBenutzer Benutzerdes desObjekts): Objekts): public void changeSize (int change) { public void changeSize (int change) { int x,y; int x,y; ... ... }} public public void void draw draw (Graphics (Graphics g) g) {{ ... ... } } public public void void changeSize changeSize (int (int change) change) public public void void draw draw (Graphics (Graphics g)} g)} public public int int getTuDasNicht() getTuDasNicht() {…} {…} public public setTuDasNicht(int setTuDasNicht(int wert) wert) {…} {…} private private void void flaeche(float flaeche(float d) d) {{ if if (d (d >> 0.0){...} 0.0){...} else else return; return; }} Zugriff von aussen: public int getTuDasNicht() {…} public setTuDasNicht(int wert) {…} School of Engineering public public int int tuDasNicht; tuDasNicht; objektname.tuDasNicht = 20; objektname.changeSize(+10); objektname.draw(g); © A. Meier/M. Braschler/J. Zeman/K. Rege 22 von 54 Deklaration von Objektvariablen Deklaration: Instanzvariablen werden Instanzvariablen werden in Klasse automatisch zu in Klasse automatisch zu null initialisiert null initialisiert Balloon myBalloon null als alslokale lokaleVariablen Variablen müssen müssensie sieexplizit explizitzu zu null gesetzt null gesetztwerden werden Es wird eine (Referenz-) Variable vom Typ Balloon deklariert Umgang mit einzelnen Objekten ■myBalloon zeigt auf null ■Balloon ist eine Klasse. Sie definiert einen Referenz-Datentyp (die Variable myBalloon ist eine Referenzvariable, d.h. sie enthält nur die Adresse des (noch zu erzeugenden) Objektes). ■Das Objekt besteht noch nicht! ■Pro memoria: Variablennamen klein beginnen School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 23 von 54 School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 24 von 54 Erzeugung von Objekten: Instanzierung null, NullPointerException ■null ist ein Java Schlüsselwort Ein Objekt mit new erzeugen: Es bezeichnet ein Objekt, dass nicht existiert (Eine Referenz/Adresse=0) ■ Deklaration: Instanzierung: new Balloon myBalloon null myBalloon ■Objekt explizit erzeugen und initialisieren: myBalloon = new Balloon(20,50,50); ■ ■ ■ ■Beispiel von vorher: Balloon myBalloon; Balloon int diameter int xcoord int ycoord Erst jetzt wir ein Objekt der Klasse Balloon erzeugt und Speicherplatz reserviert Jetzt zeigt myBalloon auf ein Balloon-Objekt Bei der Erzeugung mit new wird automatisch eine Contructor-Methode dieser Klasse Aufgerufen Æ verwendet z.B. für die Initialisierung der Instanzvariablen (hier: diameter=20, xcoord=50, ycoord=50). und dann: myBalloon.changeSize(10); geht nicht: Æ NullPointerException!! myBalloon null Verwendung ■Wenn nicht sicher, dass Instanziert dann vor dem Zugriff testen: if (myBalloon != null)myBalloon.changeSize(10); ■Kurzschreibung: Balloon myBalloon = new Balloon(20,50,50); ■Variablen können/müssen auch explizit auf null gesetzt werden, z.B. wenn als lokale Variablen gebraucht myBalloon = null; School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 25 von 54 © A. Meier/M. Braschler/J. Zeman/K. Rege 26 von 54 Wrapper Klassen this ■ this ist ein Schlüsselwort ■ School of Engineering ■Objekte einfacher Datentypen Es bezeichnet das "eigene" Objekt ■Einfache Datentypen (boolean, char, int, long, float, double etc.): Verwendung ■ ■ Wenn zwischen Instanzvariablen und Parameter unterschieden werden muss ■ int x; ■ Variablen einfacher Datentypen sind keine Objekte Sie sind nach der Deklaration sofort verwendbar Vordefinierte Operationen (+,-,*,/ etc.) Wrapper-Klassen void init (int x) { this.x = x; } ■Manchmal möchte man diese Variablen wie Objekte behandeln, z.B. Methode nur für Objekte vorhanden ■ Wenn eigene Instanz einer Methode übergeben werden soll ■Wrapper classes in Java: Boolean, Character, Integer, Long, Float, Double button.addActionListener(this); ■Variablen einfacher Datentypen können in Objekte der entsprechenden Wrapper-Klasse umgewandelt werden; ab Java 6 automatisch (Boxing) Integer i = 5; // früher i = new Integer(5); int k = i; School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 27 von 54 School of Engineering // früher k = i.intValue(); © A. Meier/M. Braschler/J. Zeman/K. Rege 28 von 54 Vergleich Objekten: equals toString ■ equals ist eine Methode, die jedes Objekt automatisch besitzt ■ toString ist eine Methode, die jedes Objekt automatisch besitzt ■ sie überprüft ob zwei Objekte den gleichen Wert enthalten ■ ■ Test auf Gleichheit am Beispiel Strings ■ sie wandelt das Objekt in einen String um ■ automatisch (implizit) wenn in einem String mit "+" verwendet häufige gemachter Fehler: verwenden von "==": String s = "abc"; // new String("abc") String t = "abc"; // new String("abc") ■ if (s == t) {} : testet auf Gleichheit von Referenz = false String s = "hallo " + counter ■ explizit wenn toString aufgerufen wird ■ String s = "hallo "+ counter.toString() ■ equals-Methode von String/Objekt verwenden ■ Achtung: strukturierte Typen und Arrays nicht automatisch vernünftige Stringrepräsentation (-> später) if (s.equals(t)) {} : teste auf Gleichheit von Wert = true ss "abc" "abc" s == t; tt School of Engineering s.equals(t); String[] t = {"hallo","welt"} String s = ""+ t; // [Ljava.lang.String;@c55e36 "abc" "abc" © A. Meier/M. Braschler/J. Zeman/K. Rege 29 von 54 School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 30 von 54 Löschen von Objekten ■Objekte können sehr viel Speicherplatz beanspruchen Æ Nicht mehr benutzte Objekte sollen aus dem Speicher (Heap) entfernt werden ■Wie/Wann werden Objekte wieder gelöscht? ■Möglichkeit: Der Programmierer löscht sie selber (Fehlerquelle!) ■ in C/C++ mittels free oder delete gelöst Interaktion von Objekten ■Java hat einen Hintergrundprozess (läuft periodisch), der die nicht mehr benutzten Objekte löscht Æ Garbage Collector ■Nicht mehr benutzte Objekte = es gibt keine Referenzen auf das Objekt ■ Tip: es kann von Vorteil sein, Variablen explizit zu null zu setzen School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 31 von 54 School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 32 von 54 Interaktion von Objekten Interaktion von Objekten Programmablauf bei Applets ■Der Browser/Appletviewer erzeugt implizit ein Objekt der Klasse PlayBalloon: appObj = new PlayBalloon(); ■actionPerformed(ActionEvent e) wird jedes Mal aufgerufen, wenn ein Button gedrückt wird ■paint() wird jedes Mal aufgerufen, wenn das Applet neu gezeichet wird Æ Ruft die draw–Methode vom myBalloon–Objekt auf .class School of Engineering init start paint yourBalloon yourBalloon Objekt ObjektmyBalloon myBalloon r=20, r=20,x=50, x=50,x=50 x=50 ■Es wird nur die Referenz (Adresse des Objektes) kopiert, nicht das Objekt selber Æ myBalloon und yourBalloon zeigen auf das gleiche Objekt! Anmerkung: Für das Kopieren von Objekten muss man spezielle Methoden aufrufen Applet ■ © A. Meier/M. Braschler/J. Zeman/K. Rege myBalloon myBalloon ■1. Zuweisung: Balloon myBalloon = new Balloon(20,50,50); Balloon yourBalloon = null; yourBalloon = myBallon; ■Der Browser ruft die Methode init() des Applet-Objekts appObj auf. Dort werden Buttons und das Balloon-Objekt erzeugt Browser/AppletViewer JVM JVM ■Objekte sind Referenzdatentypen Æ anderes Verhalten als normale Variable wie int, double 33 von 54 yourBalloon = myBalloon.clone(); // Balloon muss jedoch dafür Cloneable Interface implementieren und clone() mit public Methode überschreiben (-> später) School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 34 von 54 Methodenaufruf/Returnwert Eigene Klassen als Referenzdatentypen ■ Klassen sind strukturierte Datentypen public class MyClass { public double a; private Balloon methodeA(Balloon b){ Instanzvariablen Instanzvariablen Ausnahme: Ausnahme:hier hierpublic public b.changeSize(-10); return b; Konstruktur Konstruktur ■gleich wie Klassenname ■gleich wie Klassenname public double b; public MyClass(double a, double b) { } yourBalloon = methodeA(myBallon); ■kein void ■kein void this.a = a; this.b = b; } Beispiel: Es soll eine Methode geschrieben werden, die Buttons erzeugt } ■ Deklaration der Variablen; Erzeugen des Wertes MyClass me = new MyClass(4.5,5.1) MyClass you; ■ Verwendung you = me; double d = me.a + me.b; me me Objekt ObjektButton Button double doublea,a,bb you you you.a = 5.5 School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 35 von 54 School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 36 von 54 Überladen von Methoden Interaktion von Objekten Operationen auf Objekten ■Eine Klasse kann mehrere Methoden mit dem gleichen Namen haben! ■Objekte kann man erzeugen (new), zuweisen (=) und als Argument einer ■Voraussetzung ist, das die überladenen Methoden unterschiedliche Parameterlisten haben Methode übergeben. ■Die normalen Operatoren ( + - * / > < && ¦¦ etc.) funktionieren nicht mit Objekten. ■ == und != sind die einzigen Operatoren, die auch für Objekte gültig sind. Achtung: Diese haben nicht die gleiche Bedeutung wie bei einfachen Datentypen: public void moveRight(int distance){ xCoord += distance; } public void moveRight(){ xCoord += 20; } //Methode 1 //Methode 2 ■ Aufruf: moveRight(293); //Methode 1 moveRight(); //Methode 2 if (myBalloon == yourBalloon) {...} Typ: der Vergleich mittels == bei Referenztypen gar nicht verwenden School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 37 von 54 School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 38 von 54 Überladen von Konstruktoren ■ Häufig wird das Überladen von Methoden bei Konstruktoren gebraucht, da dort der Konstruktorenname gleich dem Klassenname ist Balloon(Color c) {…} Balloon(Color c, int size, int x, int y) {…} ■ Es kann in einem Konstruktor ein andere (derselben Klasse) aufgerufen werden Klassenmethoden und Klassenvariablen Balloon (Color c) { this(c, DEFAULTSIZE,DEFAULTPOSX,DEFAULTPOSY); … } School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 39 von 54 School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 40 von 54 Klassenvariablen: static Klassenmethoden: static ■ Klassenmethoden gehören zur Klasse, nicht zu den Objekten ■Klassenvariablen gehören zur Klasse, nicht zu den Objekten ■ Klassenvariablen entsprechen globalen Variablen in anderen Sprachen ■ können aufgerufen werden, ohne dass eine Instanz erzeugt wird ■ Beispiel: ■Es gibt nur eine Kopie pro Klassenvariable, egal wie viele Objekte von der Klasse instanziert wurden ■ ■ ■ Zugriff: Klassenname.Variablenname Beispiel in der Balloon-Klasse: Math.sin(), Math.random() ■ Einschränkung: es kann nicht auf Instanzmethoden, Instanzvariablen zugegriffen werden. public static double gravity = 9.81; public static int balloonCount = 0; //Deklaration public Balloon (..) { balloonCount++; // zählt wie viele Ballone erzeugt wurden } ■Weitere Anwendung, die Sie schon gesehen haben: ■ Konstanten, die in der Klasse deklariert sind: Color.RED, Math.PI public static final double PI = 3.14……; //final = unveränderbar School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 41 von 54 …Klassenvariablen + Klassenmethoden School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 42 von 54 Instanz vs. vs. Klasse 43 von 54 Instanzvariablen/-methoden Klassenvariablen/-methoden Gehören zum jeweiligen Objekt (1 Kopie pro Instanz) Gehören zur Klasse, nicht zu den Objekten (Nur 1 Kopie pro Klasse) Der Aufruf einer Instanzmethode erfolgt via den Objektnamen: myBalloon.changeSize(45); Der Aufruf einer Klassenmethode erfolgt über den Klassennamen: Balloon.setGravity(9.81f); Der Aufruf einer Instanzvariablen erfolgt via den Objektnamen Der Aufruf einer Klassenvariablen erfolgt via den Klassenname: Balloon.gravity Wenn der Wert einer Instanzvariablen geändert wird, so ändert der Wert der Variablen nur für dieses Objekt Wenn der Wert einer Klassenvariablen geändert wird, wirkt sich die Änderung in allen Objekten aus Es braucht zuerst ein Objekt, um Instanzvariablen oder –methoden aufzurufen Es braucht kein Objekt, um Klassenvariablen oder –methoden aufzurufen School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 44 von 54 Das objektorientierte Programmierparadigma die gute Idee: ■ die Struktur der Software spiegelt die Realität wieder: ■ klar unterscheidbare Einheiten (Klassen/Objekte) ■ die untereinander Meldungen austauschen i.e. interagieren Entwurf von Klassen Elektrik Elektrik Steuerrad Steuerrad Motor Motor Scheinwerfer Scheinwerfer Bremslichter Bremslichter Vorderräder Vorderräder School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 45 von 54 Begriff Objekte und Klassen School of Engineering Hinterräder Hinterräder © A. Meier/M. Braschler/J. Zeman/K. Rege Bauplan von Objekten ■ Objekte erlauben in OOP-Programmen die Wirklichkeit im Programm direkt zu modellieren Verschiedene ähnliche Objekte zusammenfassen ■ Objekte sind Ausprägungen (Exemplare, Instanzen) eines gemeinsamen Grundmusters/Vorlage/Bauplans Æ Klasse ■ es ist mühsam die Objekt immer von Grund auf neu zu beschreiben ■ Beispiel: Programm für Simulation von Autos ■ -> erstellen eines "Bauplan" zur Erstellung von Objekten Klasse Objekt 1: rotesAuto Objekt Objekt2:2:blauesAuto blauesAuto Farbe: Farbe:rot rot Preis: Preis:300'000.300'000.Geschwindigkeit: Geschwindigkeit:300 300 Tankinhalt: Tankinhalt:100 100 Farbe: Farbe:blau blau Preis: Preis:-50.-50.Geschwindigkeit: Geschwindigkeit:80 80 Tankinhalt: Tankinhalt:17 17 beschleunigen beschleunigen bremsen bremsen tanken tanken links linksabbiegen abbiegen rechts rechtsabbiegen abbiegen beschleunigen beschleunigen bremsen bremsen tanken tanken links linksabbiegen abbiegen rechts rechtsabbiegen abbiegen School of Engineering ■ anhand dieses Bauplans können Objekte bei Bedarf erzeugt werden Objekt 2: blauesAuto Objekt Objekt1:1:rotesAuto rotesAuto © A. Meier/M. Braschler/J. Zeman/K. Rege 46 von 54 ■ Bauplan für Objekte, die zwar gleiches Verhalten aber unterschiedlichen Zustand haben Eigenschaften (Daten, sog. Attribute) Die Variablen, in denen der aktuelle Zustand gespeichert wird, werden als Attribute bezeichnet Verhalten (sog. Methoden) Der Bauplan wird als Klasse bezeichnet 47 von 54 School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 48 von 54 Die Klasse als Bauplan von Objekten mit gleichem Verhalten … Klassen und Erzeugung von Objekten Klasse: Klasse: Auto Auto Color: Color:farbe farbe double: double:preis preis double:geschwindigkeit double:geschwindigkeit double: tankinhalt double: tankinhalt beschleunigen beschleunigen bremsen bremsen tanken tanken linksAbbiegen linksAbbiegen rechtsAbbiegen rechtsAbbiegen Eigenschaften (sog. Attribute) Klasse Objekt ■ rotesAuto = new Auto(rot, 20, 30, 50, 80); rotesAuto.linksAbbiegen(); // Methodenaufruf die Attribute das Verhalten (durch Methoden) 49 von 54 Objekt = Instanz einer Klasse ■ bei der Instanzierung werden den Attributen konkrete Werte zugewiesen -> Objekt bekommt einen Zustand School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege Attribute: Zustand und Eigenschaften Zusammenfassung ■ Zwei Arten von Attributen: ■ Motivation ■ Eigenschaft: i.d.R. Konstant während der Lebensdauer des Objekts ■ Objekte und Klassen solche die einmal festgelegt werden und dann während der Lebensdauer des Objekts sich nicht verändern (bei der Instanzierung festgelegt werden) Bsp: Automarke, Motorleistung ■ Zustand: Variabel ■ ■ Mein Auto ■ der Vorgang der Erzeugung von Objekten wird als Instanzierung bezeichnet ■ © A. Meier/M. Braschler/J. Zeman/K. Rege Instanzierung ■ Klasse beschreibt Ein konkretes Objekt (Instanz einer zum voraus programmierten Klasse) kann wie folgt im Programm kreiert und verwendet werden: ■ Attribute Objekte ■ ■ String Marke Color Farbe beschleunigen bremsen tanken Bill Gates Ferrari Die Baupläne kennen mögliche Zuständswertebereiche (= ausgedrückt durch den Typ) aber keine expliziten Zustandswerte (werden beim Objekt festgelegt) School of Engineering Klasse Methoden Instanzierung Verhalten (sog. Methoden) PKW 50 von 54 ■ Kapselung und Geheimnisprinzip ■ Umgang mit einzelnen Objekten ■ Interaktion von Objekten solche die sich verändern können Bsp: Geschwindigkeit, Tankfüllung ■ Klassenmethoden und Klassenvariablen ■ Entwurf von Klassen ■ Objekte einer Klasse können sich im Zustand und den Eigenschaften unterscheiden nicht aber im Verhalten ■ Verhalten ■ ■ ■ Bsp: jedes Auto kann "beschleunigen" kann durch Zustand beeinflusst sein Bsp: beschleunigen ist abhängig von der Motorleistung und Tankfüllung School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 51 von 54 School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 52 von 54 Lösung: Balloon mit PPG Lösung: Balloon mit PPG import java.awt.*; Button button = new Button (" ok "); import java.applet.*; int change=10; // Radius-Change import java.awt.*; import java.awt.event.*; public void init() { setSize(600, 600); add (button ); button .addActionListener(this); } public class Balloon_ppg extends Applet implements ActionListener{ // Eigenschaften Balloon1 int balloon1_d=50; //Durchmesser int balloon1_x=100; // Koordinaten linke ober Ecke int balloon1_y=400; Color balloon1_farbe=Color.GREEN; public void paint(Graphics g) { drawBallon(g, balloon1_d, balloon1_x, drawBallon(g, balloon2_d, balloon2_x, drawBallon(g, balloon3_d, balloon3_x, drawBallon(g, balloon4_d, balloon4_x, } //Farbe // Eigenschaften Balloon2 int balloon2_d=30; int balloon2_x=400; balloon1_y, balloon2_y, balloon3_y, balloon4_y, balloon1_farbe); balloon2_farbe); balloon3_farbe); balloon4_farbe); int balloon2_y=400; Color balloon2_farbe=Color.RED; private void drawBallon(Graphics g1, int d, int x, int y, Color f){ g1.setColor(f); g1.fillOval (x, y, d, d); } // Eigenschaften Balloon3 int balloon3_d=40; int balloon3_x=400; int balloon3_y=100; public void actionPerformed(ActionEvent e) { // Grösse ändern und neu Zeichnen: schwierig als allg. Methode // changeSize zu realisieren balloon1_d = balloon1_d+change; balloon2_d = balloon2_d+change; balloon3_d = balloon3_d+change; balloon4_d = balloon4_d+change; repaint(); } Color balloon3_farbe=Color.YELLOW; // Eigenschaften Balloon4 int balloon4_d=90; int balloon4_x=200; int balloon4_y=150; Color balloon4_farbe=Color.BLUE; School of Engineering } © A. Meier/M. Braschler/J. Zeman/K. Rege 53 von 54 School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 54 von 54