Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

12.05.1999, Dr. Wolfram Amme, Softwareentwicklung in Java, FSU Jena, SS 1999 1 Kapselung von Daten I Gründe für die Datenkapselung Datenkonsistenz leichtere.

Ähnliche Präsentationen


Präsentation zum Thema: "12.05.1999, Dr. Wolfram Amme, Softwareentwicklung in Java, FSU Jena, SS 1999 1 Kapselung von Daten I Gründe für die Datenkapselung Datenkonsistenz leichtere."—  Präsentation transkript:

1 , Dr. Wolfram Amme, Softwareentwicklung in Java, FSU Jena, SS Kapselung von Daten I Gründe für die Datenkapselung Datenkonsistenz leichtere Modifikation des Codes weniger Dokumentation nötig Modifier zur Kapselung von Daten public überall sichtbar private nur innerhalb der eigenen Klasse zugreifbar default innerhalb eines Paketes zugreifbar protected=> Vererbung Eigenschaften von Modifiern Modifier sind Präfixe, die Klassen, Methoden und Variablendefinitionen vorangestellt werden können Reihenfolge von Modifiern hat keine Bedeutung

2 , Dr. Wolfram Amme, Softwareentwicklung in Java, FSU Jena, SS Beispiel public class Benutzer{ public int userNummer; public String name; public String vorname; private static int numUser = 0; private static final int maxUser = 200; } : Benutzer benutzer = new Benutzer(); benutzer.name = ´´Meier´´; // ok benutzer.numUser = 30;// Fehler !!!!

3 , Dr. Wolfram Amme, Softwareentwicklung in Java, FSU Jena, SS Vererbung Eine Unterklasse wird folgendermaßen definiert class Unterklasse extends Oberklasse{... } die Unterklasse erbt Methoden und Variablen ihrer Oberklasse, nicht aber deren Konstruktoren bei der Instanzierung der Unterklasse wird zuerst der Default- Konstruktor der Oberklasse aufgerufen mit super kann statt des Default-Konstruktors ein anderer Konstruktor der Oberklasse aufgerufen werden (1. Anweisung) ist in der Oberklasse kein Default-Konstruktor definiert ist, muß super(...) im Konstruktor der Unterklasse aufgerufen werden alle Klassen haben die Klasse java.lang.Object als Oberklasse

