n 1. Grundzüge der Objektorientierung n 2. Methoden, Unterprogramme und Parameter n 3. Datenabstraktion n 4. Konstruktoren n 5. Vordefinierte Klassen II.2.3 Datenabstraktion - 1 -
public class Rechteck { Selektoren //Objektattribute double laenge, breite; //Selektoren public void setlaenge (double l) { laenge = l; public double getlaenge () { return laenge;... int strichstaerke; Rechteck r, s;... r.laenge = s.laenge + 2; r.setlaenge (s.getlaenge() + 2); II.2.3 Datenabstraktion - 2 -
public class Rechteck { Selektoren //Objektattribute double flaeche, breite; //Selektoren public void setlaenge (double l) { flaeche = l * breite; public double getlaenge () { return flaeche / breite;... int strichstaerke; Rechteck r, s;... r.setlaenge (s.getlaenge() + 2); II.2.3 Datenabstraktion - 3 -
Zugriffsspezifikationen Einschränkung des Zugriffs auf Attribute und Methoden: n private: Komponente nur innerhalb der Klasse bekannt n kein Schlüsselwort: Komponente nur innerhalb des Pakets bekannt n protected: Komponente in Klasse und Unterklassen bekannt n public: Komponente überall bekannt II.2.3 Datenabstraktion - 4 -
public class Rechteck { Zugriffsspezifikationen //Objektattribute private double laenge,breite; private int strichstaerke; //Selektoren public void setlaenge (double l) { laenge = l; public double getlaenge () { return laenge;... Rechteck r, s;... r.laenge = s.laenge + 2; nicht mehr möglich! r.setlaenge (s.getlaenge() + 2); II.2.3 Datenabstraktion - 5 -
Geheimnisprinzip (Information Hiding) n Client / Server - Prinzip: l Anbieter publiziert Katalog der Dienstleistungen als öffentliche Schnittstelle. l Kunde interessiert nur die Schnittstelle, nicht wie die Leistung erbracht wird. l Bsp: API der Java-Bibliotheken n Abstrakter Datentyp: l Daten (Attribute) und die darauf ausführbaren Operationen (Methoden) l abstrakte Schnittstellendefinition nach außen (konkrete Realisierung und Implementierung bleibt verborgen) l Datenabstraktion und Datenkapselung n Vorteile: l besseres Verständnis l leichtere Änderbarkeit l bessere Modularisierung II.2.3 Datenabstraktion - 6 -
Schnittstellendokumentation II.2.3 Datenabstraktion - 7 -
Beispiel: Datentyp Ordner n "Ordner " als Konzept l enthält Texte l Texte können abgelegt und entnommen werden l ein Ordner kann beschriftet werden l ein Ordner kann leer oder voll sein Abstrakte Beschreibung des Konzepts Ordner n Schnittstelle: Datenkapselung als Entwurfsprinzip! void legetextab (String t) String entnehmetext () boolean istvoll () boolean istleer () void beschrifte (String t) String liesbeschriftung () II.2.3 Datenabstraktion - 8 -
Verwendung des Datentyps Ordner Ordner o = new Ordner (); o.beschrifte ("Kleine Gedichte"); if (o.istvoll()) System.out.println("Ordner ist bereits voll"); else o.legetextab ("Herr Ribeck auf Ribeck..."); if (o.istvoll()) System.out.println("Ordner ist bereits voll"); else o.legetextab ("Von drauss vom Walde komm ich her..."); System.out.println (o.liesbeschriftung ()); System.out.println ("------------------------------"); if (!o.istleer()) System.out.println (o.entnehmetext ()); if (!o.istleer()) System.out.println (o.entnehmetext ()); II.2.3 Datenabstraktion - 9 -
Implementierung des Datentyps Ordner /** Datentyp Ordner zur Speicherung von Texten * @author Juergen Giesl */ public class Ordner { private static final int maxtexte = 20; private String [] ordnerinhalt = new String [maxtexte]; private int anzahltexte = 0; private String beschriftung = ""; /** @return true, falls der Ordner voll ist, sonst false */ public boolean istvoll () { return anzahltexte = = maxtexte; Es wird ein Array verwendet /** @return true, falls der Ordner leer ist, sonst false */ public boolean istleer () { return anzahltexte = = 0; II.2.3 Datenabstraktion - 10 -
Implementierung des Datentyps Ordner /** @param t Text, der vorne im Ordner abgelegt wird */ public void legetextab (String t) { ordnerinhalt [anzahltexte] = t; anzahltexte ++; /** Liest zuletzt eingegebenen Text und loescht ihn. * @return letzten abgelegten Text */ public String entnehmetext () { String t = ordnerinhalt [anzahltexte-1]; ordnerinhalt [anzahltexte-1] = ""; anzahltexte --; return t; /** @param t Beschriftung des Ordners */ public void beschrifte (String t) { beschriftung = t; /** @return Beschriftung des Ordners */ public String liesbeschriftung () { return beschriftung; II.2.3 Datenabstraktion - 11 -
Schnittstellendokumentation II.2.3 Datenabstraktion - 12 -
n 1. Grundzüge der Objektorientierung n 2. Methoden, Unterprogramme und Parameter n 3. Datenabstraktion n 4. Konstruktoren n 5. Vordefinierte Klassen II.2.3 Datenabstraktion - 13 -
public class Rechteck { Konstruktoren //Objektattribute double laenge, breite; int strichstaerke; //Konstruktor 1 public Rechteck () { laenge = breite = 1.0; strichstaerke = 1; //Konstruktor 2 public Rechteck (double l, double b) { laenge = l; breite = b; strichstaerke = 1;... Rechteck r = new Rechteck (); Rechteck s = new Rechteck (2.1,1.5); II.2.3 Datenabstraktion - 14 -
Konstruktordeklaration Variablendeklaration Konstruktordeklaration Klassendeklaration class Name { Methodendeklaration Schlüsselwort Konstruktordeklaration, Name ( Typ Name ) Block Schlüsselwort II.2.3 Datenabstraktion - 15 -
Ausdruck Grundwert ( Typ ) Präfix-Operator Name Methodenaufruf [ Ausdruck ] ( Ausdruck ) Infix-Operator Methodenaufruf new Name [ Ganzzahl ] Ausdruck? Ausdruck : Ausdruck II.2.3 Datenabstraktion - 16 -
Überladene Methoden n Verschiedene Methoden können den gleichen Namen haben, falls ihre Parameterlisten verschieden sind n Parameterlisten gelten als verschieden, falls: l unterschiedliche Anzahl von Parametern oder l unterschiedliche Datentypen bei den Parametern n Unterschiedliche Parameterbezeichner oder unterschiedliche Resultattypen reichen nicht! l Rechteck ( ) l Rechteck (double l, double b) l Rechteck (double kantenlaenge) l Rechteck (int seitenlaenge) l Rechteck (int... seiten) n Es wird die speziellste passende Methode ausgeführt. II.2.3 Datenabstraktion - 17 -
Überladene Konstruktoren public Rechteck () { laenge = breite = 1.0; strichstaerke = 1; public Rechteck (double l, double b) { laenge = l; breite = b; strichstaerke = 1; public Rechteck (double kantenlaenge) { laenge = breite = kantenlaenge; strichstaerke = 1; public Rechteck (int s) { laenge = breite = 1.0; strichstaerke = s; public Rechteck (int... a) { laenge = a[0]; breite = a[1]; strichstaerke = 5; Rechteck r = new Rechteck (); Rechteck s = new Rechteck (1,2); Rechteck t = new Rechteck (3.0); Rechteck u = new Rechteck (3); Rechteck v = new Rechteck (1,2,3); vararg Methoden möglichst nicht überladen! II.2.3 Datenabstraktion - 18 -
Selbstverweis; Schlüsselwort this public Rechteck () { laenge = breite = 1.0; strichstaerke = 1; public Rechteck (double laenge, double breite) { this.laenge = laenge; this.breite = breite; strichstaerke = 1; public Rechteck (double laenge) { this.laenge = breite = laenge; strichstaerke = 1; public Rechteck (int strichstaerke) { laenge = breite = 1.0; this.strichstaerke = strichstaerke; II.2.3 Datenabstraktion - 19 -
Kopier - Konstruktor public Rechteck (Rechteck original) { if (original!= null) { laenge = original.laenge; breite = original.breite; strichstaerke = original.strichstaerke; else { // kein Original vorhanden laenge = breite = 1.0; strichstaerke = 1; II.2.3 Datenabstraktion - 20 -
n 1. Grundzüge der Objektorientierung n 2. Methoden, Unterprogramme und Parameter n 3. Datenabstraktion n 4. Konstruktoren n 5. Vordefinierte Klassen II.2.3 Datenabstraktion - 21 -
Hüllklassen n Primitive Typen (boolean, char, int, double,...) passen nicht ins Konzept von Klassen und Objekten. n Nachteil: l unsystematisch l keine Referenzparameter für Objekte primitiver Typen l manche Methoden verlangen Klassentypen als Parameter n Daher existieren für alle primitive Datentypen sogenannte Hüllklassen: l Boolean l Character l Byte, Short l Integer, Long l Float l Double II.2.3 Datenabstraktion - 22 -
Attribute und Methoden von Integer n Objekt-Attribut (nicht public): der eingehüllte int-wert n Klassen-Attribute (statisch): l MIN_VALUE : kleinster Wert vom Typ int (-2.147.483.648) l MAX_VALUE : größter Wert vom Typ int (2.147.483.647) n Konstruktoren: l Integer (int value), l Integer (String s) n Statische Methoden: l static int parseint (String s) l static String tostring (int i) n Methoden: l String tostring () l boolean equals (Integer i) l byte bytevalue(), int intvalue (), float floatvalue (),... II.2.3 Datenabstraktion - 23 -
Beispiel zur Verwendung von Integer Integer x = new Integer (123); Integer y = new Integer ("123"); int z = Integer.parseInt("123"); String s1 = Integer.toString (123); String s2 = x.tostring (); System.out.println("x: " + x); System.out.println("y: " + y); System.out.println("z: " + z); System.out.println("s1: " + s1); System.out.println("s2: " + s2); System.out.println ("x = = y: " + (x = = y)); System.out.println ("x.equals(y) : " + x.equals(y)); System.out.println ("x.intvalue () = = z: " + (x.intvalue () = = z)); II.2.3 Datenabstraktion - 24 -
Autoboxing und Unboxing Integer x = 123; Integer x = new Integer(123); int i = x; int i = x.intvalue(); Integer y = x + 2; Integer y = new Integer(x.intValue() + 2); Double z = Math.sqrt(y); Double z = new Double(Math.sqrt(y.intValue())); Double d = 4; Double d = new Integer(4); Typfehler! Double d = new Double(4); Double e = 4.0; Double e = new Double(4.0); II.2.3 Datenabstraktion - 25 -
Beispiel zur Verwendung von String String s = "Wort"; String t = "Wort"; String u = new String("Wort"); String v = new String("Wort"); System.out.println ("s = = t: " + (s = = t)); System.out.println ("s = = u: " + (s = = u)); System.out.println ("s.equals(u): " + s.equals(u)); System.out.println ("u = = v: " + (u = = v)); System.out.println ("u.equals(v): " + u.equals(v)); System.out.println ("Zeichen in " + u + " an Index 2: " + u.charat(2)); System.out.println ("Laenge von " + u + ": " + u.length()); System.out.println ("Zeichen in " + u + " an Index 2: " + u.tochararray() [2]); II.2.3 Datenabstraktion - 27 -