diff options
| author | Sven Eisenhauer <sven@sven-eisenhauer.net> | 2023-11-10 15:11:48 +0100 |
|---|---|---|
| committer | Sven Eisenhauer <sven@sven-eisenhauer.net> | 2023-11-10 15:11:48 +0100 |
| commit | 33613a85afc4b1481367fbe92a17ee59c240250b (patch) | |
| tree | 670b842326116b376b505ec2263878912fca97e2 /Master/Reference Architectures and Patterns/hjp5/html/k100049.html | |
| download | Studium-33613a85afc4b1481367fbe92a17ee59c240250b.tar.gz Studium-33613a85afc4b1481367fbe92a17ee59c240250b.tar.bz2 | |
Diffstat (limited to 'Master/Reference Architectures and Patterns/hjp5/html/k100049.html')
| -rw-r--r-- | Master/Reference Architectures and Patterns/hjp5/html/k100049.html | 1135 |
1 files changed, 1135 insertions, 0 deletions
diff --git a/Master/Reference Architectures and Patterns/hjp5/html/k100049.html b/Master/Reference Architectures and Patterns/hjp5/html/k100049.html new file mode 100644 index 0000000..09f810d --- /dev/null +++ b/Master/Reference Architectures and Patterns/hjp5/html/k100049.html @@ -0,0 +1,1135 @@ +<html>
+<head>
+<title>
+Handbuch der Java-Programmierung, 5. Auflage
+</title>
+</head>
+<body>
+<a name="startofbody"></a>
+<script language="JavaScript" src="hjp4lib.js">
+</script>
+<script language="JavaScript">
+installKbdHandler("97,#startofbody;101,#endofbody;116,cover.html;122,k100003.html;115,search.html;105,index.html;100,JDKDOCS;112,APIDOCS;104,k100046.html;106,k100048.html;107,k100050.html;108,k100051.html");
+</script>
+<table border=0 cellpadding=0 cellspacing=1 width="100%">
+<tr bgcolor="#EEFFCC">
+<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html"> Titel </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html"> Inhalt </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html"> Suchen </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html"> Index </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()"> DOC </a>
+<td align="right">Handbuch der Java-Programmierung, 5. Auflage
+<tr bgcolor="#EEFFCC">
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100046.html"> << </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100048.html"> < </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100050.html"> > </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100051.html"> >> </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()"> API </a>
+<td align="right">Kapitel 7 - OOP I: Grundlagen
+</table>
+<hr>
+
+
+<!-- Section -->
+<a name="sectlevel2id007003"></a>
+<h2>7.3 <a name="ixa100466">Methoden</a></h2>
+<hr>
+<ul>
+<li><a href="k100049.html#sectlevel2id007003">7.3 Methoden</a>
+<ul>
+<li><a href="k100049.html#sectlevel3id007003001">7.3.1 Definition</a>
+<li><a href="k100049.html#sectlevel3id007003002">7.3.2 Aufruf</a>
+<li><a href="k100049.html#sectlevel3id007003003">7.3.3 Parameter</a>
+<li><a href="k100049.html#variableparameterlisten">7.3.4 Variable Parameterlisten </a>
+<li><a href="k100049.html#sectlevel3id007003005">7.3.5 Rückgabewert</a>
+<li><a href="k100049.html#ueberladenvonmethoden">7.3.6 Überladen von Methoden</a>
+<ul>
+<li><a href="k100049.html#sectlevel4id007003006001">Die Signatur einer Methode</a>
+</ul>
+<li><a href="k100049.html#konstruktoren">7.3.7 Konstruktoren</a>
+<ul>
+<li><a href="k100049.html#sectlevel4id007003007001">Default-Konstruktoren</a>
+<li><a href="k100049.html#sectlevel4id007003007002">Verkettung von Konstruktoren</a>
+<li><a href="k100049.html#sectlevel4id007003007003">Initialisierungsreihenfolge</a>
+</ul>
+<li><a href="k100049.html#destruktoren">7.3.8 Destruktoren</a>
+</ul>
+</ul>
+<hr>
+
+
+<!-- Section -->
+<a name="sectlevel3id007003001"></a>
+<h3>7.3.1 Definition </h3>
+
+<p>
+Methoden definieren das <i>Verhalten</i> von Objekten. Sie werden
+innerhalb einer Klassendefinition angelegt und haben Zugriff auf alle
+Variablen des Objekts. Methoden sind das Pendant zu den <i>Funktionen</i>
+anderer Programmiersprachen, arbeiten aber immer mit den Variablen
+des aktuellen Objekts. <a name="ixa100467"><i>Globale Funktionen</i></a>,
+die vollkommen unabhängig von einem Objekt oder einer Klasse
+existieren, gibt es in Java ebensowenig wie globale Variablen. Wir
+werden später allerdings Klassenvariablen und -methoden kennenlernen,
+die nicht an eine konkrete Instanz gebunden sind.
+
+<p>
+Die Syntax der Methodendefinition in Java ähnelt der von C/C++:
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
+<tr>
+<td valign=top width=100%>
+<font color="#660066">
+<pre>
+{Modifier}
+Typ Name([Parameter])
+{
+ {Anweisung;}
+}
+</pre>
+</font>
+</td>
+</tr>
+</table>
+
+<p>
+Nach einer Reihe von <a name="ixa100468"><i>Modifiern</i></a> (wir
+kommen weiter in <a href="k100053.html#modifier">Abschnitt 8.2</a>
+darauf zurück) folgen der <i>Typ</i> des Rückgabewerts der
+Funktion, ihr <i>Name</i> und eine optionale <i>Parameterliste</i>.
+In geschweiften Klammern folgt dann der <i>Methodenrumpf</i>, also
+die Liste der Anweisungen, die das Verhalten der Methode festlegen.
+Die Erweiterung unserer Beispielklasse um eine Methode zur Berechnung
+des Alters des <font color="#000077"><tt>Auto</tt></font>-Objekts
+würde beispielsweise so aussehen:
+<a name="listingid007006"></a>
+
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
+<tr>
+<td valign=top>
+<font color="#000055">
+<pre>
+<font color="#555555">001 </font><font color="#0000AA">public</font> <font color="#0000AA">class</font> Auto
+<font color="#555555">002 </font>{
+<font color="#555555">003 </font> <font color="#0000AA">public</font> String name;
+<font color="#555555">004 </font> <font color="#0000AA">public</font> <font color="#006699">int</font> erstzulassung;
+<font color="#555555">005 </font> <font color="#0000AA">public</font> <font color="#006699">int</font> leistung;
+<font color="#555555">006 </font>
+<font color="#555555">007 </font> <font color="#0000AA">public</font> <font color="#006699">int</font> alter()
+<font color="#555555">008 </font> {
+<font color="#555555">009 </font> <font color="#0000AA">return</font> 2000 - erstzulassung;
+<font color="#555555">010 </font> }
+<font color="#555555">011 </font>}</pre>
+</font>
+</td>
+</tr>
+</table>
+<i>
+Listing 7.6: Eine einfache Methode zur Altersberechnung</i></p>
+
+<p>
+Hier wird eine Methode <font color="#000077"><tt>alter</tt></font>
+definiert, die einen ganzzahligen Wert zurückgibt, der sich aus
+der Differenz des Jahres 2000 und dem Jahr der Erstzulassung errechnet.
+
+
+<!-- Section -->
+<a name="sectlevel3id007003002"></a>
+<h3>7.3.2 <a name="ixa100469">Aufruf</a></h3>
+
+<p>
+Der Aufruf einer Methode erfolgt ähnlich der Verwendung einer
+Instanzvariablen in Punktnotation. Zur Unterscheidung von einem Variablenzugriff
+müssen zusätzlich die Parameter der Methode in Klammern
+angegeben werden, selbst wenn die Liste leer ist. Das folgende Programm
+würde demnach die Zahl 10 auf dem Bildschirm ausgeben.
+<a name="listingid007007"></a>
+
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
+<tr>
+<td valign=top>
+<font color="#000055">
+<pre>
+<font color="#555555">001 </font>Auto golf1 = <font color="#0000AA">new</font> Auto();
+<font color="#555555">002 </font>golf1.erstzulassung = 1990;
+<font color="#555555">003 </font>System.out.println(golf1.alter());</pre>
+</font>
+</td>
+</tr>
+</table>
+<i>
+Listing 7.7: Aufruf einer Methode</i></p>
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100%>
+<tr>
+<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=1></td>
+<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top width=1000>
+
+<p>
+Wie an der Definition von <font color="#000077"><tt>alter</tt></font>
+zu erkennen ist, darf eine Methode auf die Instanzvariablen ihrer
+Klasse zugreifen, ohne die Punktnotation zu verwenden. Das funktioniert
+deshalb, weil der Compiler alle nicht in Punktnotation verwendeten
+Variablen <font color="#000077"><tt>x</tt></font>, die nicht lokale
+Variablen sind, auf das Objekt <a href="index_t.html#ixb100273"><font color=#000080><tt>this</tt></font></a>
+bezieht und damit als <font color="#000077"><tt>this.x</tt></font>
+interpretiert.</td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top>
+<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#0099CC">
+<tr>
+<td><font color="#FFFFFF"> Tipp </font></td>
+</tr>
+</table>
+</td>
+<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
+</tr>
+</table>
+
+<p>
+Bei <a name="ixa100470"><a href="index_t.html#ixb100273"><font color=#000080><tt>this</tt></font></a></a>
+handelt es sich um einen Zeiger, der beim Anlegen eines Objekts automatisch
+generiert wird. <a href="index_t.html#ixb100273"><font color=#000080><tt>this</tt></font></a>
+ist eine Referenzvariable, die auf das aktuelle Objekt zeigt und dazu
+verwendet wird, die eigenen Methoden und Instanzvariablen anzusprechen.
+Der <a href="index_t.html#ixb100273"><font color=#000080><tt>this</tt></font></a>-Zeiger
+ist auch <i>explizit</i> verfügbar und kann wie eine ganz normale
+Objektvariable verwendet werden. Er wird als versteckter Parameter
+an jede nicht-statische Methode übergeben. Die Methode <font color="#000077"><tt>alter</tt></font>
+hätte also auch so geschrieben werden können:
+<a name="listingid007008"></a>
+
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
+<tr>
+<td valign=top>
+<font color="#000055">
+<pre>
+<font color="#555555">001 </font><font color="#0000AA">public</font> <font color="#006699">int</font> alter()
+<font color="#555555">002 </font>{
+<font color="#555555">003 </font> <font color="#0000AA">return</font> 2000 - <font color="#006699">this</font>.erstzulassung;
+<font color="#555555">004 </font>}</pre>
+</font>
+</td>
+</tr>
+</table>
+<i>
+Listing 7.8: Verwendung von this</i></p>
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100%>
+<tr>
+<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=1></td>
+<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top width=1000>
+
+<p>
+Manchmal ist es sinnvoll, <a href="index_t.html#ixb100273"><font color=#000080><tt>this</tt></font></a>
+explizit zu verwenden, auch wenn es nicht unbedingt erforderlich ist.
+Dadurch wird hervorgehoben, dass es sich um den Zugriff auf eine Instanzvariable,
+und nicht eine lokale Variable, handelt.</td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top>
+<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#0099CC">
+<tr>
+<td><font color="#FFFFFF"> Tipp </font></td>
+</tr>
+</table>
+</td>
+<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
+</tr>
+</table>
+
+
+<!-- Section -->
+<a name="sectlevel3id007003003"></a>
+<h3>7.3.3 <a name="ixa100471">Parameter</a></h3>
+
+<p>
+Eine Methode kann mit Parametern definiert werden. Dazu wird bei der
+Methodendefinition eine Parameterliste innerhalb der Klammern angegeben.
+Jeder formale Parameter besteht aus einem Typnamen und dem Namen des
+Parameters. Soll mehr als ein Parameter definiert werden, so sind
+die einzelnen Definitionen durch Kommata zu trennen.
+
+<p>
+Alle Parameter werden in Java per <a name="ixa100472"><i>call by value</i></a>
+übergeben. Beim Aufruf einer Methode wird also der aktuelle Wert
+in die Parametervariable kopiert und an die Methode übergeben.
+Veränderungen der Parametervariablen innerhalb der Methode bleiben
+lokal und wirken sich nicht auf den Aufrufer aus. Das folgende Beispiel
+definiert eine Methode <font color="#000077"><tt>printAlter</tt></font>,
+die das Alter des Autos insgesamt <font color="#000077"><tt>wieoft</tt></font>
+mal auf dem Bildschirm ausgibt:
+<a name="listingid007009"></a>
+
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
+<tr>
+<td valign=top>
+<font color="#000055">
+<pre>
+<font color="#555555">001 </font><font color="#0000AA">public</font> <font color="#006699">void</font> printAlter(<font color="#006699">int</font> wieoft)
+<font color="#555555">002 </font>{
+<font color="#555555">003 </font> <font color="#0000AA">while</font> (wieoft-- > 0) {
+<font color="#555555">004 </font> System.out.println(<font color="#0000FF">"Alter = "</font> + alter());
+<font color="#555555">005 </font> }
+<font color="#555555">006 </font>}</pre>
+</font>
+</td>
+</tr>
+</table>
+<i>
+Listing 7.9: Eine Methode zur Ausgabe des Alters</i></p>
+
+<p>
+Obwohl der Parameter <font color="#000077"><tt>wieoft</tt></font>
+innerhalb der Methode verändert wird, merkt ein Aufrufer nichts
+von diesen Änderungen, da innerhalb der Methode mit einer Kopie
+gearbeitet wird. Das folgende Programm würde das Alter des Objekts
+<font color="#000077"><tt>auto</tt></font> daher insgesamt neunmal
+auf dem Bildschirm ausgeben:
+<a name="listingid007010"></a>
+
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
+<tr>
+<td valign=top>
+<font color="#000055">
+<pre>
+<font color="#555555">001 </font>...
+<font color="#555555">002 </font><font color="#006699">int</font> a = 3;
+<font color="#555555">003 </font>
+<font color="#555555">004 </font>auto.printAlter(a);
+<font color="#555555">005 </font>auto.printAlter(a);
+<font color="#555555">006 </font>auto.printAlter(a);
+<font color="#555555">007 </font>...</pre>
+</font>
+</td>
+</tr>
+</table>
+<i>
+Listing 7.10: Wiederholter Aufruf der Methode zur Ausgabe des Alters</i></p>
+
+<p>
+Wie bereits erwähnt, sind Objektvariablen Referenzen, also Zeiger.
+Zwar werden auch sie bei der Übergabe an eine Methode per Wert
+übergeben. Da innerhalb der Methode aber der Zeiger auf das Originalobjekt
+zur Verfügung steht (wenn auch in kopierter Form), wirken sich
+Veränderungen an dem Objekt natürlich direkt auf das Originalobjekt
+aus und sind somit für den Aufrufer der Methode sichtbar. Wie
+in allen anderen Programmiersprachen entspricht die <i>call by value</i>-Übergabe
+eines <i>Zeigers</i> damit natürlich genau der Semantik von <a name="ixa100473"><i>call
+by reference</i></a>.
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100%>
+<tr>
+<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top width=1000>
+
+<p>
+Die Übergabe von Objekten an Methoden hat damit zwei wichtige
+Konsequenzen:
+<ul>
+<li>Die Methode erhält keine Kopie, sondern arbeitet mit dem
+Originalobjekt.
+<li>Die Übergabe von Objekten ist performant, gleichgültig
+wie groß sie sind.
+</ul>
+</td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top>
+<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#000077">
+<tr>
+<td><font color="#FFFFFF"> Hinweis </font></td>
+</tr>
+</table>
+</td>
+<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
+</tr>
+</table>
+
+<p>
+Sollen Objekte kopiert werden, so muss dies explizit durch Aufruf
+der Methode <a name="ixa100474"><a href="index_c.html#ixb100278"><font color=#000080><tt>clone</tt></font></a></a>
+der Klasse <a href="index_o.html#ixb100224"><font color=#000080><tt>Object</tt></font></a>
+erfolgen.
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100%>
+<tr>
+<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=1></td>
+<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top width=1000>
+
+<p>
+Die Übergabe von Objekten und Arrays per Referenz kann leicht
+zu verdeckten Fehlern führen. Da die aufgerufene Methode mit
+dem Originalobjekt arbeitet, kann sie deren Membervariablen bzw. Elemente
+verändern, ohne dass der Aufrufer es merkt. Auch der <a href="index_f.html#ixb100401"><font color=#000080><tt>final</tt></font></a>-Modifier
+(siehe <a href="k100053.html#modifier">Abschnitt 8.2</a>) bietet dagegen
+keinen Schutz. Das unbeabsichtigte Ändern einer modifizierbaren
+Referenzvariable bei der Übergabe an eine Methode kann nur durch
+vorheriges Kopieren verhindert werden.</td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top>
+<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#CC0000">
+<tr>
+<td><font color="#FFFFFF"> Warnung </font></td>
+</tr>
+</table>
+</td>
+<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
+</tr>
+</table>
+
+
+<!-- Section -->
+<a name="variableparameterlisten"></a>
+<h3>7.3.4 <a name="ixa100475">Variable Parameterlisten</a> <a name="ixa100476"></a>
+</h3>
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100%>
+<tr>
+<td width=1 align=left valign=top bgcolor="#FF9900"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=1></td>
+<td width=1 align=left valign=top bgcolor="#FF9900"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top width=1000>
+
+<p>
+Seit Java 5 gibt es die Möglichkeit, variable Parameterlisten
+zu definieren, in denen ein formaler Parameter für eine beliebige
+Anzahl aktueller Argumente steht. Dazu kann der letzte Parameter einer
+Methode (und nur dieser) nach dem Typbezeichner mit drei Punkten versehen
+werden. So wird angezeigt, dass an dieser Stelle beim Aufruf eine
+beliebige Anzahl Argumente des passenden Typs übergeben werden
+darf:
+<a name="listingid007011"></a>
+
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
+<tr>
+<td valign=top>
+<font color="#000055">
+<pre>
+<font color="#555555">001 </font><font color="#0000AA">public</font> <font color="#0000AA">static</font> <font color="#006699">void</font> printArgs(String... args)
+<font color="#555555">002 </font>{
+<font color="#555555">003 </font> <font color="#0000AA">for</font> (<font color="#006699">int</font> i = 0; i < args.length; ++i) {
+<font color="#555555">004 </font> System.out.println(args[i]);
+<font color="#555555">005 </font> }
+<font color="#555555">006 </font>}</pre>
+</font>
+</td>
+</tr>
+</table>
+<i>
+Listing 7.11: Eine Methode mit einer variablen Parameterliste</i></p>
+</td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top>
+<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#FF9900">
+<tr>
+<td><font color="#FFFFFF"> JDK1.1-6.0 </font></td>
+</tr>
+</table>
+</td>
+<td width=1 align=left valign=top bgcolor="#FF9900"><img src="trp1_1.gif"></td>
+</tr>
+</table>
+
+<p>
+Technisch entspricht die Deklaration der eines Arrays-Parameters,
+und so wird auch auf die Elemente zugegriffen. Die Vereinfachung wird
+sichtbar, wenn man sich den <i>Aufruf</i> der Methode ansieht. An
+dieser Stelle darf nämlich nicht nur ein einzelnes Array übergeben
+werden, sondern die einzelnen Elemente können auch separat angegeben
+werden. Dabei erzeugt das Laufzeitsystem automatisch ein Array, in
+das diese Werte übertragen werden. Die beiden folgenden Aufrufe
+sind also gleichwertig:
+<font color="#000077">
+<pre>
+printArgs(new String[]{"so", "wird", "es", "gemacht"});
+
+printArgs("so", "wird", "es", "gemacht");
+</pre>
+</font>
+
+<p>
+Nun wird auch deutlich, warum lediglich der letzte Parameter variabel
+sein darf. Andernfalls könnte der Compiler unter Umständen
+nicht mehr unterscheiden, welches aktuelle Argument zu welchem formalen
+Parameter gehört.
+
+<p>
+Praktischen Nutzen haben die variablen Parameterlisten bei Anwendungen,
+in denen nicht von vorneherein klar ist, wieviele Argumente benötigt
+werden. Tatsächlich wurde ihre Entwicklung durch den Wunsch motiviert,
+flexible Ausgabemethoden definieren zu können, wie sie etwa in
+C/C++ mit der printf-Familie zur Verfügung stehen (und seit der
+J2SE 5.0 mit der Klasse <a href="index_j.html#ixb100403"><font color=#000080><tt>java.util.Formatter</tt></font></a>,
+die in <a href="k100076.html#ausgabeformatierung">Abschnitt 11.6</a>
+beschrieben wird). Sie können dann die in diesem Fall vielfach
+verwendeten überladenen Methoden ersetzen (siehe <a href="k100049.html#ueberladenvonmethoden">Abschnitt 7.3.6</a>).
+Natürlich benötigt nicht jede Methode variable Parameterlisten,
+sondern ihre Anwendung sollte auf Spezialfälle beschränkt
+bleiben.
+
+<p>
+Wird eine Methode mit einem Parameter vom Typ <a name="ixa100477"><a href="index_o.html#ixb100404"><font color=#000080><tt>Object...</tt></font></a></a>
+deklariert, entstehen in Zusammenhang mit dem ebenfalls seit der J2SE
+5.0 verfügbaren Mechanismus des Autoboxings (siehe <a href="k100066.html#autoboxing">Abschnitt 10.2.3</a>)
+Methoden, bei denen praktisch alle Typprüfungen des Compilers
+ausgehebelt werden. Da ein Element des Typs <a href="index_o.html#ixb100224"><font color=#000080><tt>Object</tt></font></a>
+zu allen anderen Referenztypen kompatibel ist und primitive Typen
+dank des Autoboxings automatisch in passende Wrapper-Objekte konvertiert
+werden, kann an einen Parameter des Typs <a href="index_o.html#ixb100404"><font color=#000080><tt>Object...</tt></font></a>
+eine beliebige Anzahl beliebiger Argumente übergeben werden.
+
+<p>
+Das folgende Listing zeigt eine Methode, die numerische Argumente
+jeweils solange summiert, bis ein nichtnumerischer Wert übergeben
+wird. Dieser wird dann in einen String konvertiert und zusammen mit
+der Zwischensumme ausgegeben. Am Ende wird zusätzlich die Gesamtsumme
+ausgegeben. Nicht unbedingt eine typische Anwendung, und erst recht
+kein empfehlenswerter Programmierstil, aber das Listing demonstriert,
+wie weitreichend die Möglichkeiten dieses neuen Konzepts sind:
+<a name="listingid007012"></a>
+
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
+<tr>
+<td valign=top>
+<font color="#000055">
+<pre>
+<font color="#555555">001 </font><font color="#00AA00">/* Listing0712.java */</font>
+<font color="#555555">002 </font>
+<font color="#555555">003 </font><font color="#0000AA">public</font> <font color="#0000AA">class</font> Listing0712
+<font color="#555555">004 </font>{
+<font color="#555555">005 </font> <font color="#0000AA">public</font> <font color="#0000AA">static</font> <font color="#006699">void</font> registrierKasse(Object... args)
+<font color="#555555">006 </font> {
+<font color="#555555">007 </font> <font color="#006699">double</font> zwischensumme = 0;
+<font color="#555555">008 </font> <font color="#006699">double</font> gesamtsumme = 0;
+<font color="#555555">009 </font> <font color="#0000AA">for</font> (<font color="#006699">int</font> i = 0; i < args.length; ++i) {
+<font color="#555555">010 </font> <font color="#0000AA">if</font> (args[i] <font color="#0000AA">instanceof</font> Number) {
+<font color="#555555">011 </font> zwischensumme += ((Number)args[i]).doubleValue();
+<font color="#555555">012 </font> } <font color="#0000AA">else</font> {
+<font color="#555555">013 </font> System.out.println(args[i] + <font color="#0000FF">": "</font> + zwischensumme);
+<font color="#555555">014 </font> gesamtsumme += zwischensumme;
+<font color="#555555">015 </font> zwischensumme = 0;
+<font color="#555555">016 </font> }
+<font color="#555555">017 </font> }
+<font color="#555555">018 </font> System.out.println(<font color="#0000FF">"Gesamtsumme: "</font> + gesamtsumme);
+<font color="#555555">019 </font> }
+<font color="#555555">020 </font>
+<font color="#555555">021 </font> <font color="#0000AA">public</font> <font color="#0000AA">static</font> <font color="#006699">void</font> main(String[] args)
+<font color="#555555">022 </font> {
+<font color="#555555">023 </font> registrierKasse(
+<font color="#555555">024 </font> 1.45, 0.79, 19.90, <font color="#0000FF">"Ware"</font>,
+<font color="#555555">025 </font> -3.00, 1.50, <font color="#0000FF">"Pfand"</font>,
+<font color="#555555">026 </font> -10, <font color="#0000FF">"Gutschein"</font>
+<font color="#555555">027 </font> );
+<font color="#555555">028 </font> }
+<font color="#555555">029 </font>}</pre>
+</font>
+</td>
+<td valign=top align=right>
+<a href="../examples/Listing0712.java"><font color="#000055" size=-1>Listing0712.java</font></a></td>
+</tr>
+</table>
+<i>
+Listing 7.12: Die Anwendung von Object...</i></p>
+
+<p>
+Die Ausgabe des Programms ist:
+<font color="#333300">
+<pre>
+Ware: 22.14
+Pfand: -1.5
+Gutschein: -10.0
+Gesamtsumme: 10.64
+</pre>
+</font>
+
+
+<!-- Section -->
+<a name="sectlevel3id007003005"></a>
+<h3>7.3.5 <a name="ixa100478">Rückgabewert</a></h3>
+
+<p>
+Jede Methode in Java ist typisiert. Der Typ einer Methode wird zum
+Zeitpunkt der Definition festgelegt und bestimmt den Typ des Rückgabewerts.
+Dieser kann von einem beliebigen primitiven Typ, einem Objekttyp (also
+einer Klasse) oder vom Typ <a name="ixa100479"><a href="index_v.html#ixb100334"><font color=#000080><tt>void</tt></font></a></a>
+sein. Die Methoden vom Typ <a href="index_v.html#ixb100334"><font color=#000080><tt>void</tt></font></a>
+haben gar keinen Rückgabewert und dürfen nicht in Ausdrücken
+verwendet werden. Sie sind lediglich wegen ihrer Nebeneffekte von
+Interesse und dürfen daher nur als Ausdrucksanweisung verwendet
+werden.
+
+<p>
+Hat eine Methode einen Rückgabewert (ist also nicht vom Typ <a href="index_v.html#ixb100334"><font color=#000080><tt>void</tt></font></a>),
+so kann sie mit Hilfe der <a name="ixa100480"><a href="index_r.html#ixb100333"><font color=#000080><tt>return</tt></font></a></a>-Anweisung
+einen Wert an den Aufrufer zurückgeben. Die <a href="index_r.html#ixb100333"><font color=#000080><tt>return</tt></font></a>-Anweisung
+hat folgende Syntax:
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
+<tr>
+<td valign=top width=100%>
+<font color="#660066">
+<pre>
+return Ausdruck;
+</pre>
+</font>
+</td>
+</tr>
+</table>
+
+<p>
+Wenn diese Anweisung ausgeführt wird, führt dies zum Beenden
+der Methode, und der Wert des angegebenen Ausdrucks wird an den Aufrufer
+zurückgegeben. Der Ausdruck muss dabei zuweisungskompatibel zum
+Typ der Funktion sein. Die in <a href="k100030.html#kapitelausdruecke">Kapitel 5</a>
+erläuterte Datenflussanalyse sorgt dafür, dass hinter der
+<a href="index_r.html#ixb100333"><font color=#000080><tt>return</tt></font></a>-Anweisung
+keine unerreichbaren Anweisungen stehen und dass jeder mögliche
+Ausgang einer Funktion mit einem <a href="index_r.html#ixb100333"><font color=#000080><tt>return</tt></font></a>
+versehen ist. Der in C beliebte Fehler, einen Funktionsausgang ohne
+<a href="index_r.html#ixb100333"><font color=#000080><tt>return</tt></font></a>-Anweisung
+zu erzeugen (und damit einen undefinierten Rückgabewert zu erzeugen),
+kann in Java also nicht passieren.
+
+<!-- Section -->
+
+<a name="ueberladenvonmethoden"></a>
+<h3>7.3.6 <a name="ixa100481">Überladen von Methoden</a></h3>
+
+<p>
+In Java ist es erlaubt, Methoden zu <i>überladen</i>, d.h. innerhalb
+einer Klasse zwei unterschiedliche Methoden mit demselben Namen zu
+definieren. Der Compiler unterscheidet die verschiedenen Varianten
+anhand der Anzahl und der Typisierung ihrer Parameter. Haben zwei
+Methoden denselben Namen, aber unterschiedliche Parameterlisten, werden
+sie als verschieden angesehen. Es ist dagegen nicht erlaubt, zwei
+Methoden mit exakt demselben Namen und identischer Parameterliste
+zu definieren.
+
+<p>
+Der Rückgabetyp einer Methode trägt nicht zu ihrer Unterscheidung
+bei. Zwei Methoden, die sich nur durch den Typ ihres Rückgabewertes
+unterscheiden, werden also als gleich angesehen. Da Methoden auch
+ohne die Verwendung ihres Rückgabewerts aufgerufen werden können
+(was typischerweise wegen ihrer Nebeneffekte geschieht), hätte
+weder der Compiler noch der menschliche Leser in diesem Fall die Möglichkeit,
+festzustellen, welche der überladenen Varianten tatsächlich
+aufgerufen werden soll.
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100%>
+<tr>
+<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=1></td>
+<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top width=1000>
+
+<p>
+Das Überladen von Methoden ist dann sinnvoll, wenn die gleichnamigen
+Methoden auch eine vergleichbare Funktionalität haben. Eine typische
+Anwendung von überladenen Methoden besteht in der Simulation
+von variablen Parameterlisten (die als Feature erst seit der Version
+5.0 zur Verfügung stehen). Auch, um eine Funktion, die bereits
+an vielen verschiedenen Stellen im Programm aufgerufen wird, um einen
+weiteren Parameter zu erweitern, ist es nützlich, diese Funktion
+zu überladen, um nicht alle Aufrufstellen anpassen zu müssen.</td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top>
+<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#0099CC">
+<tr>
+<td><font color="#FFFFFF"> Tipp </font></td>
+</tr>
+</table>
+</td>
+<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
+</tr>
+</table>
+
+<p>
+Das folgende Beispiel erweitert die Klasse <font color="#000077"><tt>Auto</tt></font>
+um eine weitere Methode <font color="#000077"><tt>alter</tt></font>,
+die das Alter des Autos nicht nur zurückgibt, sondern es auch
+mit einem als Parameter übergebenen Titel versieht und auf dem
+Bildschirm ausgibt:
+<a name="listingid007013"></a>
+
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
+<tr>
+<td valign=top>
+<font color="#000055">
+<pre>
+<font color="#555555">001 </font><font color="#0000AA">public</font> <font color="#006699">int</font> alter(String titel)
+<font color="#555555">002 </font>{
+<font color="#555555">003 </font> <font color="#006699">int</font> alter = alter();
+<font color="#555555">004 </font> System.out.println(titel+alter);
+<font color="#555555">005 </font> <font color="#0000AA">return</font> alter;
+<font color="#555555">006 </font>}</pre>
+</font>
+</td>
+</tr>
+</table>
+<i>
+Listing 7.13: Überladen einer Methode</i></p>
+
+
+<!-- Section -->
+<a name="sectlevel4id007003006001"></a>
+<h4>Die <a name="ixa100482">Signatur einer Methode</a> </h4>
+
+<p>
+Innerhalb dieser Methode wird der Name <font color="#000077"><tt>alter</tt></font>
+in drei verschiedenen Bedeutungen verwendet. Erstens ist <font color="#000077"><tt>alter</tt></font>
+der Name der Methode selbst. Zweitens wird die lokale Variable <font color="#000077"><tt>alter</tt></font>
+definiert, um drittens den Rückgabewert der parameterlosen <font color="#000077"><tt>alter</tt></font>-Methode
+aufzunehmen. Der Compiler kann die Namen in allen drei Fällen
+unterscheiden, denn er arbeitet mit der <i>Signatur</i> der Methode.
+Unter der Signatur einer Methode versteht man ihren <i>internen</i>
+Namen. Dieser setzt sich aus dem nach außen sichtbaren Namen
+plus codierter Information über die Reihenfolge und Typen der
+formalen Parameter zusammen. Die Signaturen zweier gleichnamiger Methoden
+sind also immer dann unterscheidbar, wenn sie sich wenigstens in einem
+Parameter voneinander unterscheiden.
+
+<!-- Section -->
+
+<a name="konstruktoren"></a>
+<h3>7.3.7 <a name="ixa100483">Konstruktoren</a></h3>
+
+<p>
+In jeder objektorientierten Programmiersprache lassen sich spezielle
+Methoden definieren, die bei der Initialisierung eines Objekts aufgerufen
+werden: die <i>Konstruktoren</i>. In Java werden Konstruktoren als
+Methoden ohne Rückgabewert definiert, die den Namen der Klasse
+erhalten, zu der sie gehören. Konstruktoren dürfen eine
+beliebige Anzahl an Parametern haben und können überladen
+werden. Die Erweiterung unserer <font color="#000077"><tt>Auto</tt></font>-Klasse
+um einen Konstruktor, der den Namen des <font color="#000077"><tt>Auto</tt></font>-Objekts
+vorgibt, sieht beispielsweise so aus:
+<a name="listingid007014"></a>
+
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
+<tr>
+<td valign=top>
+<font color="#000055">
+<pre>
+<font color="#555555">001 </font><font color="#0000AA">public</font> <font color="#0000AA">class</font> Auto
+<font color="#555555">002 </font>{
+<font color="#555555">003 </font> <font color="#0000AA">public</font> String name;
+<font color="#555555">004 </font> <font color="#0000AA">public</font> <font color="#006699">int</font> erstzulassung;
+<font color="#555555">005 </font> <font color="#0000AA">public</font> <font color="#006699">int</font> leistung;
+<font color="#555555">006 </font>
+<font color="#555555">007 </font> <font color="#0000AA">public</font> Auto(String name)
+<font color="#555555">008 </font> {
+<font color="#555555">009 </font> <font color="#006699">this</font>.name = name;
+<font color="#555555">010 </font> }
+<font color="#555555">011 </font>}</pre>
+</font>
+</td>
+</tr>
+</table>
+<i>
+Listing 7.14: Definition eines parametrisierten Konstruktors</i></p>
+
+<p>
+Soll ein Objekt unter Verwendung eines parametrisierten Konstruktors
+instanziert werden, so sind die Argumente wie bei einem Methodenaufruf
+in Klammern nach dem Namen des Konstruktors anzugeben:
+<a name="listingid007015"></a>
+
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
+<tr>
+<td valign=top>
+<font color="#000055">
+<pre>
+<font color="#555555">001 </font>Auto dasAuto = <font color="#0000AA">new</font> Auto(<font color="#0000FF">"Porsche 911"</font>);
+<font color="#555555">002 </font>System.out.println(dasAuto.name);</pre>
+</font>
+</td>
+</tr>
+</table>
+<i>
+Listing 7.15: Aufruf eines parametrisierten Konstruktors</i></p>
+
+<p>
+In diesem Fall wird zunächst Speicher für das <font color="#000077"><tt>Auto</tt></font>-Objekt
+beschafft und dann der Konstruktor aufgerufen. Dieser initialisiert
+seinerseits die Instanzvariable <font color="#000077"><tt>name</tt></font>
+mit dem übergebenen Argument »Porsche 911«. Der nachfolgende
+Aufruf schreibt dann diesen Text auf den Bildschirm.
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100%>
+<tr>
+<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=1></td>
+<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top width=1000>
+
+<p>
+Explizite Konstruktoren werden immer dann eingesetzt, wenn zur Initialisierung
+eines Objektes besondere Aufgaben zu erledigen sind. Es ist dabei
+durchaus gebräuchlich, Konstruktoren zu überladen und mit
+unterschiedlichen Parameterlisten auszustatten. Beim Ausführen
+der <a href="index_n.html#ixb100089"><font color=#000080><tt>new</tt></font></a>-Anweisung
+wählt der Compiler anhand der aktuellen Parameterliste den passenden
+Konstruktor und ruft ihn mit den angegebenen Argumenten auf.</td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top>
+<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#0099CC">
+<tr>
+<td><font color="#FFFFFF"> Tipp </font></td>
+</tr>
+</table>
+</td>
+<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
+</tr>
+</table>
+
+<p>
+Wir wollen das vorige Beispiel um einen Konstruktor erweitern, der
+<i>alle</i> Instanzvariablen initialisiert:
+<a name="listingid007016"></a>
+
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
+<tr>
+<td valign=top>
+<font color="#000055">
+<pre>
+<font color="#555555">001 </font><font color="#0000AA">public</font> <font color="#0000AA">class</font> Auto
+<font color="#555555">002 </font>{
+<font color="#555555">003 </font> <font color="#0000AA">public</font> String name;
+<font color="#555555">004 </font> <font color="#0000AA">public</font> <font color="#006699">int</font> erstzulassung;
+<font color="#555555">005 </font> <font color="#0000AA">public</font> <font color="#006699">int</font> leistung;
+<font color="#555555">006 </font>
+<font color="#555555">007 </font> <font color="#0000AA">public</font> Auto(String name)
+<font color="#555555">008 </font> {
+<font color="#555555">009 </font> <font color="#006699">this</font>.name = name;
+<font color="#555555">010 </font> }
+<font color="#555555">011 </font>
+<font color="#555555">012 </font> <font color="#0000AA">public</font> Auto(String name,
+<font color="#555555">013 </font> <font color="#006699">int</font> erstzulassung,
+<font color="#555555">014 </font> <font color="#006699">int</font> leistung)
+<font color="#555555">015 </font> {
+<font color="#555555">016 </font> <font color="#006699">this</font>.name = name;
+<font color="#555555">017 </font> <font color="#006699">this</font>.erstzulassung = erstzulassung;
+<font color="#555555">018 </font> <font color="#006699">this</font>.leistung = leistung;
+<font color="#555555">019 </font> }
+<font color="#555555">020 </font>}</pre>
+</font>
+</td>
+</tr>
+</table>
+<i>
+Listing 7.16: Eine Klasse mit mehreren Konstruktoren</i></p>
+
+
+<!-- Section -->
+<a name="sectlevel4id007003007001"></a>
+<h4>Default-Konstruktoren<a name="ixa100484"></a> </h4>
+
+<p>
+Falls eine Klasse überhaupt keinen <i>expliziten</i> Konstruktor
+besitzt, wird vom Compiler automatisch ein parameterloser <i>default</i>-Konstruktor
+generiert. Seine einzige Aufgabe besteht darin, den parameterlosen
+Konstruktor der Superklasse aufzurufen. Enthält eine Klassendeklaration
+dagegen nur <i>parametrisierte</i> Konstruktoren, wird kein <i>default</i>-Konstruktor
+erzeugt, und die Klassendatei besitzt überhaupt keinen parameterlosen
+Konstruktor.
+
+<!-- Section -->
+
+<a name="sectlevel4id007003007002"></a>
+<h4>Verkettung von Konstruktoren<a name="ixa100485"></a><a name="ixa100486"></a>
+</h4>
+
+<p>
+Unterschiedliche Konstruktoren einer Klasse können in Java verkettet
+werden, d.h. sie können sich gegenseitig aufrufen. Der aufzurufende
+Konstruktor wird dabei als eine normale Methode angesehen, die über
+den Namen <a name="ixa100487"><a href="index_t.html#ixb100273"><font color=#000080><tt>this</tt></font></a></a>
+aufgerufen werden kann. Die Unterscheidung zum bereits vorgestellten
+<a href="index_t.html#ixb100273"><font color=#000080><tt>this</tt></font></a>-Pointer
+nimmt der Compiler anhand der runden Klammern vor, die dem Aufruf
+folgen. Der im vorigen Beispiel vorgestellte Konstruktor hätte
+damit auch so geschrieben werden können:
+<a name="listingid007017"></a>
+
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
+<tr>
+<td valign=top>
+<font color="#000055">
+<pre>
+<font color="#555555">001 </font><font color="#0000AA">public</font> Auto(String name,
+<font color="#555555">002 </font> <font color="#006699">int</font> erstzulassung,
+<font color="#555555">003 </font> <font color="#006699">int</font> leistung)
+<font color="#555555">004 </font>{
+<font color="#555555">005 </font> <font color="#006699">this</font>(name);
+<font color="#555555">006 </font> <font color="#006699">this</font>.erstzulassung = erstzulassung;
+<font color="#555555">007 </font> <font color="#006699">this</font>.leistung = leistung;
+<font color="#555555">008 </font>}</pre>
+</font>
+</td>
+</tr>
+</table>
+<i>
+Listing 7.17: Verkettung von Konstruktoren</i></p>
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100%>
+<tr>
+<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top width=1000>
+
+<p>
+Der Vorteil der Konstruktorenverkettung besteht darin, dass vorhandener
+Code wiederverwendet wird. Führt ein parameterloser Konstruktor
+eine Reihe von nichttrivialen Aktionen durch, so ist es natürlich
+sinnvoller, diesen in einem spezialisierteren Konstruktor durch Aufruf
+wiederzuverwenden, als den Code zu duplizieren.</td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top>
+<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#000077">
+<tr>
+<td><font color="#FFFFFF"> Hinweis </font></td>
+</tr>
+</table>
+</td>
+<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
+</tr>
+</table>
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100%>
+<tr>
+<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=1></td>
+<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top width=1000>
+
+<p>
+Wird ein Konstruktor in einem anderen Konstruktor derselben Klasse
+explizit aufgerufen, muss dies als erste Anweisung innerhalb der Methode
+geschehen. Steht der Aufruf nicht an <i>erster</i> Stelle, gibt es
+einen Compiler-Fehler.</td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top>
+<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#CC0000">
+<tr>
+<td><font color="#FFFFFF"> Warnung </font></td>
+</tr>
+</table>
+</td>
+<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
+</tr>
+</table>
+
+<p>
+Es gibt noch eine zweite Form der Konstruktorenverkettung. Sie findet
+automatisch statt und dient dazu, abgeleitete Klassen während
+der Instanzierung korrekt zu initialisieren. In <a href="k100052.html#vererbungvonkonstruktoren">Abschnitt 8.1.4</a>
+werden wir auf die Details dieses Mechanismus eingehen.
+
+<!-- Section -->
+
+<a name="sectlevel4id007003007003"></a>
+<h4>Initialisierungsreihenfolge </h4>
+
+<p>
+Beim Instanzieren eines neuen Objekts werden die Initialisierungschritte
+in einer genau festgelegten Reihenfolge ausgeführt:
+<ul>
+<li>Zunächst werden die Superklassenkonstruktoren aufgerufen,
+so wie es im vorigen Abschnitt beschrieben wurde.
+<li>Anschließend werden alle Membervariablen in der textuellen
+Reihenfolge ihrer Deklaration initialisiert.
+<li>Schließlich wird der Programmcode im Rumpf des Konstruktors
+ausgeführt.
+</ul>
+
+<p>
+Wir wollen dies an einem Beispiel veranschaulichen:
+<a name="listingid007018"></a>
+
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
+<tr>
+<td valign=top>
+<font color="#000055">
+<pre>
+<font color="#555555">001 </font><font color="#00AA00">/* Listing0718.java */</font>
+<font color="#555555">002 </font>
+<font color="#555555">003 </font><font color="#0000AA">public</font> <font color="#0000AA">class</font> Listing0718
+<font color="#555555">004 </font>{
+<font color="#555555">005 </font> <font color="#0000AA">public</font> <font color="#0000AA">static</font> String getAndPrint(String s)
+<font color="#555555">006 </font> {
+<font color="#555555">007 </font> System.out.println(s);
+<font color="#555555">008 </font> <font color="#0000AA">return</font> s;
+<font color="#555555">009 </font> }
+<font color="#555555">010 </font>
+<font color="#555555">011 </font> <font color="#0000AA">public</font> <font color="#0000AA">static</font> <font color="#006699">void</font> main(String[] args)
+<font color="#555555">012 </font> {
+<font color="#555555">013 </font> Son son = <font color="#0000AA">new</font> Son();
+<font color="#555555">014 </font> }
+<font color="#555555">015 </font>}
+<font color="#555555">016 </font>
+<font color="#555555">017 </font><font color="#0000AA">class</font> Father
+<font color="#555555">018 </font>{
+<font color="#555555">019 </font> <font color="#0000AA">private</font> String s1 = Listing0718.getAndPrint(<font color="#0000FF">"Father.s1"</font>);
+<font color="#555555">020 </font>
+<font color="#555555">021 </font> <font color="#0000AA">public</font> Father()
+<font color="#555555">022 </font> {
+<font color="#555555">023 </font> Listing0718.getAndPrint(<font color="#0000FF">"Father.<init>"</font>);
+<font color="#555555">024 </font> }
+<font color="#555555">025 </font>}
+<font color="#555555">026 </font>
+<font color="#555555">027 </font><font color="#0000AA">class</font> Son
+<font color="#555555">028 </font><font color="#0000AA">extends</font> Father
+<font color="#555555">029 </font>{
+<font color="#555555">030 </font> <font color="#0000AA">private</font> String s1 = Listing0718.getAndPrint(<font color="#0000FF">"Son.s1"</font>);
+<font color="#555555">031 </font>
+<font color="#555555">032 </font> <font color="#0000AA">public</font> Son()
+<font color="#555555">033 </font> {
+<font color="#555555">034 </font> Listing0718.getAndPrint(<font color="#0000FF">"Son.<init>"</font>);
+<font color="#555555">035 </font> }
+<font color="#555555">036 </font>}</pre>
+</font>
+</td>
+<td valign=top align=right>
+<a href="../examples/Listing0718.java"><font color="#000055" size=-1>Listing0718.java</font></a></td>
+</tr>
+</table>
+<i>
+Listing 7.18: Initialisierungsreihenfolge</i></p>
+
+<p>
+Im Hauptprogramm wird eine neue Instanz der Klasse <font color="#000077"><tt>Son</tt></font>
+angelegt. Durch die Konstruktorenverkettung wird zunächst zur
+Vaterklasse <font color="#000077"><tt>Father</tt></font> verzweigt.
+Darin wird zunächst die Membervariable <font color="#000077"><tt>s1</tt></font>
+initialisiert, und anschließend wird der Rumpf des Konstruktors
+ausgeführt. Erst danach führt <font color="#000077"><tt>Son</tt></font>
+dieselben Schritte für sich selbst durch. Die Ausgabe des Programms
+ist demnach:
+<font color="#333300">
+<pre>
+Father.s1
+Father.<init>
+Son.s1
+Son.<init>
+</pre>
+</font>
+
+
+<!-- Section -->
+<a name="destruktoren"></a>
+<h3>7.3.8 <a name="ixa100488">Destruktoren</a></h3>
+
+<p>
+Neben Konstruktoren, die während der Initialisierung eines Objekts
+aufgerufen werden, gibt es in Java auch <i>Destruktoren</i>. Sie werden
+unmittelbar vor dem Zerstören eines Objekts aufgerufen.
+
+<p>
+Ein Destruktor wird als geschützte (<a href="index_p.html#ixb100086"><font color=#000080><tt>protected</tt></font></a>)
+parameterlose Methode mit dem Namen <a name="ixa100489"><a href="index_f.html#ixb100412"><font color=#000080><tt>finalize</tt></font></a></a>
+definiert:
+<a name="listingid007019"></a>
+
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
+<tr>
+<td valign=top>
+<font color="#000055">
+<pre>
+<font color="#555555">001 </font><font color="#0000AA">protected</font> <font color="#006699">void</font> finalize()
+<font color="#555555">002 </font>{
+<font color="#555555">003 </font> ...
+<font color="#555555">004 </font>}</pre>
+</font>
+</td>
+</tr>
+</table>
+<i>
+Listing 7.19: Die finalize-Methode</i></p>
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100%>
+<tr>
+<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top width=1000>
+
+<p>
+Da Java über ein automatisches Speichermanagement verfügt,
+kommt den Destruktoren hier eine viel geringere Bedeutung zu als in
+anderen objektorientierten Sprachen. Anders als etwa in C++ muss sich
+der Entwickler ja nicht um die Rückgabe von belegtem Speicher
+kümmern; und das ist sicher eine der Hauptaufgaben von Destruktoren
+in C++.</td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top>
+<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#000077">
+<tr>
+<td><font color="#FFFFFF"> Hinweis </font></td>
+</tr>
+</table>
+</td>
+<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
+</tr>
+</table>
+
+<p>
+Tatsächlich garantiert die Sprachspezifikation nicht, dass ein
+Destruktor überhaupt aufgerufen wird. Wenn er aber aufgerufen
+wird, so erfolgt dies nicht, wenn die Lebensdauer des Objektes endet,
+sondern dann, wenn der Garbage Collector den für das Objekt reservierten
+Speicherplatz zurückgibt. Dies kann unter Umständen nicht
+nur viel später der Fall sein (der Garbage Collector läuft
+ja als asynchroner Hintergrundprozess), sondern auch gar nicht. Wird
+nämlich das Programm beendet, bevor der Garbage Collector das
+nächste Mal aufgerufen wird, werden auch keine Destruktoren aufgerufen.
+Selbst wenn Destruktoren aufgerufen werden, ist die Reihenfolge oder
+der Zeitpunkt ihres Aufrufs undefiniert. Der Einsatz von Destruktoren
+in Java sollte also mit der nötigen Vorsicht erfolgen.
+<hr>
+<table border=0 cellpadding=0 cellspacing=1 width="100%">
+<tr bgcolor="#EEFFCC">
+<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html"> Titel </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html"> Inhalt </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html"> Suchen </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html"> Index </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()"> DOC </a>
+<td align="right">Handbuch der Java-Programmierung, 5. Auflage, Addison
+Wesley, Version 5.0.1
+<tr bgcolor="#EEFFCC">
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100046.html"> << </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100048.html"> < </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100050.html"> > </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100051.html"> >> </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()"> API </a>
+<td align="right">© 1998, 2007 Guido Krüger & Thomas
+Stark, <a href="http://www.javabuch.de">http://www.javabuch.de</a>
+</table>
+<a name="endofbody"></a>
+</body>
+</html>
|