4 , Dr. Wolfram Amme, Softwareentwicklung in Java, FSU Jena, SS Beispiel public class Square extends Point{ int a; public Square(int x, int y, int color, int a){ super(x,y,color); this.a = a; } public void resize(int a){ this.a; } public int area(){ return a * a; }

5 , Dr. Wolfram Amme, Softwareentwicklung in Java, FSU Jena, SS Kapselung von Daten II weitere Möglichkeiten zur Datenkapselung mit private deklarierte Variablen und Methoden werden nicht vererbt mit protected deklarierte Variablen und Methoden werden vererbt, sind aber außerhalb ihres Paketes nicht zugreifbar mit public deklarierte Variablen und Methoden werden vererbt und sind überall benutzbar (*) nur von Subklassen in demselben Paket

6 , Dr. Wolfram Amme, Softwareentwicklung in Java, FSU Jena, SS Zugriff mit der Zugriffsklasse public package A; public class one { public int a; } class two extends one { } class three{ } package B; import A.one; class four extends one { } class five { }

7 , Dr. Wolfram Amme, Softwareentwicklung in Java, FSU Jena, SS Zugriff mit der Zugriffsklasse protected package A; public class one { protected int a; } class two extends one { } class three{ } package B; import A.one; class four extends one { } class five { }

8 , Dr. Wolfram Amme, Softwareentwicklung in Java, FSU Jena, SS Zugriff mit der Zugriffsklasse default package A; public class one { int a; } class two extends one { } class three{ } package B; import A.one; class four extends one { } class five { }

9 , Dr. Wolfram Amme, Softwareentwicklung in Java, FSU Jena, SS Überdecken von Variablen I Vererbung kann zum Überdecken von Instanzvariablen führen class Point { int x, y, color;... } class RealPoint extends Point { float x, y, color;... } Festlegung der Variablenzugriffe erfolgt statisch zur Übersetzungszeit

10 , Dr. Wolfram Amme, Softwareentwicklung in Java, FSU Jena, SS Überdecken von Variablen II überdeckte Variablen der Basisklasse sind in einer Instanz der abgeleiteten Klasse lebendig Zugriff auf überdeckte Variablen durch den super-Operator class RealPoint { float x, y, color; int s = super.x;... } Festlegung von Referenzzugriffen auf Instanzvariablen erfolgt ebenfalls statisch zur Übersetzungszeit RealPoint rp = new RealPoint(); Point p = rp; int s = p.x;// Zugriff auf die von Point geerbte Variable x float t = rp.x;// Zugriff auf die in RealPoint definierte Variable x

11 , Dr. Wolfram Amme, Softwareentwicklung in Java, FSU Jena, SS Überschreiben von Methoden I in abgeleiteten Klassen können Methoden dieselbe Signatur (Parameter- und Rückgabetypen) wie in der Basisklasse haben class Point { int x, y, color; void moveTo(int x, int y) {...}; void moveRel(int x, int y){...}; int getX(){return x;} int getY(){return y;} } class RealPoint extends Point{ float x, y, color; void moveTo(float x, float y) {...}; void moveRel(float x, float y){...}; int getX(){return (int) Math.floor(x);} int getY(){return (int) Math.floor(y);} }

12 , Dr. Wolfram Amme, Softwareentwicklung in Java, FSU Jena, SS Überschreiben von Methoden II die Implementierung der Basisklasse wird durch die der abgeleiteten Klasse ersetzt Hat eine Methode mehrere Implementierungen, so bezieht sich ein Zugriff immer auf die in der am meisten abgeleiteten Klasse Zuweisung der Implementierung eines Methodenaufrufs zur Laufzeit RealPoint rp = new RealPoint(); Point p = rp; int t = rp.getX();// Zugriff auf die Methode getX der Klasse RealPoint int s = p.getX();// Zugriff auf die Methode getX der Klasse RealPoint Zuweisung der Implementierung eines Methodenaufrufs: 1. Bestimmung der Signatur eines Aufrufs zur Übersetzungszeit 2. Auswahl der Implementierung zur Laufzeit

13 , Dr. Wolfram Amme, Softwareentwicklung in Java, FSU Jena, SS Explizite Typumwandlung Cast-Operator wird zur expliziten Typumwandlung genutzt nur auf Objekte derselben Vererbungshierarchie anwendbar Überprüfung von Cast-Operatoren zur Übersetzungs- und Laufzeit Laufzeitfehler führt zu einem ClassCastExecption Cast-Operator zielt auf die Objektreferenz, nicht auf die aktuelle Form eines Objekts RealPoint rp =... ; Point p =... ; p = rp; // Okay rp = p; // Compile time error rp = (RealPoint) p; // Okay Verwendung des instanceof-Operators zur Vermeidung von Laufzeitfehlern

14 , Dr. Wolfram Amme, Softwareentwicklung in Java, FSU Jena, SS Cast-Operator Cast-Operator beeinflußt nur die Auswahl statischer Elemente Auswahl von Variablen bzw. überladenen Methoden, nicht aber die Auswahl überschriebener Methoden class Point { (Point) rp.xint x, y, color;... } class RealPoint extends Point{ rp.xfloat x, y, color;... } class Point {... int getX(){return x;} int getY(){return y;} (Point) rp.getX()class RealPoint extends Point{... int getX(){return (int) Math.floor(x);} rp.getX()int getY(){return (int) Math.floor(y);} }

15 , Dr. Wolfram Amme, Softwareentwicklung in Java, FSU Jena, SS static- und final-Modifier final-Klasse es kann keine Unterklasse von der final-Klasse erstellt werden Steigerung der Performance final-Methode Methode kann nicht von Unterklassen überschrieben werden Steigerung der Performance Inline-Erweiterung static-Methode Methode wird nicht überschrieben, sondern nur überdeckt final-Variable die Variable ist konstant Konstantenfortpflanzung

16 , Dr. Wolfram Amme, Softwareentwicklung in Java, FSU Jena, SS Ändern der Zugriffsklasse beim Überschreiben Grundregel: Der Zugriffsraum darf nur erweitert, aber nicht eingeschränkt werden. Als public deklarierte Methoden müssen public bleiben Eine geerbte protected-Methode darf entweder als protected oder als public überschrieben werden Für Methoden, die in der Oberklasse als private definiert sind, darf eine beliebige Zugriffsklasse gewählt werden, da private Methoden nicht vererbt werden Methoden die als default definiert sind, können in default bleiben oder als protected oder public überschrieben werden Grund: Es muß möglich sein, an eine Referenz auf eine Klasse auch Exemplare aller Unterklassen zuzuweisen.

17 , Dr. Wolfram Amme, Softwareentwicklung in Java, FSU Jena, SS Abstrakte Klassen Eigenschaften abstrakte Klassen sind Schablonen => unvollständig implementiert sie können deshalb nicht instanziert werden ein Klasse muß mit abstract deklariert sein wenn mindestens eine Methode mit abstract deklariert wurde, oder wenn eine abstrakte Methode von der Oberklasse geerbt, und nicht überschrieben wird Beispiel für abstrakte Klassen Wrapperklassen –Double –Float –Integer –Long InputStream

18 , Dr. Wolfram Amme, Softwareentwicklung in Java, FSU Jena, SS Abstrakte Methoden Abstrakte Methoden werden mit Modifier abstract deklariert benötigt keine Implementierung eine abstrakte Methode darf nicht mit static oder final deklariert werden muß von der Unterklasse implementiert werden, um Objekte der Unterklasse bilden zu können abstract class Fahrzeug { abstract void starte(); } class Fahrrad extends Fahrzeug{ void starte(){ steige_auf();... }

19 , Dr. Wolfram Amme, Softwareentwicklung in Java, FSU Jena, SS Schnittstellen (Interfaces) wie bei abstrakten Klassen stellt eine Schnittstelle eine Schablone zur Verfügung die Schnittstelle darf keine Implementierung enthalten nur Konstanten sind erlaubt von einer Schnittstelle kann kein Objekt erzeugt werden eine Schnittstelle bietet aber weitere Möglichkeiten es können mehrere Schnittstellen von einer Klasse implementiert werden Mehrfachvererbung von Deklarationen wird dadurch ermöglicht (x ist ein a und ein b) Definition: interface Iname{... } Benutzung: class Name implements Iname1, Iname2,...

20 , Dr. Wolfram Amme, Softwareentwicklung in Java, FSU Jena, SS Beispiel interface KannSchwimmen{ void schwimmen(); } interface KannLaufen{ void laufen(); } interface KannFliegen{ void fliegen(); } class Ente extends Tier implements KannSchwimmen, Kannlaufen, KannFliegen {... }

21 , Dr. Wolfram Amme, Softwareentwicklung in Java, FSU Jena, SS Weitere Beispiele public interface GraphObj { int BLACK = 0; int BLUE = 1; int WHITE = 2; void show(); void hide(); void setColor(); } public interface GlobalConstants { int MAX_RECORDS = 1000; String ERR_MSG = “More than “+MAX_RECORDS+” records.”; } public interface Cloneable { }

22 , Dr. Wolfram Amme, Softwareentwicklung in Java, FSU Jena, SS Implementierung eines Interfaces class Point implements GraphObj { int x, y, color; public Point(int x, int y, int color){ this.x = x; this.y = y; setColor(color); show(); } protected void drawPoint(int x, int y, int color){... } protected int getBackgroundColor(){... } public void setColor(int color){ this.color = color; } public void show(){ drawPoint(x, y, color); } public void hide(){ drawPoint(x, y, getBackgroundColor()); } }

23 , Dr. Wolfram Amme, Softwareentwicklung in Java, FSU Jena, SS Verwendung von Interfaces Interfaces werden von Klasse zu Klasse vererbt wie bei Klassen kann man Verweise auf Interfaces definieren GraphObj someObject; Referenzvariablen eines Interfaces werden Objekte der Klasse zugewiesen, die das Interface implementieren someObjekt = new Point(4, 5, GraphObj.BLUE); someObject.hide(); ein Objekt einer Klasse, die mehrere Interfaces implementiert, kann an Verweise auf alle Interfaces zugewiesen werden Interfaces können wie Klassen vererbt und erweitert werden public interface FileGraphObj extends GraphObj { void load(); void save(); }

24 , Dr. Wolfram Amme, Softwareentwicklung in Java, FSU Jena, SS Die Wurzelklasse Object Methoden der Klasse Object werden von allen Objekten geerbt clone(), equals(), finalize(), getClass(), hashCode(), toString(), notify(), notifyAll(), sowie mehrere Versionen von wait(). Methoden in Object sind “Basismethoden”, die in abgeleiteten Klassen sinnvollerweise überschrieben werden sollten hashCode() liefert den Schlüssel eines Objektes für einen Eintrag in der Haschtabelle toString() konvertiert ein beliebiges Objekt in eine Zeichenkette MyObj myObject = newMyObj(); Answer theAnswer = new Answer(); System.out.println(myObject); String s = ´´The answer is: ´´ + theAnswer;

25 , Dr. Wolfram Amme, Softwareentwicklung in Java, FSU Jena, SS Objektgleichheit Methode equals() bestimmt, ob zwei Objekte gleich sind Gleichheit zweier Zeichenketten String userName = ´´Joe´´... if ( userName.equals(suspectName) ) arrest(userName); // if ( userName == suspectName) // Falsch!!! Voreinstellung!!! Methode equals() vergleicht Referenzen Achtung!!!! Überladen anstelle von Überschreiben der Methode kann zu Fehlern führen public boolean equals(Sneakers arg) {... } // Falsch !!! public boolean equals(Object arg) {... }// Richtig !!!

26 , Dr. Wolfram Amme, Softwareentwicklung in Java, FSU Jena, SS Flaches Kopieren versus Tiefes Kopieren Methode clone() erzeugt eine identische Kopie eines Objektes flaches Kopieren Kopieren mit clone() ist nur dann zulässig, wenn die betreffene Klasse das Interface Cloneable implementiert Interface nicht implementiert => CloneNotSupportedException Achtung!! Methode clone() ist in Object als protected deklariert Kopieren von Objekten Flaches Kopieren Tiefes Kopieren Objekt 1 Objekt 2 Objekt 1´ Objekt 1´ Objekt 2

27 , Dr. Wolfram Amme, Softwareentwicklung in Java, FSU Jena, SS Beispiel public class Buffer implements Cloneable { int [] buffer = new int[100];... public Object clone() { Object theClone = null; try{ theClone = super.clone(); } catch(CloneNotSupportedException e) { } return theClone; }

28 , Dr. Wolfram Amme, Softwareentwicklung in Java, FSU Jena, SS Die Klasse Class zur Laufzeit werden die in einem Java-Programm definierten Klassen durch Objekte der Klasse Class repräsentiert mit Class-Objekten kann man neue Objekte der repräsentierten Klasse erzeugen den vollständigen Klassennamen eines Objektes dynamisch erzeugen Klassen in die Virtuelle Maschine laden Informationen über die Bestandteile der repräsentierten Klasse - wie definierte Methoden, Konstruktoren bzw. Datenelemente - abrufen Bestimmung des Class-Objektes einer Klasse Aufruf der in der Klasse Object definierten Methode getClass() Class c = o.getClass(); // o: Referenz beliebiges Objekt Direkte Angabe des Klassennamens Class c = java.util.Vector.class;

29 , Dr. Wolfram Amme, Softwareentwicklung in Java, FSU Jena, SS Dynamisches Laden von Klassen Aufsuchen des zu einem Klassennamen gehörenden Class- Objekts Class c = Class.forName(´´java.util.Vector´´); Erzeugung eines Objektes über ein Class-Objekt Object o = c.newInstance(); Erzeugung von Objekten einer zur Übersetzungszeit noch nicht bekannten Klasse public Object createInstance(String name) throws Exception{ // Class-Objekt Class c = Class.forName(name); // Exemplar erzeugen und zurückliefern return c.newInstance(); }


Herunterladen ppt "12.05.1999, Dr. Wolfram Amme, Softwareentwicklung in Java, FSU Jena, SS 1999 1 Kapselung von Daten I Gründe für die Datenkapselung Datenkonsistenz leichtere."

Ähnliche Präsentationen


Google-Anzeigen