26
Einstieg in die Informatik mit Java Methoden Gerd Bohlender Institut f ¨ ur Angewandte und Numerische Mathematik 1 / 26

Einstieg in die Informatik mit Java - math.kit.edu · (1)Bei der direkten Rekursion ruft sich die Methode selber auf, (2)bei der indirekten Rekursion rufen sich zwei oder mehrere

Embed Size (px)

Citation preview

Einstieg in die Informatik mit JavaMethoden

Gerd Bohlender

Institut fur Angewandte und Numerische Mathematik

1 / 26

Gliederung

1 Methoden

2 Methodendefinition

3 Parameterubergabe, Methodenaufruf

4 Referenztypen bei Methoden

5 Uberladen von Methoden

6 Hauptprogrammparameter

7 Rekursion

2 / 26

Gliederung

1 Methoden

2 Methodendefinition

3 Parameterubergabe, Methodenaufruf

4 Referenztypen bei Methoden

5 Uberladen von Methoden

6 Hauptprogrammparameter

7 Rekursion

3 / 26

Methoden

Methoden bilden das Analogon zu den aus Pascal, C und C++bekannten Funktionen und dienen dazu, mehrfachvorkommenden Quelltext zusammenzufassen und Programmeubersichtlicher zu gestalten.In diesem Abschnitt werden zunachst nur statische Methoden,d. h. nicht objektorientierte Methoden, behandelt, die ausdiesem Grunde mit dem Modifizierer static markiert werden.

SyntaxModifizierer Typspezifikation Methodenname

(formale Parameterliste) {Deklarationen und Anweisungen

}

4 / 26

Gliederung

1 Methoden

2 Methodendefinition

3 Parameterubergabe, Methodenaufruf

4 Referenztypen bei Methoden

5 Uberladen von Methoden

6 Hauptprogrammparameter

7 Rekursion

5 / 26

Methodendefinition

Die formale Parameterliste setzt sich jeweils aus derTypspezifikation gefolgt vom zugehorigen Bezeichnerzusammen und wird durch Kommata getrennt:Typ 1 Name 1, . . . , Typ n Name n

• Die formale Parameterliste darf leer sein, die rundenKlammern hingegen mussen stehen.

• Fur jeden Parameter muss eine eigene Typspezifikationexistieren.

• Feldtypen, Zeichenketten und beliebige andere Objektesind als Parameter und Ergebnisse zugelassen. BeiFeldern muss die korrekte Anzahl von eckigen Klammern,jedoch ohne die Dimension, zusammen mit dem Basistypangegeben werden.

6 / 26

Methodendefinition

• Die Ruckgabe des Ergebnisses erfolgt uberreturn Ausdruck;

Der Ausdruck muss dabei zuweisungskompatibel zum Typder Methode sein.

• Mit der return–Anweisung wird die Methode abgebrochenund das angegebene Ergebnis zuruckgeliefert. Insgesamtmuss ein return durchlaufen werden, sonst tritt ein Fehlerauf.

AchtungDies ist eine beliebte Fehlerquelle bei der Verwendung vonbedingten und verzweigten Anweisungen!

7 / 26

Methodendefinition

• Eine Schachtelung von Methoden ist im Gegensatz zuPascal und C++ nicht erlaubt. Methoden mussen stets aufaußerster Ebene in einer Klasse definiert werden.

• Wird kein Ergebnis benotigt, so ist der Ergebnistyp voidund die return–Anweisung lautet schlicht:

return;

Diese Anweisung muss nicht explizit angegeben werden,sondern wird am Ende der Methode automatischausgefuhrt.

8 / 26

Methodendefinition

BeispielMethode zur Berechnung von xn mit n ganzzahlig

s t a t i c double power ( double x , i n t n ) {i n t m;double y = 1 . 0 ;i f ( n>=0) m = n ;

/ / Absolut−Betrag von nelse m = −n ;/ / Berechnung von x ˆmfor ( i n t i =0; i <m; ++ i ) y∗=x ;i f ( n>=0) return y ;else return 1 . 0 / y ;

}

Der Aufruf erfolgt dann im Hauptprogramm uber:

double y = power ( a , 5 ) ;

