klassen mit instanzmethoden...ubersicht¨ 1 definition von klassen 2 methoden 3 methoden –...
TRANSCRIPT
Klassen mit Instanzmethoden
Gerd Bohlender
Institut fur Angewandte undNumerische Mathematik
Vorlesung: Einstieg in die Informatik mit Java
3.12.07
G. Bohlender (IANM – UNI Karlsruhe) OOP und Klassen 3.12.07 1 / 25
Ubersicht
1 Definition von Klassen
2 Methoden
3 Methoden – formale Parameter
4 Parameterubergabe, Aufruf einer InstanzmethodeReferenztypen als ArgumentZugriffe in einer Instanzmethode
5 Datenkapselung
6 Uberladen von Methoden
7 Variable Argumentliste
8 Laufanweisung fur 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 Typspezifikationgefolgt vom zugehorigen Bezeichner zusammen und wird durch Kommatagetrennt:
Typ 1 Name 1, . . . , Typ n Name n
Die formale Parameterliste darf leer sein, die runden Klammernhingegen mussen stehen.
int leer () {return 123;
}
G. Bohlender (IANM – UNI Karlsruhe) OOP und Klassen 3.12.07 5 / 25
Methoden – formale Parameter
Fur 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 alsParameter und Ergebnisse zugelassen. Bei Feldern muss die korrekteAnzahl 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 Ruckgabe des Ergebnisses erfolgt uber
return Ausdruck;
Der Ausdruck muß dabei zuweisungskompatibel zum Typ derMethode sein.
Mit der return–Anweisung wird die Methode abgebrochen und dasangegebene Ergebnis zuruckgeliefert.
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 einFehler auf.
Achtung: Dies ist eine beliebte Fehlerquelle bei der Verwendung vonbedingten und verzweigten Anweisungen!
int falsch (int x) {if (x >= 0)
return 2*x;}int richtig (int x) {
if (x >= 0)return 2*x;
elsereturn x;
}
G. Bohlender (IANM – UNI Karlsruhe) OOP und Klassen 3.12.07 9 / 25
Methodendefinition – void
Wird kein Ergebnis benotigt, so ist der Ergebnistyp void und diereturn–Anweisung lautet schlicht:
return;
Diese Anweisung muß nicht explizit angegeben werden, sondern wirdam Ende der Methode automatisch ausgefuhrt.
void ausgeben (int x) {System.out.println (x);
}
Die Anweisung return; bewirkt, dass die Methode an dieser Stellebeendet 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
Parameterubergabe, Aufruf einer Instanzmethode
Der Methodenaufruf muß in einem Ausdruck des entsprechenden Typserfolgen.Syntax:
Instanzname . Methodenname (aktuelle Parameterliste)
Der Instanzname gibt die Instanz an, deren Attribute bearbeitetwerden sollen.
Die aktuelle Parameterliste liefert zusatzliche Werte zur Bearbeitung
Sie muß genauso viele Parameter vom passenden Typ besitzen wie dieformale Parameter–Liste.
Ist die formale (und damit auch die aktuelle) Parameterliste leer, somussen 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
Parameterubergabe, Aufruf einer Instanzmethode
Die aktuellen Parameter konnen beliebige Ausdrucke (von passendemTyp) 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
Parameterubergabe, Methodenaufruf
Beim Aufruf der Methode wird das aktuelle Argument ausgewertetund das Ergebnis in einer lokalen Variablen mit dem Namen desformalen Parameters abgelegt, d. h. es wird stets mit einer Kopie derubergebenen 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 lasst sich durch Anweisungen innerhalb einerMethode nicht verandern.
Achtung: bei Referenztypen gilt dies ebenso, aber nur fur dieReferenzvariablen, nicht fur die referenzierten Groß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 ubergeben, kann also nichtverandert 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 ParameterLokale Variablen dieser MethodeAufrufe anderer Instanzmethoden (*)
(*) Angabe des Instanznamens ist nicht notig, die Instanz ist bereitsbekannt!
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 durfen nicht den gleichen Namen wie ein formalerParameter besitzen.Die aktuelle und formale Parameterliste mussen nicht die gleichenBezeichner enthalten.Formale Parameter bzw. lokale Variablen durfen den gleichenBezeichner wie ein Attribut besitzen. Zur Unterscheidung schreibtman dann this.Attributnamethis 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
Zur Datenkapselung kann die Sichtbarkeit der Elemente mit Hilfe vonvorangestellten Modifizierern geregelt werden.
Mogliche Modifizierer
public Element kann von jeder Klasse verwendet werden.protected (spater . . . )nichts Standard-Rechte, auch friendly genannt.
Element kann u. a. in der Klasse selber sowiein allen Klassen des gleichen Pakets verwendet werden.
private Element kann nur von der eigenen Klasse verwendet werden.
Datenelemente werden aus Grunden der Datenkapselung oft mit demModifizierer private versehen.Die Klasse selber darf nur Standardrechte oder public–Rechtebesitzen.In einer Datei durfen mehrere Klassen definiert werden, jedoch darfnur eine davon public–Rechte besitzen. Diese Klasse muss dengleichen Namen wie die Datei tragen.
G. Bohlender (IANM – UNI Karlsruhe) OOP und Klassen 3.12.07 19 / 25
Beispiel zur Klassendefinition und Datenkapselung
Nachfolgend wird der neue Datentyp Point definiert.
class Point {private double x,y; // geschutzt vor unberecht. Zugriffpublic 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 aufsichtbare Komponenten erlaubt. Diese sind folglich mit offentlichenZugriffsrechten (public) bzw. fur den Fall, dass sich die Klasse imgleichen 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
Uberladen von Methoden
In Java konnen wie in C++ mehrere Methoden mit gleichem Namen ineiner Klasse existieren.
Beispiel:
double max (double x, double y) { ... }int max (int x, int y) { ... }
Die Methoden mussen unterschiedliche Parameterlisten besitzen.
Der Ergebnistyp ist frei wahlbar. 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 fur Felder
Syntax
for (Komponententyp Bezeichner : Feldname ) ...
Der Bezeichner durchlauft 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 moglich bzw. notig.
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 einesObjekts 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