Sie sind auf Seite 1von 12

Kapitel — Methodenaufruf mit Parametern

Wenn Sie eine Methode verwenden, werden Sie oft Informationen in Form von Parameter
übergeben müssen. Dieses Kapitel bespricht Methodenaufrufe und Parameter.

Themen:

 Methoden ohne Parameter

 Parameterlisten

 Datentypen von Parametern

 Ausdrücke in Parameterlisten

 Konvertierung von Werten in Parameterlisten

FRAGE 1:

Nachdem die folgenden Anweisungen ausgeführt wurden

String str = new String("Buchstaben Suppe");

int laenge = str.length();

welchen Wert enthält die Variable laenge?

16 (Denken Sie daran das Leerzeichen mit zu zählen.)

Parameterlose Methoden

Betrachten Sie noch einmal den Methodenaufruf (die zweite Anweisung, die "Punktnotation"
verwendet, um die Methode zu bestimmen).

String str = new String("Buchstaben Suppe");

int laenge = str.length( );

| | |

| | +---- eine Parameterliste ohne Parameter

| |

| +---- der Name der Methode, die ausgeführt werden soll

+---- die Referenz auf das Objekt, das die Methode enthält

Die zweite Anweisung enthält einen Methodenaufruf. Das ist eine Anforderung die Methode eines
Objekts auszuführen. Das Objekt, das durch str referenziert wird, enthält eine Methode length()
die, wenn sie aufgerufen wird, die Anzahl der Zeichen des Strings zurückgibt.

Die length() Methode erfordert keine Parameter. Die Parameterliste in dem Methodenaufruf
str.length() ist leer.

FRAGE 2:

Was ist falsch an dem folgendem Codesegment?

1
Point meinPoint = new Point(); // einen Punkt bei x=0, y=0 konstruieren

meinPoint.move(); // den Punkt auf eine neue Position verschieben

Die zweite Anweisung ruft die Methode move() von meinPoint auf, aber sie stellt keine Daten
bereit, wohin der Punkt zu verschieben ist.

Ausdrücke in Parameterlisten

In diesem Fall ist die Angabe, welche Methode auszuführen ist, nicht genug. Die Methode braucht
Daten darüber, was zu tun ist. Wenn Sie sich die Beschreibung der Klasse Point ansehen, wird die
move() Methode folgendermaßen beschrieben:

public void move(int x, int y); // (x,y) eines point-Objekts ändern

Diese Beschreibung besagt, dass die Methode zwei Parameter benötigt:

1. Der erste Parameter muss vom Typ int sein. Er wird der neue Wert für x sein.

2. Der zweite Parameter muss vom Typ int sein. Er wird der neue Wert für y sein.

Die Punktnotation wird verwendet, um anzugeben welches Objekt und welche Methode dieses
Objekts auszuführen ist. Die Parameterliste der Methode versorgt die Methode mit Daten. Hier
sind einige Beispiele:

Point pointA = new Point();

Point pointB = new Point( 94, 172 );

pointA.move( 45, 82 );

pointB.move( 24-12, 34*3 - 45 );

int x = 87;

int y = 55;

pointA.move( x, y );

pointB.move( x - 4, y * 2 + 34 );

Sie können Ausdrücke in Parameterlisten angeben, solange der Ausdruck den Datentyp ergibt, den
die Methode erwartet. Die Ausdrücke werden ausgewertet (unter der Verwendung der üblichen
Regeln), bevor die Methode zu starten beginnt.

FRAGE 3:

Was ist die Position von pointB nach dem folgendem:

pointB.move( 24-12, 34*3 - 45 );

2
Antwort:

pointB wird jetzt an der Position x = 12, y = 57 sein.

Methodenaufruf Schritt-für-Schritt

Sie werden wahrscheinlich das Richtige getan haben, um die Antwort zu bekommen. Aber lassen Sie
uns, nur um sicher zu gehen, das Ganze noch einmal durchgehen.

pointB.move( 24-12, 34*3 - 45 );

entspricht:

pointB.move( 12, 34*3 - 45 );

entspricht:

pointB.move( 12, 102 - 45 );

entspricht:

pointB.move( 12, 57 );

An dieser Stelle beginnt die move() Methode mit den zwei int-Werten, die sie benötigt, zu starten.

Die Ausdrücke in der Parameterliste werden ausgewertet, bevor die Methode startet. Die sich
ergebenden Werte sollten von dem von der Methode erwarteten Datentyp sein, oder von einem
Datentyp, der in diesen Typ konvertiert werden kann.

FRAGE 4:

Was vermuten Sie, wird bei dem folgenden Methodenaufruf passieren?

pointB.move( 14.305, 34.9 );