Die Methode Math.pow() bestimmt ebenfalls xy , wobei y dannauch eine Gleitkommazahl sein darf.

9 / 26

Gliederung

1 Methoden

2 Methodendefinition

3 Parameterubergabe, Methodenaufruf

4 Referenztypen bei Methoden

5 Uberladen von Methoden

6 Hauptprogrammparameter

7 Rekursion

10 / 26

Parameterubergabe, Methodenaufruf

SyntaxMethodenname (aktuelle Parameterliste)

• Die aktuelle Parameterliste muss genauso viele Parameterbesitzen wie die formale Parameter–Liste.

• Im Gegensatz zu Pascal und C++ werden alle Parametereiner Methode als Werteparameter ubergeben.

• Die aktuellen Parameter werden von links nach rechtsausgewertet.

• Beim Aufruf der Methode wird das aktuelle Argumentausgewertet und das Ergebnis in einer lokalen Variablenmit dem Namen des formalen Parameters abgelegt, d. h.es wird stets mit einer Kopie der ubergebenen Datengearbeitet.

11 / 26

Parameterubergabe, Methodenaufruf

• Weiterhin muss der Methodenaufruf in einem Ausdruckdes entsprechenden Typs erfolgen.

• Ist die formale (und damit auch die aktuelle) Parameterlisteleer, so mussen die runden Klammern trotzdem stehen.

• Der aktuelle Parameter lasst sich bei einer Ubergabe alsWerteparameter nicht verandern. Fur dieses Vorhaben gibtes in Java Referenztypen.

Beispiel

s t a t i c i n t f ( i n t i , i n t j ) { / / D e f i n i t i o n von freturn ( i + j ) ;

}. . . / / im Hauptprogramm :i n t i = 1 ;System . out . p r i n t l n ( f ( i ++ , i ) ) ; / / Au f ru f : f ( 1 ,2 ) e r g i b t 3

12 / 26

Gliederung

1 Methoden

2 Methodendefinition

3 Parameterubergabe, Methodenaufruf

4 Referenztypen bei Methoden

5 Uberladen von Methoden

6 Hauptprogrammparameter

7 Rekursion

13 / 26

Referenztypen bei Methoden

Objekte, also auch Felder und Zeichenketten, sindReferenztypen. Auch sie werden per Wertaufruf ubergeben,d. h. die Referenz wird in eine lokale Variable kopiert. Folglichkann die aktuelle Große im aufrufenden Programm nichtverandert werden.

AchtungDie Werte, auf die die Referenz verweisen, werden hingegennicht kopiert und konnen deshalb verandert werden!

14 / 26

Referenztypen bei Methoden

Beispiel

s t a t i c void demo1 ( i n t [ ] x ) {x [ 0 ] + + ;

}. . . / / im Hauptprogramm :i n t [ ] y = new i n t [ ] {1 , 2} ;demo1 ( y ) ; / / Au f ru f der Methode demo1

/ / x und y zeigen beide auf/ / g le i che Speicheradressen !/ / x=y={2 ,2}

AchtungDies entspricht aus den folgenden beiden Grunden nur teilweiseeinem Referenzaufruf von Pascal (var) oder C++ (&).

15 / 26

Referenztypen bei Methoden

(1) Es besteht keine Wahlmoglichkeit. Grundtypen sind immerWerte, Objekte immer Referenzen.

(2) Auch bei Referenztypen kann das Objekt selber (d. h. dieReferenz) nicht verandert werden, nur seineKomponenten.

Beispiel

s t a t i c void demo2 ( i n t [ ] x ) {x = new i n t [ ] {4 , 5 , 6} ; / / x komplet t neues ObjektSystem . out . p r i n t l n ( x [ 0 ] ) ;

}. . . / / im Hauptprogramm :i n t [ ] y = new i n t [ ] {1 ,2} ;demo2 ( y ) ; / / Au f ru f der Meth . demo2System . out . p r i n t l n ( y [ 0 ] ) ; / / e r g i b t y [0 ]=1 , x [0 ]=4

16 / 26

Gliederung

1 Methoden

2 Methodendefinition

3 Parameterubergabe, Methodenaufruf

4 Referenztypen bei Methoden

