1 / 34 Einstieg in die Informatik mit Java Klassen mit Instanzmethoden Gerd Bohlender Institut für Angewandte und Numerische Mathematik
Gliederung 2 / 34 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()
Gliederung 3 / 34 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()
4 / 34 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.
Gliederung 5 / 34 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()
Methoden 6 / 34 Syntax T y p s p e z i f i k a t i o n Methodenname ( formale P a r a m e t e r l i s t e ) { Deklarationen und Anweisungen ; double demo ( double x ) { return x x ;
Gliederung 7 / 34 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()
Methoden formale Parameter 8 / 34 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. i n t l e e r ( ) { return 123;
Methoden formale Parameter 9 / 34 Für jeden Parameter muß eine eigene Typspezifikation existieren. i n t r i c h t i g ( i n t x, i n t y ) {... i n t f a l s c h ( i n t x, y ) {...
Methoden formale Parameter 10 / 34 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 ) {...
11 / 34 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. s q r t ( x x + y y ) ;
i n t f a l s c h ( i n t x ) { i f ( x >= 0) return 2 x ; i n t r i c h t i g ( i n t x ) { i f ( x >= 0) return 2 x ; else return x ; 12 / 34 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!
Methodendefinition void 13 / 34 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 ( i n t x ) { System. out. p r i n t l n ( x ) ; Die Anweisung return; bewirkt, dass die Methode an dieser Stelle beendet wird. void ausgeben ( i n t x ) { i f ( x < 0) return ; System. out. p r i n t l n ( x ) ; / / wird e v t l. n i c h t ausgefuehrt
Gliederung 14 / 34 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()
15 / 34 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.
Aufruf einer Instanzmethode Beispiel 16 / 34 class Punkt { double x, y ; void verschieben ( double dx, double dy ) { x += dx ; y += dy ;... Punkt p = new Punkt ( ) ; p. verschieben (10, 2 0 ) ;
Parameterübergabe, Aufruf einer Instanzmethode 17 / 34 Die aktuellen Parameter können beliebige Ausdrücke (von passendem Typ) sein, sie werden von links nach rechts ausgewertet. class Demo { i n t ausdruck ( i n t a, i n t b ) { return 2 a + 3 b ;... i n t i =1, j ; Demo d = new Demo ( ) ; j = d. ausdruck ( i ++, i ++); System. out. p r i n t l n ( i + + j ) ; / / 3 8
Parameterübergabe, Methodenaufruf 18 / 34 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 { i n t erhoehen ( i n t a ) { return ++a ;... i n t i =1, j ; Demo d = new Demo ( ) ; j = d. erhoehen ( i ) ; System. out. p r i n t l n ( i + + j ) ; / / 1 2
Referenztypen als Argument 19 / 34 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 ( i n t [ ] f e l d ) { ++ f e l d [ 0 ] ;... i n t [ ] f = {1,5,3; Demo d = new Demo ( ) ; d. veraendern ( f ) ; System. out. p r i n t l n ( f [ 0 ] ) ; / / 2
Referenztypen als Argument 20 / 34 Die Referenzvariable selbst wird als Wert übergeben, kann also nicht verändert werden! class Demo { void nichtveraendern ( i n t [ ] f e l d ) { f e l d = new i n t []{66,77, 88,99;... i n t [ ] f = {1,5,3; Demo d = new Demo ( ) ; d. nichtveraendern ( f ) ; System. out. p r i n t l n ( f [ 0 ] ) ; / / 1
Zugriffe in einer Instanzmethode 21 / 34 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 ( 3 3, 4 4 ) ; p. weitverschieben ( ) ; / / p an verschieben weitergeben
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 { i n t x, y ; void speichern ( i n t x, i n t y ) { this. x = x ; this. y = y ;... Gleichnamig g l = new Gleichnamig ( ) ; g l. speichern ( 3 3, 4 4 ) ; / / t h i s e n t s p r i c h t g l 22 / 34
Gliederung 23 / 34 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()
Datenkapselung 24 / 34 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. 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.
Beispiel zur Klassendefinition und Datenkapselung 25 / 34 Nachfolgend wird der neue Datentyp Point definiert. class Point { private double x, y ; / / geschützt vor unberecht. Z u g r i f f public double getx ( ) { return x ; public double gety ( ) { return y ; void move ( double dx, double dy ) { x += dx ; y += dy ; public s t a t i c void main ( S t r i n g [ ] args ) { Point p = new Point ( ) ; / / b i l d e t Instanz der Klasse / / Point durch A u f r u f des / / Standardkonstruktors
Zugriff auf Elemente 26 / 34 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 Beispiel (erweiterte Klasse Point) bei Instanzkomponenten... / / im Hauptprogramm : System. out. p r i n t l n ( x Koodinate von p + p. getx ( ) ) ; System. out. p r i n t l n ( p. x ) ; / / s y n t a k t i s c h r i c h t i g,... / / aber Z u g r i f f verboten!
Gliederung 27 / 34 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()
28 / 34 Ü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 ) {... i n t max ( i n t x, i n t y ) {... Die Methoden müssen unterschiedliche Parameterlisten besitzen. Der Ergebnistyp ist frei wählbar. Allerdings ist es nicht erlaubt, dass sich die Methoden nur in ihrem Ergebnistyp unterscheiden. Signatur: Name und Parameterliste sind entscheidend.
Gliederung 29 / 34 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()
30 / 34 Variable Argumentliste Syntax Typ... Bezeichner Wird in der Methode als Feld vom angegebenen Typ interpretiert class F l e x i b e l { void ausgeben ( i n t... x ) { for ( i n t i =0; i <x. l e n g t h ; i ++) System. out. p r i n t l n ( x [ i ] ) ;... F l e x i b e l f = new F l e x i b e l ( ) ; f. ausgeben ( 1, 2, 3 ) ; / / d r e i einfache i n t / / 1 2 3
Gliederung 31 / 34 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()
32 / 34 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 ( i n t i =0; i <x. l ength ; i ++) System. out. p r i n t l n ( x [ i ] ) ; / / neue Variante : for ( double x i : x ) System. out. p r i n t l n ( x i ) ; In dieser Variante: kein Zugriff auf Index i möglich bzw. nötig.
Gliederung 33 / 34 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()
class Punkt { double x, y ; public S t r i n g t o S t r i n g ( ) { return x +, + y ;... Punkt p = new Punkt ( ) ; System. out. p r i n t l n ( p ) ; / / r u f t t o S t r i n g ( ) auf / / Ausgabe : 0, 0 34 / 34 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.