Das ist ein Fehler, da die Parameterliste zwei Gleitpunktzahlen enthält und nicht die erforderlichen
zwei int-Werte.

Parameter müssen den korrekten Datentyp haben

Wenn eine Methode zu starten beginnt, muss sie die richtige Anzahl von Parametern haben und
jeder Parameter muss von dem geforderten Typ sein. Manchmal aber, gerade bevor die Methode zu
starten beginnt, werden die in einer Parameterliste zu Verfügung gestellten Werte in den
erforderlichen Typ konvertiert. Es gibt zwei Möglichkeiten, in denen das passieren kann:

3
1. Explizit — der Programmierer verlangt durch eine Typumwandlung (Casting), dass die Werte
konvertiert werden.

2. Implizit — wenn der Compiler die Konvertierung ohne Datenverlust, oder nur bei geringem
Verlust an Genauigkeit durchführen kann, wird er es automatisch tun.

Eine Typumwandlung sieht folgendermaßen aus:

(verlangterTyp)(ausdruck)

Dabei ist (verlangterTyp) so etwas wie (int) und (ausdruck) ist ein gewöhnlicher Ausdruck. Wenn es
sich um eine einzelne Variable handelt, brauchen Sie keine Klammern. Hier ist ein Beispielprogramm,
das die Typumwandlung zeigt:

import java.awt.*; // Die Klassenbibliothek importieren,

// in der Point definiert ist

class TypUmwandlungBsp

public static void main ( String arg[] )

Point pointB = new Point(); // ein Point-Objekt an der

// Position x=0, y=0 erzeugen

pointB.move( (int)14.305, (int)(34.9-12.6) );

System.out.println("Neue Position:" + pointB );

In diesem Fall ist eine Typumwandlung für beide Parameter erforderlich, da die Konvertierung einer
Gleitpunktzahl in ein int üblicherweise zu Datenverlust führt. Bei der Typumwandlung einer
Gleitpunktzahl in ein int gehen die Nachkommastellen verloren. (Sie werden NICHT gerundet.)

Was wird die Ausgabe des Programms sein?

Neue Position:java.awt.Point[x=14,y=22]

Automatische Konvertierung des Parametertyps

In dem vorherigen Beispiel führt die Konvertierung einer Gleitpunktzahl in einen Integer zu
Datenverlust, also muss der Programmierer explizit eine Typumwandlung verlangen.

Wenn eine Konvertierung von einem Typ in einen anderen ohne Datenverlust durchgeführt werden
kann, wird sie der Compiler automatisch durchführen. Zum Beispiel besagt die move() Methode, dass
sie zwei int-Parameter benötigt.

public void move(int x, int y); // (x,y) eines Point-Objekts ändern


4
Ein int-Wert wird in 32 Bits festgehalten Ein short-Wert, der in 16 Bits festgehalten wird, kann in 32
Bits ohne Datenverlust konvertiert werden.

Warum? Die in 16 Bits kodierten Daten können genauso gut in 32 Bits kodiert werden. Also wird das
folgende Programm kompilieren und korrekt ablaufen:

import java.awt.*; // Die Klassenbibliothek importieren, in der Point definiert ist

class AutoConvertBsp

public static void main ( String arg[] )

Point pointB = new Point(); // einen Point an der Position x=0, y=0 erzeugen

short a=12, b=42;

pointB.move( a, b ); // Die Werte der Parameterliste werden automatisch

// in den geforderten int-Typ konvertiert

System.out.println("Neue Position:" + pointB );

(Die Variablen a und b selbst werden nicht verändert; sie werden nur verwendet, um mitzuteilen mit
welchen Werten die Konvertierung durchgeführt wird.)

FRAGE 6:

Was wird dieses Programm ausgeben?

Antwort:

Neue Position:java.awt.Point[x=12,y=42]

Sichere Konvertierungen

Im Allgemeinen wird eine Konvertierung von einem Typ in einen anderen NICHT automatisch
durchgeführt, wenn die Möglichkeit eines Datenverlustes besteht. Eine Konvertierung von einem
Datentyp, der N Bits verwendet, in einen Datentyp, der weniger Bits verwendet, läuft Gefahr Daten
zu verlieren und wird nicht automatisch durchgeführt. Der Compiler entscheidet, indem er die
beteiligten Datentypen untersucht, nicht die darin aktuell enthaltenen Werte.

In den folgenden Situationen wird der Compiler automatisch, in einem Methodenaufruf, den Typ des
Ausdrucks in den erforderlichen Typ konvertieren:

5
1. Einen Ganzzahltyp in einen anderen Ganzzahltyp konvertieren, der mehr Bits verwendet.

