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/k100054.html | |
| download | Studium-master.tar.gz Studium-master.tar.bz2 | |
Diffstat (limited to 'Master/Reference Architectures and Patterns/hjp5/html/k100054.html')
| -rw-r--r-- | Master/Reference Architectures and Patterns/hjp5/html/k100054.html | 437 |
1 files changed, 437 insertions, 0 deletions
diff --git a/Master/Reference Architectures and Patterns/hjp5/html/k100054.html b/Master/Reference Architectures and Patterns/hjp5/html/k100054.html new file mode 100644 index 0000000..6ff80bb --- /dev/null +++ b/Master/Reference Architectures and Patterns/hjp5/html/k100054.html @@ -0,0 +1,437 @@ +<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,k100051.html;106,k100053.html;107,k100055.html;108,k100057.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="k100051.html"> << </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100053.html"> < </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100055.html"> > </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100057.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 8 - OOP II: Vererbung, Polymorphismus und statische Elemente
+</table>
+<hr>
+
+
+<!-- Section -->
+<a name="sectlevel2id008003"></a>
+<h2>8.3 Statische Methoden und Membervariablen </h2>
+<hr>
+<ul>
+<li><a href="k100054.html#sectlevel2id008003">8.3 Statische Methoden und Membervariablen</a>
+<ul>
+<li><a href="k100054.html#sectlevel3id008003001">8.3.1 Klassenvariablen</a>
+<li><a href="k100054.html#sectlevel3id008003002">8.3.2 Konstanten</a>
+<li><a href="k100054.html#sectlevel3id008003003">8.3.3 Klassenmethoden</a>
+<ul>
+<li><a href="k100054.html#sectlevel4id008003003001">Die statische Methode main</a>
+</ul>
+<li><a href="k100054.html#sectlevel3id008003004">8.3.4 Statische Initialisierer</a>
+</ul>
+</ul>
+<hr>
+
+
+<!-- Section -->
+<a name="sectlevel3id008003001"></a>
+<h3>8.3.1 <a name="ixa100532">Klassenvariablen</a></h3>
+
+<p>
+Java ist eine konsequent objektorientierte Sprache, in der es weder
+globale Funktionen noch globale Variablen gibt. Da es aber mitunter
+sinnvoll ist, Eigenschaften zu verwenden, die nicht an Instanzen einer
+Klasse gebunden sind, haben die Sprachdesigner das Attribut <a name="ixa100533"><a href="index_s.html#ixb100422"><font color=#000080><tt>static</tt></font></a></a>
+für Methoden und Variablen eingeführt. Eine Variable, die
+innerhalb einer Klasse mit dem Attribut <a href="index_s.html#ixb100422"><font color=#000080><tt>static</tt></font></a>
+versehen wurde, nennt man <i>Klassenvariable</i> (oder auch <a name="ixa100534"><i>Statische
+Variable</i></a>). Im Gegensatz zu Instanzvariablen,
+die immer an ein konkretes Objekt gebunden sind, existieren Klassenvariablen
+unabhängig von einem Objekt.
+
+<p>
+Jede Klassenvariable wird nur einmal angelegt und kann von allen Methoden
+der Klasse aufgerufen werden. Da sich alle Methoden die Variable »teilen«,
+sind Veränderungen, die eine Instanz vornimmt, auch in allen
+anderen Instanzen sichtbar. Klassenvariablen sind daher vergleichbar
+mit globalen Variablen, denn ihre Lebensdauer erstreckt sich auf das
+gesamte Programm. Namenskollisionen können allerdings nicht auftreten,
+denn der Zugriff von außen erfolgt durch Qualifizierung mit
+dem Klassennamen in der Form <font color="#000077"><tt>Klassenname.Variablenname</tt></font>.
+
+<p>
+Ein einfaches Beispiel für die Verwendung von Klassenvariablen
+besteht darin, einen Instanzenzähler in eine Klasse einzubauen.
+Hierzu wird eine beliebige Klassenvariable eingeführt, die beim
+Erzeugen eines Objekts hoch- und beim Zerstören heruntergezählt
+wird. Das folgende Beispiel demonstriert das für die Klasse <font color="#000077"><tt>Auto</tt></font>:
+<a name="listingid008007"></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">/* Testauto.java */</font>
+<font color="#555555">002 </font>
+<font color="#555555">003 </font><font color="#0000AA">public</font> <font color="#0000AA">class</font> Testauto
+<font color="#555555">004 </font>{
+<font color="#555555">005 </font> <font color="#0000AA">static</font> <font color="#0000AA">private</font> <font color="#006699">int</font> objcnt = 0;
+<font color="#555555">006 </font>
+<font color="#555555">007 </font> <font color="#0000AA">public</font> Testauto()
+<font color="#555555">008 </font> {
+<font color="#555555">009 </font> ++objcnt;
+<font color="#555555">010 </font> }
+<font color="#555555">011 </font>
+<font color="#555555">012 </font> <font color="#0000AA">public</font> <font color="#006699">void</font> finalize()
+<font color="#555555">013 </font> {
+<font color="#555555">014 </font> --objcnt;
+<font color="#555555">015 </font> }
+<font color="#555555">016 </font>
+<font color="#555555">017 </font> <font color="#0000AA">public</font> <font color="#0000AA">static</font> <font color="#006699">void</font> main(String[] args)
+<font color="#555555">018 </font> {
+<font color="#555555">019 </font> Testauto auto1;
+<font color="#555555">020 </font> Testauto auto2 = <font color="#0000AA">new</font> Testauto();
+<font color="#555555">021 </font> System.out.println(
+<font color="#555555">022 </font> <font color="#0000FF">"Anzahl Testauto-Objekte: "</font> + Testauto.objcnt
+<font color="#555555">023 </font> );
+<font color="#555555">024 </font> }
+<font color="#555555">025 </font>}</pre>
+</font>
+</td>
+<td valign=top align=right>
+<a href="../examples/Testauto.java"><font color="#000055" size=-1>Testauto.java</font></a></td>
+</tr>
+</table>
+<i>
+Listing 8.7: Realisierung eines Instanzenzählers mit Klassenvariablen</i></p>
+
+<p>
+Die Ausgabe des Programms ist:
+<font color="#333300">
+<pre>
+Anzahl Testauto-Objekte: 1
+</pre>
+</font>
+
+<p>
+Mit <font color="#000077"><tt>auto2</tt></font> wurde eine Instanz
+der Klasse erzeugt, <font color="#000077"><tt>auto1</tt></font> ist
+dagegen zum Zeitpunkt der Ausgabeanweisung lediglich eine noch nicht
+initialisierte Objektreferenz.
+
+<!-- Section -->
+
+<a name="sectlevel3id008003002"></a>
+<h3>8.3.2 <a name="ixa100535">Konstanten</a></h3>
+
+<p>
+Eine andere Anwendung von Klassenvariablen besteht in der Deklaration
+von Konstanten. Dazu wird das <a href="index_s.html#ixb100422"><font color=#000080><tt>static</tt></font></a>-Attribut
+mit dem <a name="ixa100536"><a href="index_f.html#ixb100401"><font color=#000080><tt>final</tt></font></a></a>-Attribut
+kombiniert, um eine unveränderliche Variable mit unbegrenzter
+Lebensdauer zu erzeugen:
+<a name="listingid008008"></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">private</font> <font color="#0000AA">static</font> <font color="#0000AA">final</font> <font color="#006699">double</font> STEUERSATZ = 18.9;
+<font color="#555555">004 </font>}</pre>
+</font>
+</td>
+</tr>
+</table>
+<i>
+Listing 8.8: Verwendung von Klassenvariablen zur Definition von Konstanten</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>
+Durch die Anwendung von <a href="index_f.html#ixb100401"><font color=#000080><tt>final</tt></font></a>
+wird verhindert, dass der Konstanten STEUERSATZ während der Ausführung
+des Programms ein anderer Wert zugewiesen wird. Da Java keinen Präprozessor
+enthält und damit keine <font color="#000077"><tt>#define</tt></font>-Anweisung
+kennt, ist die beschriebene Methode das einzige Verfahren zur Deklaration
+von Konstanten in Java. Die Konvention, Konstantennamen groß
+zu schreiben, wurde dabei von C übernommen.</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>
+
+
+<!-- Section -->
+<a name="sectlevel3id008003003"></a>
+<h3>8.3.3 <a name="ixa100537">Klassenmethoden</a></h3>
+
+<p>
+Neben Klassenvariablen gibt es in Java auch <i>Klassenmethoden</i>,
+d.h. Methoden, die unabhängig von einer bestimmten Instanz existieren.
+Sie werden auch als <a name="ixa100538"><i>statische Methoden</i></a>
+bezeichnet. Klassenmethoden werden ebenfalls mit Hilfe des <a name="ixa100539"><a href="index_s.html#ixb100422"><font color=#000080><tt>static</tt></font></a></a>-Attributs
+deklariert und - analog zu Klassenvariablen - durch Voranstellen des
+Klassennamens aufgerufen.
+
+<p>
+Da Klassenmethoden unabhängig von konkreten Instanzen ihrer Klasse
+existieren, ist ein Zugriff auf Instanzvariablen nicht möglich.
+Diese Trennung äußert sich darin, dass Klassenmethoden
+keinen <a href="index_t.html#ixb100273"><font color=#000080><tt>this</tt></font></a>-Zeiger
+besitzen. Der Zugriff auf Instanzvariablen und der Aufruf von Instanzmethoden
+wird daher schon zur Compile-Zeit als Fehler erkannt.
+<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>
+Klassenmethoden werden häufig da eingesetzt, wo Funktionalitäten
+zur Verfügung gestellt werden, die nicht datenzentriert arbeiten
+oder auf primitiven Datentypen operieren. Beispiele für beide
+Arten sind in der Klassenbibliothek zu finden. Zur ersten Gruppe gehören
+beispielsweise die Methoden der Klasse <a href="index_s.html#ixb100435"><font color=#000080><tt>System</tt></font></a>.
+Die Klasse <a href="index_s.html#ixb100435"><font color=#000080><tt>System</tt></font></a>
+ist eine Art Toolbox, die Funktionen wie <i>Aufruf des Garbage Collectors</i>
+oder <i>Beenden des Programms</i> zur Verfügung stellt. Zur zweiten
+Gruppe gehören beispielsweise die Methoden der Klasse <a href="index_m.html#ixb100436"><font color=#000080><tt>Math</tt></font></a>,
+die eine große Anzahl an Funktionen zur Fließkomma-Arithmetik
+zur Verfügung stellen. Da die Fließkommatypen primitiv
+sind, hätte ein instanzbasiertes Methodendesign an dieser Stelle
+wenig Sinn.
+
+<p>
+Eine weitere Anwendung für Klassenmethoden liegt in der Instanzierung
+von Objekten der eigenen Klasse. Beispiele dafür finden sich
+in den Design-Patterns <i>Singleton</i> (siehe <a href="k100068.html#singletonpattern">Abschnitt 10.4.1</a>)
+und <i>Factory-Methode</i> (siehe <a href="k100068.html#factorypattern">Abschnitt 10.4.4</a>).</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 Listing zeigt die Verwendung der Klassenmethode <a href="index_s.html#ixb100437"><font color=#000080><tt>sqrt</tt></font></a>
+der Klasse <a href="index_m.html#ixb100436"><font color=#000080><tt>Math</tt></font></a>
+zur Ausgabe einer Tabelle von Quadratwurzeln:
+<a name="listingid008009"></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">/* Listing0809.java */</font>
+<font color="#555555">002 </font>
+<font color="#555555">003 </font><font color="#0000AA">public</font> <font color="#0000AA">class</font> Listing0809
+<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> main(String[] args)
+<font color="#555555">006 </font> {
+<font color="#555555">007 </font> <font color="#006699">double</font> x, y;
+<font color="#555555">008 </font> <font color="#0000AA">for</font> (x = 0.0; x <= 10.0; x = x + 1.0) {
+<font color="#555555">009 </font> y = Math.sqrt(x);
+<font color="#555555">010 </font> System.out.println(<font color="#0000FF">"sqrt("</font>+x+<font color="#0000FF">") = "</font>+y);
+<font color="#555555">011 </font> }
+<font color="#555555">012 </font> }
+<font color="#555555">013 </font>}</pre>
+</font>
+</td>
+<td valign=top align=right>
+<a href="../examples/Listing0809.java"><font color="#000055" size=-1>Listing0809.java</font></a></td>
+</tr>
+</table>
+<i>
+Listing 8.9: Verwendung von Math.sqrt</i></p>
+
+<p>
+Die Ausgabe des Programms ist:
+<font color="#333300">
+<pre>
+sqrt(0.0) = 0.0
+sqrt(1.0) = 1.0
+sqrt(2.0) = 1.4142135623730951
+sqrt(3.0) = 1.7320508075688772
+sqrt(4.0) = 2.0
+sqrt(5.0) = 2.23606797749979
+sqrt(6.0) = 2.449489742783178
+sqrt(7.0) = 2.6457513110645907
+sqrt(8.0) = 2.8284271247461903
+sqrt(9.0) = 3.0
+sqrt(10.0) = 3.1622776601683795
+</pre>
+</font>
+
+
+<!-- Section -->
+<a name="sectlevel4id008003003001"></a>
+<h4>Die statische Methode main<a name="ixa100540"></a> </h4>
+
+<p>
+Ein schon bekanntes Beispiel für eine Klassenmethode ist die
+Methode <a href="index_m.html#ixb100150"><font color=#000080><tt>main</tt></font></a>,
+die als Startpunkt in Applikationen verwendet wird. Im Gegensatz zu
+Applets, bei denen vom Laufzeitsystem eine Instanz der Appletklasse
+erzeugt und dann durch Aufruf von Callback-Methoden bedient wird,
+erfolgt der Start einer Applikation ohne die Instanzierung einer Klasse.
+Der Java-Interpreter lädt lediglich das beim Starten angegebene
+Klassenobjekt und sucht nach einer statischen Methode mit der Signatur:
+<font color="#000077">
+<pre>
+public static void main(String[] args)
+</pre>
+</font>
+
+<p>
+Wird diese gefunden, stellt es ein Array mit den Kommandozeilenparametern
+zusammen und übergibt es als Argument an <font color="#000077"><tt>main</tt></font>.
+Wird keine Methode mit dieser Signatur gefunden, gibt es einen Laufzeitfehler.
+
+
+<!-- Section -->
+<a name="sectlevel3id008003004"></a>
+<h3>8.3.4 <a name="ixa100541">Statische Initialisierer</a></h3>
+
+<p>
+Bisher haben wir nur die Möglichkeit kennengelernt, statischen
+Variablen während der Deklaration einen Wert zuzuweisen. Falls
+komplexere Initialisierungen benötigt werden, können zur
+Initialisierung von statischen Variablen <i>statische Initialisierer</i>
+definiert werden.
+
+<p>
+Sie ähneln gewöhnlichen Konstruktoren und dienen wie diese
+dazu, Variablen mit einem definierten Startwert zu belegen. Im Gegensatz
+zu einem gewöhnlichen Konstruktor erfolgt der Aufruf eines statischen
+Initialisierers aber nicht mit jedem neu angelegten Objekt, sondern
+nur einmal, wenn die Klasse geladen wird.
+
+<p>
+Ein statischer Initialisierer wird als parameterlose Methode mit dem
+Namen <a name="ixa100542"><a href="index_s.html#ixb100422"><font color=#000080><tt>static</tt></font></a></a>
+definiert:
+<a name="listingid008010"></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">class</font> Test
+<font color="#555555">002 </font>{
+<font color="#555555">003 </font> <font color="#0000AA">static</font> <font color="#006699">int</font> i;
+<font color="#555555">004 </font> <font color="#0000AA">static</font> <font color="#006699">int</font> j;
+<font color="#555555">005 </font>
+<font color="#555555">006 </font> <font color="#0000AA">static</font>
+<font color="#555555">007 </font> {
+<font color="#555555">008 </font> i = 5;
+<font color="#555555">009 </font> j = 3 * i;
+<font color="#555555">010 </font> }
+<font color="#555555">011 </font>}</pre>
+</font>
+</td>
+</tr>
+</table>
+<i>
+Listing 8.10: Definition eines statischen Initialisierers</i></p>
+
+<p>
+Da der statische Initialisierer vom Laufzeitsystem aufgerufen wird,
+wenn die Klasse geladen wird, ist eine benutzerdefinierte Parametrisierung
+nicht möglich.
+<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>
+Es ist erlaubt, mehrere statische Initialisierer innerhalb einer Klasse
+zu definieren. Sie werden dann nacheinander in der textuellen Reihenfolge
+ihrer Deklaration ausgeführt. Wechseln sich initialisierte statische
+Variablen und statische Initialisierer im Quelltext ab, werden beide
+gleichwertig behandelt, d.h. die Ausführung erfolgt unabhängig
+vom Typ in textueller Reihenfolge. Eine Ausnahme bilden lediglich
+die statischen Variablen, denen Konstanten zugewiesen werden, deren
+Wert bereits zur Compile-Zeit feststeht. Ihre Initialisierung erfolgt
+- unabhängig von ihrer Position im Quellcode - unmittelbar nach
+dem Laden der Klasse.</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>
+<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="k100051.html"> << </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100053.html"> < </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100055.html"> > </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100057.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>
|
