Inhalt Objektorientierte Programmierung in Java Mark Giereth Teil 1. Grundlagen der Objektorientierung Teil 2. Einführung in Java Teil 3. Beispiel: Entwicklung eines kleinen Web-Browsers und Eclipse-Demo Objektorientierte Programmierung in Java, Mark Giereth 29.01.2004 2 Motivation • Datenorientierte Sichtweise: • Gruppierung von Daten zu komplexen Typen • Definition von Operationen, die Daten verarbeiten • Daten vor inkonsistenten Veränderungen schützen, indem Zugriff auf die Daten Beschränkt wird Teil 1: Grundlagen der Objektorientierung • Wiederverwendung von Code • Einfachere Anpassbarkeit von Code • Bessere Wartbarkeit • Die Wartung von Softwaresystemen nimmt den größten Teil des Lebenszyklus ein und ist daher besonders kostenintensiv • Objektorientierte Systeme ermöglichen einen strukturierteren Systementwurf Objektorientierte Programmierung in Java, Mark Giereth 29.01.2004 3 Objektorientierte Programmierung in Java, Mark Giereth 29.01.2004 4 Objekte Klassen und Instanzen • (Software-)Objekte besitzen einen internen Zustand und haben ein festgelegtes Verhalten • Ein Objekt • verwaltet seinen Zustand durch Variablen, Attribute genannt • implementiert sein Verhalten durch Funktionen, Methoden genannt Attribute (Zustand) Methoden (Verhalten) Objektorientierte Programmierung in Java, Mark Giereth 29.01.2004 5 • Klassen sind Vorlagen für die Erzeugung von Objekten • Jedes Objekt gehört einer Klasse an • Die Attribute und Methoden der Objekte werden in der zugehörigen Klasse definiert • Die Klasse legt den Typ eines Objekts fest • Alle Objekte einer Klasse besitzen dasselbe Verhalten, da sie dieselbe Implementierung der Methoden besitzen • Objekte einer Klasse werden auch als Instanzen (instance) oder Exemplare bezeichnet • Klassen können auch Methoden und Attribute besitzen, die für die Klasse selbst und nicht für jede Instanz gelten. Diese werden als Klassen-Methoden/-Attribute bezeichnet (im Gegensatz zu Instanz-Methoden/-Attribute) Objektorientierte Programmierung in Java, Mark Giereth Instantiierung 29.01.2004 6 Beispiel Position y • Die Erzeugung von Objekten wird Instantiierung (instantiation) genannt setze y • Es wird Speicherplatz für das Objekt auf dem Heap allokiert (abhängig von den Datentypen der Attribute) • Bei der Instantiierung wird ein Konstruktor (spezielle Methode) ausgeführt, der die Initialisierung des Objekts vornimmt • Es werden den Attributen Werte zugeordnet, wodurch der Zustand des Objekts definiert wird Klasse Position x lese y lese x zeichne Figur setze x berechne Fläche Geometrische Figur Position y = -11 Position y = 10 Position x = 30 Position x = 20 • entweder definiert durch den Konstruktor • oder Default-Werte (0 für Zahlen, null für Referenzen, etc.) Instanz 1 • Die Instantiierung eines Objekts erfolgt mit dem new-Operator Instanz 2 Figur 1 Objektorientierte Programmierung in Java, Mark Giereth 29.01.2004 7 Objektorientierte Programmierung in Java, Mark Giereth Figur 2 29.01.2004 8 UML Notation Vererbung Position y • Die Unified Modeling Language (UML) ist eine Notation zur Spezifikation und Visualisierung von Modellen für Softwaresysteme • In den folgenden Folien werden Klassendiagramme zur Beschreibung von Klassen und deren Beziehungen untereinander verwendet setze y • Vererbung (inheritance) ist ein Konzept, wodurch Attribute und Methoden der Oberklasse auch den Unterklassen zugänglich gemacht werden • Vererbungsbeziehungen zwischen Klassen stellen Generalisierungs- bzw. Spezialisierungsbeziehungen dar Position x lese y lese x zeichne Figur setze x berechne Fläche Geometrische Figur GeomFigure x:int y:int Klassenname Attribute GeomFigure() setX(x:int):int setY(y:int):int getX():int getY():int getArea():float drawFigure():void Objektorientierte Programmierung in Java, Mark Giereth 29.01.2004 Oberklasse/ Superklasse Methoden und Konstruktoren 9 Vererbung GeomFigure() setX(x:int):int setY(y:int):int getX():int getY():int getArea():float drawFigure():void Rectangle() setWidth(x:int):int setHeight(y:int):int getWidth():int getHeight():int Circle radius:int Circle() setRadius(x:int):int getRadius():int Objektorientierte Programmierung in Java, Mark Giereth Circle Objektorientierte Programmierung in Java, Mark Giereth 29.01.2004 10 • Hat eine Methode einer Subklasse die gleiche Signatur einer Methode der Superklasse, so wird die Superklassenmethode überschrieben (overriding) • Gibt es mehrere Methoden mit demselben Namen aber mit unterschiedlichen Signaturen, so spricht man von Überladen (overloading) Aber: Methoden müssen denselben Rückgabewert haben! • Ein Objekt einer Unterklasse (z.B. Rechteck, Kreis) kann auch einer Variablen vom Typ der Oberklasse (z.B. GeomFirgure) zugewiesen werden (upcasting) width:int height:int GeomFigure Rectangle Vererbung Rectangle x:int y:int Unterklassen/ Subklassen GeomFigure Vererbungsbeziehung als nichtausgefüllter Pfeil von der Unter- zur Oberklasse 29.01.2004 11 Objektorientierte Programmierung in Java, Mark Giereth 29.01.2004 12 Abstrakte Klassen und Interfaces Abstrakte Klassen • Abstrakte Klassen sind Klassen, die mindestens eine abstrakte Methode haben • Abstrakte Methoden besitzen keine Implementierung. • Von abstrakten Klassen können keine Instanzen erzeugt werden • Unterklassen müssen entweder die abstrakten Methoden implementieren oder sind ebenfalls abstrakt • Interfaces sind abstrakte Klassen, die nur aus abstrakten Methoden bestehen. Sie repräsentieren eine definierte Schnittstelle als eine Menge von welche die jeweilige Klasse implementieren muss Methoden. Objektorientierte Programmierung in Java, Mark Giereth 29.01.2004 13 Rectangle GeomFigure {abstract} width:int height:int x:int y:int GeomFigure() setX(x:int):int setY(y:int):int getX():int getY():int getArea():float {abstract} drawFigure():void {abstract} Da für getArea() und drawFigure() keine sinnvolle Implementierung möglich ist, werden diese Methoden als abstract gekennzeichnet und müssen von allen nicht abstrakten Unterklassen implementiert werden. Objektorientierte Programmierung in Java, Mark Giereth Rectangle() setWidth(x:int):int setHeight(y:int):int getWidth():int getHeight():int getArea():float drawFigure():void Circle radius:int Circle() setRadius(x:int):int getRadius():int getArea():float drawFigure():void 29.01.2004 14 Zusammenfassung • Objekte • besitzen Attribute und Methoden • gehören einer Klasse an Teil 2: Einführung in Java • Klassen • legen Methoden und Attribute der Objekte fest • können Klassen-Methoden/-Attribute besitzen • können abstrakt sein • Instantiierung • Objekte werden auf dem Heap erzeugt • den Attributen werden Werte zugeordnet • Konstruktoren werden ausgeführt • Vererbung • Attribute und Methoden der Oberklasse werden den Unterklassen zugänglich gemacht • Interfaces Objektorientierte Programmierung in Java, Mark Giereth 29.01.2004 15 Objektorientierte Programmierung in Java, Mark Giereth 29.01.2004 16 Eigenschaften von Java (1) Eigenschaften von Java (2) • Java ist plattformunabhängig • Java-Code wird mit einem Java-Compiler (javac) in plattformunabhängigen Bytecode überführt • Bytecode wird von einer Java Virtual Machine (JVM) teils interpretiert teils zur Laufzeit in Maschinencode kompiliert (JustIn-Time-Compiler in JVM integriert) • → Für jede unterstützte Plattform muss es eine JVM geben Source Compiler JVM Solaris JVM Linux Objektorientierte Programmierung in Java, Mark Giereth ... 29.01.2004 17 Java API Objektorientierte Programmierung in Java, Mark Giereth 29.01.2004 18 • Java Applications • Laufen in einer JVM, die von Betriebssystemebene aus gestartet wird • Zugriff auf alle lokalen Ressourcen Datenbankunterstützung (java.sql) Netzwerkunterstützung (java.net) Unterstützung für verteilte Systeme (java.rmi) 2D Graphik (java.awt) Collektionframework (java.util) XML Unterstützung (javax.xml) Graphische Benutzeroberflächen (javax.swing) • Java Applets • Laufen in der JVM des Browsers (bzw. in dem JVM Plug-in des Browsers) • Werden in HTML-Seiten eingebunden • Hohe Sicherheitsbeschränkungen (kein Zugriff auf lokale Ressourcen wie Filesystem, Drucker, etc.) • Java Servlets • Java Klassen sind in Packages organisiert • Laufen in einer JVM eines Webservers • Dynamisches erzeugen von Web-Seiten • Ein Package gibt den Namensraum einer Klasse an z.B. java.lang.String Objektorientierte Programmierung in Java, Mark Giereth keine Pointer keine Destruktoren sondern automatische Garbage Collection keine Mehrfachvererbung kein Operator-Overloading Arten von Java Programmen • Es existiert eine rießige Anzahl von vordefinierten Klassen, die mit der Java Umgebung ausgeliefert werden, z.B. • • • • • • • • • • • • Bytecode Verification • Security Manager und Security Policies erlauben feinkörnige Rechtevergabe für Java-Programme • Exception Handling • Thread-Sicherheit in die Sprache integriert Bytecode JVM Windows Java wurde auf Sicherheit und Robustheit hin entwickelt: • Fehleranfällige Sprachkonstrukte fehlen: 29.01.2004 19 Objektorientierte Programmierung in Java, Mark Giereth 29.01.2004 20 Beispiel für eine komplexe Java Application Hello World Application public class Hello { public static void main(String[] args) { System.out.println("Hello World"); } } • Speichern als Textdatei Hello.java • Aufruf des Java-Compilers: javac Hello.java → erzeugt die Bytecode-Datei Hello.class • Ausführen des Bytecodes: java Hello Objektorientierte Programmierung in Java, Mark Giereth 29.01.2004 21 Objektorientierte Programmierung in Java, Mark Giereth Hello World Applet import java.applet.Applet; import java.awt.Graphics; public class HelloApplet extends Applet { public void paint(Graphics g) { g.drawString("Hello World", 5, 20); } } <html> <head><title>HelloApplet Test</title></head> <body> Hier kommt das Applet: <applet code="HelloApplet.class" codebase="." width="500" height="100"></applet> </body> </html> Objektorientierte Programmierung in Java, Mark Giereth 29.01.2004 29.01.2004 22 Java Basics .java Datei • • • • Klassen- und Interface-Definition Datentypen Variablen- und Methodendeklaration Kontrollfluss • Bedingungen (if-then, if-then-else, switch) • Schleifen (while, do, for) .html Datei 23 • Exception Handling • throws, throw, try-catch Objektorientierte Programmierung in Java, Mark Giereth 29.01.2004 24 Klassen und Interfaces Datentypen [public] [abstract] class Klassenname [extends Klassenname] [implements Interfacenamen] { ...Klassen/Instanz Attribute... ...Konstruktoren... ...Klassen/Instanz Methoden... } [public] interface Interfacename [extends Interfacename] { ...Klassen Attribute... ...Instanz Methoden... } Objektorientierte Programmierung in Java, Mark Giereth 29.01.2004 25 Variablendeklaration int x; int[] vector = new int[3]; boolean b = true; char c = 'A'; String text = "Hallo Welt"; ≡ String text = new String("Hallo Welt"); • GeomFigure f = new GeomFigure(); Objektorientierte Programmierung in Java, Mark Giereth Die String-Klasse bildet eine Ausnahme: obwohl String ein Referenttyp ist, können String Instanzen mit Variable="Text" instanziiert werden. 29.01.2004 • • • • Ganze Zahlen: long(64 bit), int(32), short(16), byte(8) Gleitkommazahlen: double (64 bit), float (32 bit) boolean char (16 bit Unicode character) • Referenztypen • • • • Classes (z.B. String), Arrays, Interfaces Die Konstante null bezeichnet die leere Referenz Referenztypen werden mit dem new-Operator erzeugt Zuweisung eines Referenztyps kopiert den Verweis Objektorientierte Programmierung in Java, Mark Giereth 29.01.2004 26 Methoden Typename Variablenname [Wertzuweisung] ; • • • • • • Elementare Typen 27 [private|public|protected] Typename Methodenname (Argumentenliste) [throws Exception] { ...Methodenrumpf... } • void sayHello() throws NoVoiceEx {System.out.println("Hallo Welt"); } • public String toString() {System.out.println("Hallo Welt"); } • protected int setPosition(int x, int y) {m_x=x; m_y=y; } Objektorientierte Programmierung in Java, Mark Giereth 29.01.2004 28 Methodenaufruf Zugriffsbeschränkungen Objekt.Methode(Argumente); Kennzeichnung private protected public keine Angabe Objekt ... String text = "Hallo Welt"; String hallo = text.substring(1,5); System.out.println(hallo); ... text.substring(1,5).indexOf("llo"); Objektorientierte Programmierung in Java, Mark Giereth Methode Argumente 29.01.2004 Klassen nur die Klasse selbst auch alle Unterklassen alle Klassen alle Klassen des Packages (package private) • keine "friend" Deklarationen wie in C++ • Anwendung: Methoden, Attribute, Klassen 29 Objektorientierte Programmierung in Java, Mark Giereth Bedingungen if (Ausdruck) { ... then-Block... } else { ... else-Block... } Beispiel: if (x<0) { y = -x; } else { y = x; } Beispiel: switch(x){ case 1: System.out.println("eins"); break; case 2: System.out.println("zwei"); break; default: System.out.println("?"); } 29.01.2004 29.01.2004 30 Schleifen switch (Int-Ausdruck) { case wert1: block1; break; case wert2: block2; break; default: default-block } Objektorientierte Programmierung in Java, Mark Giereth UML # + 31 while (Ausdruck) { ... Schleifenrumpf... } for (Init, Ausdruck, Schritt) { ... Schleifenrumpf... } Beispiel: int x=10; while(x>0) { System.out.println(x); x=x-1; } Beispiel: for(int x=10; x>10; x=x-1) { System.out.println(x); } Objektorientierte Programmierung in Java, Mark Giereth 29.01.2004 32 Exception Handling Die Klasse GeomFigure ... public static String readFile(String filename) throws IOException {... } ... public static void main(String[] args) { String content = ""; if (args != null && args.length > 0) { try { content = readFile(args[0]); System.out.println(content); } catch (IOException e) {System.err.println("Fehler: "+e);} } } public class GeomFigure { GeomFigure // Attribute: x-/y-Koordinate #myX:int protected int myX, myY; #myY:int public GeomFigure() {} // Konstruktor +GeomFigure() // Methoden: +setX(x:int) +setY(y:int) public int getX() {return myX; } +getX():int public int getY() {return myY; } +getY():int public void setX(int x) {myX=x; } +toString():String public void setY(int y) {myY=y; } public String toString() { return new String("["+myX+","+myY+"]"); } } Objektorientierte Programmierung in Java, Mark Giereth Objektorientierte Programmierung in Java, Mark Giereth 29.01.2004 33 Die Klasse GeomApp • Spezielle Methoden zur Initialisierung, die bei der Instanziierung aufgerufen werden • Konstruktoren haben denselben Namen wie die Klasse und keinen Rückgabewert • Konstruktoren können Parameter haben • Jede Klasse hat einen impliziten DefaultKonstrutor, der keine Parameter hat • Jeder Konstruktor ruft implizit den Konstruktor der Superklasse auf: super() Ausnahme: hat die Superklasse keinen öffentlichen Konstruktor • Durch explizite Angabe kann ein entsprechender Konstruktor der Superklasse ausgewählt werden Ausgabe: [10,20] 29.01.2004 34 Konstruktoren public class GeomApp { public static void main(String[] args) { GeomFigure f = new GeomFigure(); f.setX(10); f.setY(20); System.out.println(f.toString()); } } Objektorientierte Programmierung in Java, Mark Giereth 29.01.2004 35 Objektorientierte Programmierung in Java, Mark Giereth GeomFigure #myX:int #myY:int +GeomFigure() +GeomFigure(x:int,y:int) +GeomFigure(p:GeomFigure) +setX(x:int):int +setY(y:int):int +getX():int +getY():int +toString():String 29.01.2004 36 Die Klasse GeomFigure Die Klasse GeomFigure public class GeomFigure { // Attribute: x-/y-Koordinate protected int myX, myY; ... GeomFigure f1 = new GeomFigure(10,20); GeomFigure f2 = new GeomFigure(f1); System.out.println("f1:"+f1.toString()+", f2:"+f2.toString()); ... // Konstruktoren: public GeomFigure() {} public GeomFigure(int x, int y) {myX=x; myY=y; } public GeomFigure(GeomFigure f) {myX=f.myX; myY=f.myY; } Ausgabe: f1:[10,20], f2:[10,20] // Methoden ... } Objektorientierte Programmierung in Java, Mark Giereth 29.01.2004 37 Die Klasse Square +GeomFigure() +GeomFigure(x:int,y:int) +GeomFigure(p:GeomFigure) +setX(x:int):int +setY(y:int):int +getX():int +getY():int +toString():String Square +Square(a:int) +Square(p:GeomFigure,a:int) +setLength(a:int):void +getLenght():int +getArea():float +toString():String 29.01.2004 38 public class Square extends GeomFigure { Ist a Attribut // Attribute oder Argument? private int a; this.a // Konstruktoren public Square (GeomFigure f, int a) {super(f); this.a=a; } public Square (int a) {super(); this.a=a; } // neue Methoden public int getLength() {return a; } this gibt die Referenz auf public void setLength(int a) {this.a=a; } dieses Objekt an, public float getArea() {return a*a; } super auf die // überschriebene Methoden Implemtierung der Superklasse public String toString() { return "[x/y:"+super.toString()+"a:"+a+"]"; } } -a:int Objektorientierte Programmierung in Java, Mark Giereth 29.01.2004 Die Klasse Square GeomFigure #x:int #y:int Objektorientierte Programmierung in Java, Mark Giereth 39 Objektorientierte Programmierung in Java, Mark Giereth 29.01.2004 40 Die Klasse GeomApp Überschreiben von Methoden public class GeomApp { public static void main(String[] args) { GeomFigure f = new GeomFigure (10,20); GeomFigure f2 = new Square(f,5); // Square ist ein GeomFigure // getArea() nicht definiert für GeomFigure -> Downcasting // sicheres Downcasting mit: if(f2 instanceof Square)... float a= ((Square)f2).getArea(); System.out.println(f2.toString() + " area: "+a); } } Objektorientierte Programmierung in Java, Mark Giereth 29.01.2004 41 Ausgabe: • Hat eine Methode einer Subklasse die gleiche Signatur einer Methode der Superklasse, so wird die Superklassenmethode überschrieben (overriding) • GeomFigure definiert eine Methode toString(): • String toString() {return new String("["+x+","+y+"]"); • Square überschreibt die Methode: • String toString() {return "[x/y:"+super.toString()+"a:"+a+"]"); } • Auswirkung: • GeomFigure f2 = new Square(new GeomFigure(10,20),5); System.out.println(f2.toString()); // Ergebnis [x/y:[10,20], a:5] • Obwohl die Variable f2 vom Typ GeomFigure ist, referenziert sie ein Objekt vom Typ Square, dessen toString() Methode ausgeführt wird Objektorientierte Programmierung in Java, Mark Giereth 29.01.2004 42 Überladen von Methoden static String read(String filename) {...} static String read(String filename, String path) {...} static String read(File file) {...} • Gibt es mehrere Methoden mit demselben Namen aber mit unterschiedlichen Signaturen, so spricht man von Überladen (overloading) String f = "Hallo.java"; String content = read(f); Teil 3: Entwicklung eines kleinen Web-Browsers Eclipse Demo ruft erste Variante auf, da f vom Typ String ist. Eclipse im Web: http://www.eclipse.org • Beispiel: System.out.println(...) • (siehe APIDokumentation) Objektorientierte Programmierung in Java, Mark Giereth 29.01.2004 43 Objektorientierte Programmierung in Java, Mark Giereth 29.01.2004 44 Ausschnitt aus Swing/AWTKlassenhierarchie Swing GUI Komponenten • Toplevel Container: • JDialog, JFrame, ... • General Purpose Container: • JSplittPane, JTabbedPane, JScrollPane, ... • Basic Controls: • JButton, JMenu, JTextField, JSlider,... Objektorientierte Programmierung in Java, Mark Giereth 29.01.2004 45 Container Objektorientierte Programmierung in Java, Mark Giereth 29.01.2004 46 Beispiel: Web Browser • Können andere Komponenten enthalten • Beispiel: Toplevel-Container JFrame JFrame JTextField JEditorPane JButton Objektorientierte Programmierung in Java, Mark Giereth 29.01.2004 47 Objektorientierte Programmierung in Java, Mark Giereth 29.01.2004 48 Schritt 1 Schritt 2 public static void main(String[] args) { // erzeuge Anwendungsfenster: JFrame frame = new JFrame("MiniBrowser"); // erzeuge GUI Komponenten: JTextField field = new JTextField(); JEditorPane editor = new JEditorPane(); JButton button = new JButton("refresh"); // definiere Layout und füge Komponenten hinzu: frame.getContentPane().setLayout(new BorderLayout()); frame.getContentPane().add(field, BorderLayout.NORTH); frame.getContentPane().add(editor, BorderLayout.CENTER); frame.getContentPane().add(button, BorderLayout.SOUTH); // setze Größe und zeige Frame an: frame.setSize(400,200); frame.setVisible(true); } 29.01.2004 49 Objektorientierte Programmierung in Java, Mark Giereth Schritt 3 29.01.2004 50 Links und Literatur public class WebBrowser extends JFrame implements ActionListener { ... public void actionPerformed(ActionEvent e) { System.out.println("URL: "+field.getText()); try { editor.setPage(field.getText()); } catch (IOException e1) { e1.printStackTrace(); } } } • Java Hauptseite: • http://java.sun.com • Java Tutorials: • http://java.sun.com/developer/onlineTraining/ • David Flanagan: "Java in a Nutshell", O'Reilly, 11/2002, 1104 Seiten, • Alexander Niemann:"Objektorientierte Programmierung in Java. Das Einsteigerseminar", vmi Buch, 12/2002, 400 Seiten, Bücher Objektorientierte Programmierung in Java, Mark Giereth public class WebBrowser extends JFrame { private JTextField field = new JTextField(); private JEditorPane editor = new JEditorPane(); private JButton button = new JButton("refresh"); public static void main(String[] args) { public WebBrowser() { JFrame frame = new WebBrowser(); super(); frame.setSize(400, 200); setTitle("Mini Browser"); frame.setVisible(true); button.addActionListener(this); } editor.setEditable(false); getContentPane().setLayout(new BorderLayout()); getContentPane().add(field, BorderLayout.NORTH); getContentPane().add(editor, BorderLayout.CENTER); getContentPane().add(button, BorderLayout.SOUTH); } } Objektorientierte Programmierung in Java, Mark Giereth 29.01.2004 51 Objektorientierte Programmierung in Java, Mark Giereth 29.01.2004 52 Kompaktkurs Java • In der vorlesungsfreien Zeit nach dem Sommersemester • 7 Tage Java in kompakter Form, kombiniert mit Übungen • Inhalt: • Tag 1+2: Die Programmiersprache Java • Tag 3: Objektorientierte Analyse und Design, UML, Entwurfsmuster • Tag 4: GUI Entwicklung: Swing, AWT, Java2D • Tag 5: Datenbankanbindung mit JDBC, Einführung in SQL • Tag 6: Java Servlets und Java Server Pages • Tag 7: Java APIs für XML • Im Anschluss: 7 Tage XML Kompaktkurs Objektorientierte Programmierung in Java, Mark Giereth 29.01.2004 53