Klassen mit Instanzmethoden Gerd Bohlender Institut für Angewandte und Numerische Mathematik Vorlesung: Einstieg in die Informatik mit Java 3.12.07 G. Bohlender (IANM UNI Karlsruhe) OOP und Klassen 3.12.07 1 / 25
Übersicht 1 Definition von Klassen 2 Methoden 3 Methoden formale Parameter 4 Parameterübergabe, Aufruf einer Instanzmethode Referenztypen als Argument Zugriffe in einer Instanzmethode 5 Datenkapselung 6 Überladen von Methoden 7 Variable Argumentliste 8 Laufanweisung für Felder 9 Methode tostring() G. Bohlender (IANM UNI Karlsruhe) OOP und Klassen 3.12.07 2 / 25
Definition von Klassen Syntax Modifizierer class Bezeichner {Elementliste Die Elementliste besteht u.a. aus Attributen (d. h. Instanzvariablen), Konstruktoren und Instanzmethoden (d.h. Funktionen). Zweck der Instanzmethoden: Bearbeitung der Attribute, Klassen werden zu aktiven Objekten, Kommunikation mit anderen Klassen. G. Bohlender (IANM UNI Karlsruhe) OOP und Klassen 3.12.07 3 / 25
Methoden Syntax: Typspezifikation Methodenname (formale Parameterliste) { Deklarationen und Anweisungen double demo (double x) { return x*x; G. Bohlender (IANM UNI Karlsruhe) OOP und Klassen 3.12.07 4 / 25
Methoden formale Parameter Die formale Parameterliste setzt sich jeweils aus der Typspezifikation gefolgt vom zugehörigen Bezeichner zusammen und wird durch Kommata getrennt: Typ 1 Name 1,..., Typ n Name n Die formale Parameterliste darf leer sein, die runden Klammern hingegen müssen stehen. int leer () { return 123; G. Bohlender (IANM UNI Karlsruhe) OOP und Klassen 3.12.07 5 / 25
Methoden formale Parameter Für jeden Parameter muß eine eigene Typspezifikation existieren. int richtig (int x, int y) {... int falsch (int x, y) {... G. Bohlender (IANM UNI Karlsruhe) OOP und Klassen 3.12.07 6 / 25
Methoden formale Parameter Feldtypen, Zeichenketten und beliebige andere Objekte sind als Parameter und Ergebnisse zugelassen. Bei Feldern muss die korrekte Anzahl von eckigen Klammern, jedoch ohne die Dimension, zusammen mit dem Basistyp angegeben werden. double[] rechnenmitvektoren (double[] x) {... G. Bohlender (IANM UNI Karlsruhe) OOP und Klassen 3.12.07 7 / 25
Methodendefinition Ergebnis berechnen Die Rückgabe des Ergebnisses erfolgt über return Ausdruck; Der Ausdruck muß dabei zuweisungskompatibel zum Typ der Methode sein. Mit der return Anweisung wird die Methode abgebrochen und das angegebene Ergebnis zurückgeliefert. class Punkt { double x,y; double norm () { return Math.sqrt (x*x + y*y); G. Bohlender (IANM UNI Karlsruhe) OOP und Klassen 3.12.07 8 / 25
Methodendefinition Ergebnis berechnen Es muß in jedem Fall ein return durchlaufen werden, sonst tritt ein Fehler auf. Achtung: Dies ist eine beliebte Fehlerquelle bei der Verwendung von bedingten und verzweigten Anweisungen! int falsch (int x) { if (x >= 0) return 2*x; int richtig (int x) { if (x >= 0) return 2*x; else return x; G. Bohlender (IANM UNI Karlsruhe) OOP und Klassen 3.12.07 9 / 25
Methodendefinition void Wird kein Ergebnis benötigt, so ist der Ergebnistyp void und die return Anweisung lautet schlicht: return; Diese Anweisung muß nicht explizit angegeben werden, sondern wird am Ende der Methode automatisch ausgeführt. void ausgeben (int x) { System.out.println (x); Die Anweisung return; bewirkt, dass die Methode an dieser Stelle beendet wird. void ausgeben (int x) { if (x < 0) return; System.out.println (x); // wird evtl. nicht ausgefuehrt G. Bohlender (IANM UNI Karlsruhe) OOP und Klassen 3.12.07 10 / 25
Parameterübergabe, Aufruf einer Instanzmethode Der Methodenaufruf muß in einem Ausdruck des entsprechenden Typs erfolgen. Syntax: Instanzname. Methodenname (aktuelle Parameterliste) Der Instanzname gibt die Instanz an, deren Attribute bearbeitet werden sollen. Die aktuelle Parameterliste liefert zusätzliche Werte zur Bearbeitung Sie muß genauso viele Parameter vom passenden Typ besitzen wie die formale Parameter Liste. Ist die formale (und damit auch die aktuelle) Parameterliste leer, so müssen die runden Klammern trotzdem stehen. G. Bohlender (IANM UNI Karlsruhe) OOP und Klassen 3.12.07 11 / 25
Aufruf einer Instanzmethode Beispiel class Punkt { double x,y; void verschieben (double dx, double dy) { x += dx; y += dy;... Punkt p = new Punkt(); p.verschieben (10, 20); G. Bohlender (IANM UNI Karlsruhe) OOP und Klassen 3.12.07 12 / 25
Parameterübergabe, Aufruf einer Instanzmethode Die aktuellen Parameter können beliebige Ausdrücke (von passendem Typ) sein, sie werden von links nach rechts ausgewertet. class Demo { int ausdruck (int a, int b) { return 2*a + 3*b;... int i=1, j; Demo d = new Demo(); j = d.ausdruck (i++, i++); System.out.println (i + " " + j); // 3 8 G. Bohlender (IANM UNI Karlsruhe) OOP und Klassen 3.12.07 13 / 25
Parameterübergabe, Methodenaufruf Beim Aufruf der Methode wird das aktuelle Argument ausgewertet und das Ergebnis in einer lokalen Variablen mit dem Namen des formalen Parameters abgelegt, d. h. es wird stets mit einer Kopie der übergebenen Daten gearbeitet. class Demo { int erhoehen (int a) { return ++a;... int i=1, j; Demo d = new Demo(); j = d.erhoehen (i); System.out.println (i + " " + j); // 1 2 G. Bohlender (IANM UNI Karlsruhe) OOP und Klassen 3.12.07 14 / 25
Referenztypen als Argument Der aktuelle Parameter lässt sich durch Anweisungen innerhalb einer Methode nicht verändern. Achtung: bei Referenztypen gilt dies ebenso, aber nur für die Referenzvariablen, nicht für die referenzierten Größen (Feldelemente, Objekte, usw.) class Demo { void veraendern (int[] feld) { ++feld[0];... int[] f = {1,5,3; Demo d = new Demo(); d.veraendern (f); System.out.println (f[0]); // 2 G. Bohlender (IANM UNI Karlsruhe) OOP und Klassen 3.12.07 15 / 25
Referenztypen als Argument Die Referenzvariable selbst wird als Wert übergeben, kann also nicht verändert werden! class Demo { void nichtveraendern (int[] feld) { feld = new int[]{66,77,88,99;... int[] f = {1,5,3; Demo d = new Demo(); d.nichtveraendern (f); System.out.println (f[0]); // 1 G. Bohlender (IANM UNI Karlsruhe) OOP und Klassen 3.12.07 16 / 25
Zugriffe in einer Instanzmethode Eine Instanzmethode darf zugreifen auf Instanzvariablen (*) Formale Parameter Lokale Variablen dieser Methode Aufrufe anderer Instanzmethoden (*) (*) Angabe des Instanznamens ist nicht nötig, die Instanz ist bereits bekannt! class Punkt {... void weitverschieben () { verschieben (1000, 1000);... Punkt p = new Punkt (); p.verschieben (33,44); p.weitverschieben (); // p an verschieben weitergeben G. Bohlender (IANM UNI Karlsruhe) OOP und Klassen 3.12.07 17 / 25
Bemerkungen zu Methoden Lokale Variablen dürfen nicht den gleichen Namen wie ein formaler Parameter besitzen. Die aktuelle und formale Parameterliste müssen nicht die gleichen Bezeichner enthalten. Formale Parameter bzw. lokale Variablen dürfen den gleichen Bezeichner wie ein Attribut besitzen. Zur Unterscheidung schreibt man dann this.attributname this ist eine Referenz auf die aktuell bearbeitete Instanz der Klasse. class Gleichnamig { int x,y; void speichern (int x, int y) { this.x = x; this.y = y;... Gleichnamig gl = new Gleichnamig (); gl.speichern (33,44); // this entspricht gl G. Bohlender (IANM UNI Karlsruhe) OOP und Klassen 3.12.07 18 / 25
Datenkapselung Datenelemente werden aus Gründen der Datenkapselung oft mit dem Modifizierer private versehen. Die Klasse selber darf nur Standardrechte oder public Rechte besitzen. In einer Datei dürfen mehrere Klassen definiert werden, jedoch darf nur eine davon public Rechte besitzen. Diese Klasse muss den gleichen Namen wie die Datei tragen. G. Bohlender (IANM UNI Karlsruhe) OOP und Klassen 3.12.07 19 / 25 Zur Datenkapselung kann die Sichtbarkeit der Elemente mit Hilfe von vorangestellten Modifizierern geregelt werden. Mögliche Modifizierer public Element kann von jeder Klasse verwendet werden. protected (später... ) nichts Standard-Rechte, auch friendly genannt. Element kann u. a. in der Klasse selber sowie in allen Klassen des gleichen Pakets verwendet werden. private Element kann nur von der eigenen Klasse verwendet werden.
Beispiel zur Klassendefinition und Datenkapselung Nachfolgend wird der neue Datentyp Point definiert. class Point { private double x,y; // geschützt vor unberecht. Zugriff public double getx () { return x; public double gety () { return y; void move (double dx, double dy) { x += dx; y += dy; public static void main (String[] args) { Point p = new Point (); // bildet Instanz der Klasse // Point durch Aufruf des // Standardkonstruktors G. Bohlender (IANM UNI Karlsruhe) OOP und Klassen 3.12.07 20 / 25
Zugriff auf Elemente Außerhalb der Klasse, d.h. in einer anderen Klasse, ist der Zugriff nur auf sichtbare Komponenten erlaubt. Diese sind folglich mit öffentlichen Zugriffsrechten (public) bzw. für den Fall, dass sich die Klasse im gleichen Verzeichnis befindet, mit Standardrechten ausgestattet. Syntax Instanzname.Komponenten bei Instanzkomponenten Beispiel (erweiterte Klasse Point)... // im Hauptprogramm: System.out.println ("x-koodinate von p" + p.getx()); System.out.println (p.x); // syntaktisch richtig,... // aber Zugriff verboten! G. Bohlender (IANM UNI Karlsruhe) OOP und Klassen 3.12.07 21 / 25
Überladen von Methoden In Java können wie in C++ mehrere Methoden mit gleichem Namen in einer Klasse existieren. Beispiel: double max (double x, double y) {... int max (int x, int y) {... Die Methoden müssen unterschiedliche Parameterlisten besitzen. Der Ergebnistyp ist frei wählbar. Allerdings ist es nicht erlaubt, daß sich die Methoden nur in ihrem Ergebnistyp unterscheiden. Signatur: Name und Parameterliste sind entscheidend. G. Bohlender (IANM UNI Karlsruhe) OOP und Klassen 3.12.07 22 / 25
Variable Argumentliste Syntax Typ... Bezeichner Wird in der Methode als Feld vom angegebenen Typ interpretiert class Flexibel { void ausgeben (int... x) { for (int i=0; i<x.length; i++) System.out.println (x[i]);... Flexibel f = new Flexibel (); f.ausgeben (1,2,3); // drei einfache int // 1 2 3 G. Bohlender (IANM UNI Karlsruhe) OOP und Klassen 3.12.07 23 / 25
Laufanweisung für Felder Syntax for (Komponententyp Bezeichner : Feldname )... Der Bezeichner durchläuft alle Feldelelemente. double[] x = {1.5, 2.3, 3.7; // bekannte Variante: for (int i=0; i<x.length; i++) System.out.println (x[i]); // neue Variante: for (double xi: x) System.out.println (xi); In dieser Variante: kein Zugriff auf Index i möglich bzw. nötig. G. Bohlender (IANM UNI Karlsruhe) OOP und Klassen 3.12.07 24 / 25
Methode tostring() Syntax public String tostring() { return...; // Attribute als Text tostring() wird automatisch aufgerufen, wenn eine String-Darstellung eines Objekts gebraucht wird z.b. bei der Ausgabe. class Punkt { double x,y; public String tostring () { return x + ", " + y;... Punkt p = new Punkt (); System.out.println (p); // ruft tostring() auf // Ausgabe: 0, 0 G. Bohlender (IANM UNI Karlsruhe) OOP und Klassen 3.12.07 25 / 25