2. Einen Gleitpunkttyp in einen anderen Gleitpunkttyp konvertieren, der mehr Bits verwendet.

3. Die Konvertierung eines Ganzzahltyps in einen Gleitpunkttyp, der die gleiche Anzahl an Bits
verwendet, kann zu einem Verlust an Genauigkeit führen, wird aber trotzdem automatisch
durchgeführt.

4. Die Konvertierung eines Ganzzahltyps in einen Gleitpunkttyp mit mehr Bits wird zu keinem
Datenverlust führen und wird automatisch durchgeführt.

"Verlust an Genauigkeit" bedeutet, dass einige Ziffern mit einem niedrigen Stellenwert zu 0 werden,
aber die wichtigsten Ziffern und die Größe der Zahl erhalten bleibt.

In den folgenden Situationen wird der Compiler eine Konvertierung NICHT automatisch durchführen.

 Einen Ganzzahltyp in einen anderen Ganzzahltyp konvertieren, der weniger Bits verwendet.

 Einen Gleitpunkttyp in einen anderen Gleitpunkttyp konvertieren, der weniger Bits


verwendet.

 Einen Gleitpunkttyp in irgendeinen Integer konvertieren, da dabei sowohl ein Verlust an


Genauigkeit als auch an Größe möglich ist.

 Die Konvertierung eines Boole'schen Datentyps ist generell nicht erlaubt (nicht einmal mit
einer expliziten Typumwandlung).

Erinnern Sie sich an die Größen der verschiedenen primitiven Datentypen (die primitiven Typen char
und boolean werden hier nicht aufgeführt):

Typ Anzahl der Bits

byte 8

short 16

int 32

long 64

float 32

double 64

6
Kein Datenverlust. Möglicher Verlust an Möglicher großer Verlust an
Genauigkeit. Daten.
Konvertierung
Automatische Automatische Erfordert eine explizite
Konvertierung. Konvertierung. Typumwandlung.

byte in short X

short in byte X

short in long X

int in float X

float in byte X

double in float X

Methodenaufrufe Beispiele

Da, wo es keinen Datenverlust oder nur einen möglichen Verlust an Genauigkeit gibt, wird Java in
einem Methodenaufruf den Wert automatisch in den erforderlichen Typ konvertieren. Wenn es
einen möglichen Verlust sowohl an Genauigkeit als auch an Größe gibt, verlangt Java von Ihnen eine
explizite Angabe, dass Sie die Konvertierung vornehmen möchten, indem Sie eine Typumwandlung
vornehmen.

Zum Beispiel:

Point pointA = new Point();

short a = 93, b = 92;

int i = 12, j = 13;

long x = 0, y = 44;

double u = 13.45, v = 99.2;

pointA.move( i, j ); // OK — keine Konvertierung notwendig

pointA.move( a, b ); // OK — short konvertiert zu int ohne Verlust

pointA.move( a, j ); // OK — short konvertiert zu int ohne Verlust

pointA.move( x, y ); // NICHT OK — möglicher Verlust an

7
// Genauigkeit und Größe.

pointA.move( (int)x, (int)y ); // OK — Typumwandlung sagt fortfahren

pointA.move( i, v ); // NICHT OK -- möglicher Verlust an

// Genauigkeit und Größe (für v).

pointA.move( i, (int)v ); // OK — Typumwandlung sagt fortfahren

Um diese Entscheidungen zu treffen, wird nur der Typ der Variablen (oder des Ausdrucks)
untersucht, NICHT der jeweilige Wert. Zum Beispiel könnten die jeweiligen Werte (in diesem Fall) in
dem ersten mit NICHT OK gekennzeichneten Methodenaufruf von long zu int ohne Datenverlust
konvertiert werden. Aber für andere Werte würde es einen völligen Datenverlust geben, also
verlangt der Aufruf eine Typumwandlung.

Beachten Sie auch, dass die Konvertierung auf einer Parameter-für-Parameter Basis durchgeführt
wird. Im dritten Aufruf muss nur der Parameter a konvertiert werden.

FRAGE 8:

Welche der folgenden Methodenaufrufe sind korrekt?

Point pointA = new Point();

short a = 93, b = 92;

int i = 12, j = 13;

long x = 0, y = 44;

double u = 13.45, v = 99.2;

pointA.move( i, b );

pointA.move( a, x );

pointA.move( u, b );

Antwort:

Point pointA = new Point();

short a = 93, b = 92;

int i = 12, j = 13;

long x = 0, y = 44;

double u = 13.45, v = 99.2;

8
pointA.move( i, b ); // OK — b kann zu int ohne Datenverlust konvertiert werden

pointA.move( a, x ); // NICHT OK — die Konvertierung von x zu int kann zu einem

