Beruflich Dokumente
Kultur Dokumente
Wenn Sie eine Methode verwenden, werden Sie oft Informationen in Form von Parameter
übergeben müssen. Dieses Kapitel bespricht Methodenaufrufe und Parameter.
Themen:
Parameterlisten
Ausdrücke in Parameterlisten
FRAGE 1:
Parameterlose Methoden
Betrachten Sie noch einmal den Methodenaufruf (die zweite Anweisung, die "Punktnotation"
verwendet, um die Methode zu bestimmen).
| | |
| |
+---- 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:
1
Point meinPoint = new Point(); // einen Punkt bei x=0, y=0 konstruieren
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:
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:
pointA.move( 45, 82 );
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:
2
Antwort:
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.
entspricht:
entspricht:
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:
Das ist ein Fehler, da die Parameterliste zwei Gleitpunktzahlen enthält und nicht die erforderlichen
zwei int-Werte.
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.
(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:
class TypUmwandlungBsp
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.)
Neue Position:java.awt.Point[x=14,y=22]
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.
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:
class AutoConvertBsp
Point pointB = new Point(); // einen Point an der Position x=0, y=0 erzeugen
(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:
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.
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):
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:
long x = 0, y = 44;
7
// Genauigkeit und Größe.
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:
long x = 0, y = 44;
pointA.move( i, b );
pointA.move( a, x );
pointA.move( u, b );
Antwort:
long x = 0, y = 44;
8
pointA.move( i, b ); // OK — b kann zu int ohne Datenverlust konvertiert werden
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:
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
double x = 0.0;
FRAGE 9:
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;
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
long w = 0;
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:
class CosBsp4
{
10
long w = 0;
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.
// IrgendeineKlasse erstellen
int x = 32;
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:
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