5 Uberladen von Methoden

6 Hauptprogrammparameter

7 Rekursion

17 / 26

Uberladen von Methoden

In Java konnen wie in C++ mehrere Methoden mit gleichemNamen 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 mussen unterschiedliche Parameterlistenbesitzen.

• Der Ergebnistyp ist frei wahlbar. Allerdings ist es nichterlaubt, dass sich die Methoden nur in ihrem Ergebnistypunterscheiden.→ Signatur: Name und Parameterliste sind entscheidend.

18 / 26

Bemerkungen zu Methoden

• Im Gegensatz zu C++ gibt es keine separate Deklarationder Methoden.

• Lokale Variablen durfen nicht den gleichen Namen wie einformaler Parameter besitzen.

• Die aktuelle und formale Parameterliste mussen nicht diegleichen Bezeichner enthalten.

19 / 26

Gliederung

1 Methoden

2 Methodendefinition

3 Parameterubergabe, Methodenaufruf

4 Referenztypen bei Methoden

5 Uberladen von Methoden

6 Hauptprogrammparameter

7 Rekursion

20 / 26

Hauptprogrammparameter

Das Hauptprogramm bei Java (Applets sind hiervonausgenommen) ist eine Methode der Form

public s t a t i c void main ( S t r i n g [ ] args ) {/ / args i s t e in Feld von Zeichenket ten .

• Argumente werden an der Kommandozeile mitLeerzeichen getrennt.

• Die Umleitung der Standardausgabe vom Bildschirm ineine Datei erfolgt durch

> Dateiname

entsprechend erfolgt die Eingabe uber< Dateiname

AchtungDiese Angaben zahlen nicht zur Argumentliste!

21 / 26

Hauptprogrammparameter

• Im Gegensatz zu C++ kommt der Programmnameebenfalls nicht in der Argumentliste vor.

Beispieljava MeinPrg Hallo Welt // args[0]=Hallo

// args[1]=Weltjava MeinPrg < Daten.dat > Ausgabe.txt Hallo Welt

// args[0]=Hallo// args[1]=Welt

22 / 26

Gliederung

1 Methoden

2 Methodendefinition

3 Parameterubergabe, Methodenaufruf

4 Referenztypen bei Methoden

5 Uberladen von Methoden

6 Hauptprogrammparameter

7 Rekursion

23 / 26

Rekursion

Es werden bei Methoden zwei Rekursionsarten unterschieden:(1) Bei der direkten Rekursion ruft sich die Methode selber auf,(2) bei der indirekten Rekursion rufen sich zwei oder mehrere

Methoden gegenseitig auf, d. h. Methode a() ruft Methodeb() und umgekehrt.

• Lokale Variablen werden bei jedem rekursiven Aufruferneut angelegt.

• Es handelt sich bei der Rekursion um ein sehrleistungsfahiges Werkzeug, allerdings muss daraufgeachtet werden, dass die Rekursion nach endlich vielenSchritten endet.

• In vielen Fallen ist die Iteration mit einer Schleife effizienter.

24 / 26

Rekursion - Demo-Beispiele

BeispielBerechnung von xn, n ∈ N

xn =

{xn−1 · x , falls n > 0,

1, sonst.

BeispielBerechnung der Fibonacci–Zahlen

f0 = 1,

f1 = 1,

fi = fi−1 + fi−2 fur i ≥ 2.

25 / 26

Rekursion - Beispiel Fibonaccizahlen

public class Fibonacc i {s t a t i c i n t f i b o n a c c i ( i n t i ) {

i f ( i <=1) return 1; / / n i ch t−rek . T e i lelse return ( f i b o n a c c i ( i −1)+ f i b o n a c c i ( i −2) ) ;

/ / rek . T e i l}public s t a t i c void main ( S t r i n g [ ] args ) {

for ( i n t i =0; i <=100; ++ i )System . out . p r i n t l n ( f i b o n a c c i ( i ) ) ;

}}

AchtungEin großer Vorteil liegt hier in der direkten Umsetzung dermathematischen Formel! Allerdings ist dies in diesem konkretenFall sehr ineffizient, da viele Werte mehrfach berechnet werden!

26 / 26