// Verlust an Genauigkeit und Größe führen

pointA.move( u, b ); // NICHT OK — die Konvertierung von u zu int kann zu einem

// Verlust an Genauigkeit und Größe führen

Methode, die einen Parameter vom Typ double verwendet

Die cos() Methode ist eine statische Methode der Klasse Math. (Denken Sie daran, dass eine statische
Methode eine Methode ist, die zur Definition der Klasse gehört; Sie brauchen kein Objekt, um sie zu
verwenden.) In der Dokumentation der Klasse Math sieht die Methode folgendermaßen aus:

public static double cos( double num )

Die Methode erfordert einen Parameter vom Typ double. Sie berechnet als Rückgabewert einen
double, den Kosinus des Parameters. Der Parameter ist in Bogenmaß (nicht Grad). Hier wird diese
Methode in einem Programm verwendet:

class CosBsp

public static void main ( String arg[] )

double x = 0.0;

System.out.println( "Kosinus ist:" + Math.cos( x ) );

FRAGE 9:

Hat der Parameter in dem Methodenaufruf den richtigen Typ?

Ja — also ist keine Konvertierung erforderlich.

Beispiele mit Gleitpunkttypen

Hier ist ein Programm, indem der zur Verfügung gestellte Parametertyp nicht dem geforderten Typ
entspricht:

class CosBsp2

{
9
public static void main ( String arg[] )

int z = 0;

System.out.println( "Kosinus ist:" + Math.cos( z ) );

In diesem Fall kann der 32 Bitwert in x in den erforderlichen 64 Bitwert ohne Datenverlust
konvertiert werden, also macht es der Compiler automatisch. Hier ist ein anderer Fall:

class CosBsp3

public static void main ( String arg[] )

long w = 0;

System.out.println( "Kosinus ist:" + Math.cos( w ) );

Daten vom Typ long können in einen Typ double konvertiert werden, aber es kann zu einem Verlust
an Genauigkeit kommen. Auch in diesem Fall führt der Compiler die Konvertierung automatisch
durch. (In diesem besonderen Fall findet kein Verlust an Genauigkeit statt, da 0 von beiden Typen
exakt dargestellt werden kann. Aber allgemein kann es bei der Konvertierung von long zu double zu
Genauigkeitsverlust kommen.)

FRAGE 10:

(Denkfrage:) Glauben Sie, dass das folgende funktioniert:

class CosBsp4

public static void main ( String arg[] )

{
10
long w = 0;

System.out.println( "Kosinus ist:" + Math.cos( (double)w ) );

Antwort:

Ja — die Typumwandlung (double) wird nicht wirklich gebraucht, da sie nach einer Konvertierung
verlangt, die ohnehin durchgeführt werden würde. Aber manchmal tun das Programmierer gerne,
um klar zu machen was passiert.

Kann eine Methode einen primitiven Typ ändern?

Prüfen Sie das folgende Codefragment:

IrgendeineKlasse s = new IrgendeineKlasse(); // ein neues Objekt der Klasse

// IrgendeineKlasse erstellen

int x = 32;

s.irgendeineMethode( x ); // eine Methode des Objekts s aufrufen

System.out.println( "x ist: " + x ); // was wird ausgegeben?

Wenn eine primitive Variable als ein Parameter verwendet wird, ganz egal in welcher Methode, wird
die Methode den Wert der Variablen nicht ändern. Also wird das oben stehende Fragment ausgeben:

x ist: 32

Das wird wahr sein, egal um welche Klasse es sich bei IrgendeineKlasse handelt und egal was für eine
Methode irgendeineMethode ist.

Wenn ein Objekt als Parameter für bestimmte Methoden bestimmter Klassen verwendet wird,
werden sich die Daten des Objekts ändern. Sie müssen die Klassendokumentation lesen, um zu
erfahren wann das der Fall ist. Die meisten Methoden ändern ihre Parameter nicht, da das
Verwirrung und Fehler verursachen kann. Zum größten Teil werden Parameter dazu verwendet
Daten an eine Methode zu übergeben, um ihr mitzuteilen, was zu tun ist.

FRAGE 11:

Prüfen Sie das folgende Codefragment:

Point b = new Point();

short x = 16, y = 12;

b.move( x, y );

11
Die Parameter x und y enthalten short-Werte, die für die Methode in int-Werte konvertiert werden
müssen. Werden die Inhalte von x und y durch diese Konvertierung geändert?

Antwort:

Nein — neue int-Werte werden auf der Basis der Daten von x und y erzeugt und diese Werte werden
in dem Methodenaufruf verwendet. Die Variablen x und y bleiben unverändert.

12