Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

07.11.06, PD Dr. Wolfram Amme, Tutorium zum Programmierpraktikum, FSU Jena, WS 2006/07 1 Objekte in Java.

Ähnliche Präsentationen


Präsentation zum Thema: "07.11.06, PD Dr. Wolfram Amme, Tutorium zum Programmierpraktikum, FSU Jena, WS 2006/07 1 Objekte in Java."—  Präsentation transkript:

1 07.11.06, PD Dr. Wolfram Amme, Tutorium zum Programmierpraktikum, FSU Jena, WS 2006/07 1 Objekte in Java

2 07.11.06, PD Dr. Wolfram Amme, Tutorium zum Programmierpraktikum, FSU Jena, WS 2006/07 2 Die Definition von Klassen Eine Klassendefinition besteht aus dem Schlüsselwort class und dem Klassennamen Der Körper einer Klasse enthält Variablen- und Methodendefinitionen class Point { int x, y, color; void moveTo(int newX, int newY){ x = newX; y = newY; } void moveRel(int dx, int dy){ x += dx; y += dy; }

3 07.11.06, PD Dr. Wolfram Amme, Tutorium zum Programmierpraktikum, FSU Jena, WS 2006/07 3 Objekte einer Klasse Erzeugen von Objekten (= Instanzen) einer Klasse Point start, end; start = new Point(); end = new Point(); Bei der Benutzung des new-Operators wird Speicherplatz für ein Objekt einer Klasse angefordert eine Vorinitialisierung der Zustandsvariablen vorgenommen der Konstruktor, eine spezielle Methode zum Initialisieren von Objekten, aufgerufen startend x: 0 y: 0 color :0 MoveTo() moveRel() x: 0 y: 0 color :0 MoveTo() moveRel()

4 07.11.06, PD Dr. Wolfram Amme, Tutorium zum Programmierpraktikum, FSU Jena, WS 2006/07 4 Konstruktoren einer Klasse Konstruktoren einer Klasse haben den gleichen Namen Konstruktoren haben keinen Ergebnistyp eine Klasse kann mehrere Konstruktoren mit unterschiedlichen formalen Parametern haben ruft ein Konstruktor einen anderen Konstruktor auf, dann muß dieser Aufruf die erste Anweisung des Konstruktors sein ist für eine Klasse kein Konstruktor definiert, so wird für die Klasse ein impliziter Konstruktor verwendet

5 07.11.06, PD Dr. Wolfram Amme, Tutorium zum Programmierpraktikum, FSU Jena, WS 2006/07 5 Definition von Konstruktoren class Point { int x, y, color; Point(){ x = 0; y = 0; color = 0; } Point(int newX, int newY){ x = newX; y = newY; color = 0; } Point(int newX, int newY, int newColor){ x = newX; y = newY; color = newColor; } void moveTo(int newX, int newY){... } void moveRel(int dx, int dy){... } }

6 07.11.06, PD Dr. Wolfram Amme, Tutorium zum Programmierpraktikum, FSU Jena, WS 2006/07 6 Verwendung von Konstruktoren Point start, end; start = new Point(); end = new Point(1,2,3); startend x: 0 y: 0 color :0 MoveTo() moveRel() x: 1 y: 2 color :3 MoveTo() moveRel()

7 07.11.06, PD Dr. Wolfram Amme, Tutorium zum Programmierpraktikum, FSU Jena, WS 2006/07 7 Der Schlüsselwort this Das this-Schlüsselwort liefert einen Verweis auf das Objekt in dem dieses Schlüsselwort steht Verwendung des this-Schlüsselwortes Abfragen der Referenz vom aktuellen Objekt drawPoint(this); Zugriff auf überdeckte Variablen Point(int x, int y){ this.x = x; this.y =y; } Zugriff auf andere Konstruktoren einer Klasse Point(int x, int y, int color){ this(x,y); this.color = color; }

8 07.11.06, PD Dr. Wolfram Amme, Tutorium zum Programmierpraktikum, FSU Jena, WS 2006/07 8 Entfernen von Objekten Garbage Collector (GC) gibt nicht mehr benötigte Objekte frei –GC ist in Java ein Thread mit niedriger Priorität –der Aufruf des GC kann mit System.gc() erzwungen werden Programmierer kann GC unterstützen Vector vec = new Vector(1000);... vec = null; GC ruft für ein Objekt die Methode finalize() auf protected void finalize() throws IOExecption{ if (fd != null){ if(fd != fd.in) close(); }

9 07.11.06, PD Dr. Wolfram Amme, Tutorium zum Programmierpraktikum, FSU Jena, WS 2006/07 9 Instanz- und Klassenvariablen Instanzvariablen enthalten die Attribute eines Objektes Definition überall in der Klassendefinition möglich int personalNummer; final int MINDESTANZAHL; Instanzvariablen werden für jedes Objekt einer Klasse angelegt Instanzvariablen werden mit Instanzreferenz. Variablenname aufgerufen benutzer.personalNummer Klassenvariablen sind globale Variablen innerhalb einer Klasse Klassenvariablen werden mit dem Modifier static definiert static int sum; final static int LEFT = 1; Klassenvariablen werden für eine Klasse nur einmal angelegt Klassenvariablen mit Klassenname.Variablenname angesprochen Benutzer.sum

10 07.11.06, PD Dr. Wolfram Amme, Tutorium zum Programmierpraktikum, FSU Jena, WS 2006/07 10 Beispiel zu Instanz- und Klassenvariablen class Benutzer{ int personalNummer; String name; String vorname; static int numUser = 0; static final int MAXUSER = 200; Benutzer(String name, String vorname){ personalNummer = numUser++; this.name = name; this.vorname = vorname; }... if (Benutzer.numUser + 1< Benutzer.MAXUSER){ Benutzer benutzer1 = new Benutzer(´´Müller´´, ´´Peter´´); Benutzer benutzer2 = new Benutzer(´´Meier´´, ´´Franz´´); int nummer = benutzer1.personalNummer; }

11 07.11.06, PD Dr. Wolfram Amme, Tutorium zum Programmierpraktikum, FSU Jena, WS 2006/07 11 Methoden Eine Methode wird folgendermaßen definiert: returntype Methodenname([parameter]){... } Methoden können lokale Variablendefinitionen enthalten lokale Variablen müssen vor dem ersten Gebrauch immer initialisiert werden, können Instanz- und Klassenvariablen überdecken Modellierung nicht fester Parameterzahl durch Reihungen int sum(int [] a){int [] n; int temp = 0;n = new int[10]; for(int i = 0; i < a.length; i++) int sum = sum(n); temp += a[i]; return temp; }

12 07.11.06, PD Dr. Wolfram Amme, Tutorium zum Programmierpraktikum, FSU Jena, WS 2006/07 12 Methoden mit variabler Parameteranzahl varargs können in Java zur Angabe von variablen Parameter- listen verwendet werden int sum(int... a) { } varargs können nur Elemente gleichen Typs beschreiben werden varargs in einer Signatur definiert, dürfen diese nur den letzten Parameter bilden innerhalb einer Methode werden varargs wie Reihungen behandelt for (int e : a) ….

13 07.11.06, PD Dr. Wolfram Amme, Tutorium zum Programmierpraktikum, FSU Jena, WS 2006/07 13 Beispiel: Varargs public static int sum( int... a ) { int temp = 0; for ( int e : a ) temp += e; return temp; } … public static void main( String[] args ) { System.out.println( sum(1, 2, 9, 3) ); // 15 }

14 07.11.06, PD Dr. Wolfram Amme, Tutorium zum Programmierpraktikum, FSU Jena, WS 2006/07 14 Instanz- und Klassenmethoden Instanzmethoden beziehen sich auf ein konkretes Objekt wie zum Beispiel int sum (int… a){... } Klassenmethoden gehören zu einer Klasse und nicht zu einem bestimmten Objekt der Klasse werden mit dem Schlüsselwort static definiert können nur statische Teile (Variablen, Methoden) einer Klasse verwenden Beispiel: Klasse Math static int numUser(){static int maxUser(){ return numUser;return MAXUSER;} Methodenaufruf InstanzmethodenInstanz.methode(argument1,...) KlassenmethodenKlasse.methode oder Instanz.methode

15 07.11.06, PD Dr. Wolfram Amme, Tutorium zum Programmierpraktikum, FSU Jena, WS 2006/07 15 Parameterübergabe Parameter werden durch call-by-value übergeben jeder Java-Datentyp kann übergeben werden primitive Datentypen können nicht verändert werden nur Attribute von Objekten können verändert werden, nicht das Objekt selbst Beispiel: Parameter ist ein einfacher Typ void getnumber(int number){ number = 0; // Parameter nicht geändert } Beispiel: Objekt als Parameter void substitute(Benutzer user){ user.name = ´´Müller´´; // Änderung außerhalb der Methode user = new Benutzer(´´Braun´´,´´Kevin´´); // keine Veränderung }

16 07.11.06, PD Dr. Wolfram Amme, Tutorium zum Programmierpraktikum, FSU Jena, WS 2006/07 16 Überladen von Methoden Java bietet die Möglichkeit, Methoden zu überladen gleicher Methodenname unterschiedliche Parameteranzahl bzw. Parametertypen Rückgabewert spielt keine Rolle bei der Methodenzuordnung Auswahl der aufgerufenen Methode zur Übersetzungszeit Ist eine Zuordnung der aufrufenden Methode eindeutig, so wird die Methode ausgewählt, welche gleiche Parameteranzahl bzw. -typen hat ist die Zuordnung eines Methodenaufrufs nicht eindeutig, wird die Methode ausgewählt, die zu allen in Frage kommenden Methoden die speziellste ist Eine Methode A ist spezieller als eine Methode B, falls gilt: Primitive Datentypen: Parametertypen aus A können automatisch in Parametertypen aus B konvertiert werden. Referenztypen: Parametertypen von A lassen sich aus den Parametertypen von B ableiten. sBeispiel: sum(Float a, Float b) ist spezieller als sum(Object a, Object b) die Zuordnung der Parameterlisten muß eindeutig sein

17 07.11.06, PD Dr. Wolfram Amme, Tutorium zum Programmierpraktikum, FSU Jena, WS 2006/07 17 Beispiel zum Überladen von Methoden void swap(Object a, Object b){ Object temp = a; b = a; a = temp; } void swap(Float a, Float b){ Float temp = a; b = a; a = temp; } Float a = new Float(1.2); Float b = new Float(2.3); swap(a,b); // die Methode swap(Float a, Float b) wird aufgerufen // Hinweis:Aufruf swap(a,b) ändert die Aufrufumgebung nicht

18 07.11.06, PD Dr. Wolfram Amme, Tutorium zum Programmierpraktikum, FSU Jena, WS 2006/07 18 Kapselung von Daten 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

19 07.11.06, PD Dr. Wolfram Amme, Tutorium zum Programmierpraktikum, FSU Jena, WS 2006/07 19 Beispiel public class Benutzer{ private int userNummer; private String name; private String vorname; private static int numUser = 0; private static final int MAXUSER = 200; public void setName(String name){this.name = name;} public String getName(){return name;} : } Benutzer benutzer = new Benutzer(); benutzer.name = ´´Meier´´; // Fehler!!! benutzer.setName(´´Meier´´);// okay

20 07.11.06, PD Dr. Wolfram Amme, Tutorium zum Programmierpraktikum, FSU Jena, WS 2006/07 20 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) alle Klassen haben die Klasse java.lang.Object als Oberklasse

21 07.11.06, PD Dr. Wolfram Amme, Tutorium zum Programmierpraktikum, FSU Jena, WS 2006/07 21 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 = a; } public int area(){ return a * a; }

22 07.11.06, PD Dr. Wolfram Amme, Tutorium zum Programmierpraktikum, FSU Jena, WS 2006/07 22 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

23 07.11.06, PD Dr. Wolfram Amme, Tutorium zum Programmierpraktikum, FSU Jena, WS 2006/07 23 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 { }

24 07.11.06, PD Dr. Wolfram Amme, Tutorium zum Programmierpraktikum, FSU Jena, WS 2006/07 24 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 { }

25 07.11.06, PD Dr. Wolfram Amme, Tutorium zum Programmierpraktikum, FSU Jena, WS 2006/07 25 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 { }

26 07.11.06, PD Dr. Wolfram Amme, Tutorium zum Programmierpraktikum, FSU Jena, WS 2006/07 26 Überdecken von Variablen I Vererbung kann zum Überdecken von Instanzvariablen führen class Point { int x, y, color;... void methode1(){ … = x;} } class RealPoint extends Point { float x, y, color;... void methode2(){ … = x;} } Festlegung der Variablenzugriffe erfolgt statisch zur Übersetzungszeit

27 07.11.06, PD Dr. Wolfram Amme, Tutorium zum Programmierpraktikum, FSU Jena, WS 2006/07 27 Ü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

28 07.11.06, PD Dr. Wolfram Amme, Tutorium zum Programmierpraktikum, FSU Jena, WS 2006/07 28 Auflösung: Zugriff auf Zustandsvariablen die Zuordnung von Referenzzugriffen auf Zustandsvariablen wird alleinig zur Übersetzungszeit aufgelöst und hängt nur davon ab, von welcher Klasse die Variable definiert ist, mit der auf das Objekt zugegriffen wird K k; : k.x für einen Zugriff k.x wird die Zustandsvariable x immer in der Klassenbeschreibung von K gesucht und das unabhängig davon auf was für ein Objekt mit k tatsächlich zur Laufzeit zugegriffen wird

29 07.11.06, PD Dr. Wolfram Amme, Tutorium zum Programmierpraktikum, FSU Jena, WS 2006/07 29 Ü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);} }

30 07.11.06, PD Dr. Wolfram Amme, Tutorium zum Programmierpraktikum, FSU Jena, WS 2006/07 30 Ü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

31 07.11.06, PD Dr. Wolfram Amme, Tutorium zum Programmierpraktikum, FSU Jena, WS 2006/07 31 Erster Schritt: Übersetzungszeit aktuelle Parametertypen des Methodenaufrufs werden bestimmt, dann wird die Signatur des Aufrufs festgelegt K k; : k.f(a 1,..., a n ) Signatur eines Methodenaufrufes hängt alleinig von der Klasse ab, von welcher die Variable definiert ist, mit der auf das Objekt zugegriffen wird für den Aufruf k.f(a1,..., an) wird in der Klasse K - ähnlich wie beim Auflösen überladener Methodenaufrufe - nach einer geeigneten Methode gesucht, mit welcher der aktuelle Aufruf durchgeführt werden kann

32 07.11.06, PD Dr. Wolfram Amme, Tutorium zum Programmierpraktikum, FSU Jena, WS 2006/07 32 Zweiter Schritt: Ausführungszeit zur Programmausführungszeit wird dann überprüft, von welcher Klasse das Objekt, für das der Methodenaufruf durchgeführt werden soll, tatsächlich generiert wurde in dieser zur Laufzeit gefundenen Klassenbeschreibung wird nach der letzten Implementierung des Methodenaufrufs gesucht K k; K1 k1 = new K1(); : k = k1; k.f(a 1,..., a n )


Herunterladen ppt "07.11.06, PD Dr. Wolfram Amme, Tutorium zum Programmierpraktikum, FSU Jena, WS 2006/07 1 Objekte in Java."

Ähnliche Präsentationen


Google-Anzeigen