Titel   Inhalt   Suchen   Index   DOC  Handbuch der Java-Programmierung, 3. Auflage
 <<    <     >    >>   API  Kapitel 13 - Strukturierung von Java-Programmen

13.1 Programmelemente



Wie in jeder Programmiersprache kann man auch in Java Strukturen erkennen, die auf den unterschiedlichen Abstraktionsebenen die Bestandteile eines Programms bilden. Die Kenntnis und Bezeichnung dieser Strukturen ist hilfreich für das Verständnis der entwickelten Programme und für die Kommunikation mit anderen Programmierern.

Wir wollen uns dazu in diesem Kapitel die folgenden Programmelemente ansehen:

13.1.1 Anweisungen

Anweisungen gehören zu den elementarsten ausführbaren Programmelementen in Java. Eine Anweisung kann eine Deklaration enthalten, einen Ausdruck auswerten oder den Programmablauf steuern. Wir wollen Anweisungen an dieser Stelle als die kleinsten Bausteine von Java betrachten, und alle anderen Elemente sollen darauf aufbauen.

13.1.2 Blöcke

Ein Block ist eine Kollektion von Anweisungen, die nacheinander ausgeführt werden. Anders als eine einfache Anweisung kann ein Block eigene Variablen definieren, die nur innerhalb des Blocks sichtbar sind. Sie werden angelegt, wenn der Block aufgerufen wird, und zerstört, wenn er wieder verlassen wird.

Interessant ist ein Block vor allem deshalb, weil er selbst eine Anweisung ist. Während er in seiner Zusammensetzung aus vielen verschiedenen Anweisungen bestehen kann, stellt sich ein Block nach außen hin als eine einzige Anweisung dar. Die ganze Semantik einer blockstrukturierten Sprache ist darauf ausgelegt, daß ein Block für die Anweisungen, die ihn verwenden, wie eine homogene Einzelanweisung aussieht.

Rekursive Konstruktionsschemata, wie das hier beschriebene, treten an vielen verschiedenen Stellen und in vielen verschiedenen Erscheinungsformen bei der Programmentwicklung auf. Es gibt Methoden, die sich selbst aufrufen, Strukturvariablen, die andere Variablen enthalten, oder eben Blöcke, die Anweisungen enthalten und Anweisungen sind. Grundlage von rekursiven Part-of-Beziehungen ist immer der Umstand, daß die Kollektion selbst vom Typ der darin enthaltenen Elemente ist.

Die Sichtbarkeit und Lebensdauer von Blöcken in Java entspricht den üblichen Regeln, die auch in anderen Programmiersprachen gültig sind. Lokale Variablen werden angelegt, wenn die Ausführung des Blocks beginnt, und wieder zerstört, wenn der Block verlassen wird. Innerhalb eines Blocks sind die lokalen Variablen des Blocks und die lokalen Variablen der umgebenden Blöcke bzw. der umgebenden Methode sichtbar. Zusätzlich sind die Variablen der Klasse sichtbar, in der die den Block umschließende Methode enthalten ist.

Lokale Variablen verdecken gleichnamige Instanz- oder Klassenvariablen. Durch Voranstellen des this-Zeigers kann trotzdem auf sie zugegriffen werden. Dies wird in Java oft ausgenutzt, um im Konstruktor einer Methode Membervariablen zu initialisieren, die denselben Namen wie formale Parameter haben:

001 class Point
002 {
003   private int x, y;
004   public Point(int x, int y)
005   {
006     this.x = x;
007     this.y = y;
008   }
009 }
Listing 13.1: Zugriff auf verdeckte Membervariablen

 Tip 

Diese Vorgehensweise hat den Vorteil, daß man sich für die formalen Parameter nicht extra Namen ausdenken muß, nur damit sie sich von den zugehörigen Membervariablen unterscheiden.

Sie hat aber auch den Nachteil, daß Membervariablen versehentlich durch lokale Variablen verdeckt werden können. Das folgende Beispiel zeigt einen typischen Fehler dieser Art:

001 /* Listing1302.java */
002 
003 public class Listing1302
004 {
005   private int cnt = 0;
006 
007   public void printNext()
008   {
009     int value = cnt;
010     System.out.println("value = " + value);
011     int cnt = value + 1; 
012   }
013 
014   public static void main(String[] args)
015   {
016     Listing1302 obj = new Listing1302();
017     obj.printNext();
018     obj.printNext();
019     obj.printNext();
020   }
021 }
Listing1302.java
Listing 13.2: Versehentliches Verdecken einer Membervariable

Auf den ersten Blick würde man erwarten, daß nacheinander die Werte 0, 1 und 2 ausgegeben werden. Dem ist aber nicht so, denn in Zeile 011 wird der um eins erhöhte Wert nicht der Membervariablen cnt zugewiesen, sondern der lokalen Variablen gleichen Namens. Dieser Fehler ist recht tückisch und kann bei unübersichtlichem Programmcode leicht entstehen. Die hier vorgestellte Variante passiert vor allem dann leicht, wenn eine ehemals lokale Variable zu einer Membervariable umfunktioniert wurde und der Programmierer nicht daran gedacht hat, den Typnamen zu entfernen.

 Warnung 

Im Gegensatz zu den meisten anderen Programmiersprachen gibt es in Java die Regel, daß lokale Variablen sich nicht gegenseitig verdecken dürfen. Es ist also nicht erlaubt, innerhalb eines Blocks eine lokale Variable zu deklarieren, die unter demselben Namen bereits als lokale Variable sichtbar ist. Weitere Details zu Blöcken sind in Kapitel 6 zu finden.

 Hinweis 

13.1.3 Methoden

Methoden sind wie Blöcke Kollektionen, die Deklarationen und Anweisungen enthalten können. Genaugenommen enthalten sie neben dem Funktionskopf genau einen Block, der alle anderen Elemente enthält. Sie unterscheiden sich von Blöcken folgendermaßen:

Methoden werden in Java immer lokal zu einer Klasse definiert. Klassenlose Funktionen, wie sie beispielsweise in C++ zur Verfügung stehen, gibt es in Java nicht. In diesem Sinne ist Java eine wirklich objektorientierte Programmiersprache, denn die Methoden operieren immer auf den Daten eines bestimmten Objekts, zu dem sie aufgerufen werden.

 Hinweis 

Allerdings gibt es noch die Klassenmethoden. Sie werden zwar auch innerhalb einer Klasse definiert, benötigen aber später kein Objekt zur Ausführung. Statt dessen entsprechen Klassenmethoden eher den globalen Funktionen anderer Programmiersprachen und haben somit keinen Zugriff auf die Membervariablen eines Objekts. Im Unterschied zu gewöhnlichen Funktionen werden Klassenmethoden aber innerhalb einer Klasse definiert und besitzen damit einen eigenen Namensraum, der sich über die Methoden der aktuellen Klasse erstreckt. Der Zugriff auf eine Klassenmethode erfordert immer die Verwendung eines qualifizierten Namens, der sich aus dem Klassennamen, einem Punkt und dem eigentlichen Methodennamen zusammensetzt.

13.1.4 Klassen

Klassen sind das wichtigste Strukturierungsmittel objektorientierter Sprachen. Eine Klasse enthält eine Menge von Variablen, die den Zustand von Objekten dieser Klasse beschreiben, und eine Menge von Methoden, die das Verhalten der Objekte festlegen.

Klassen sind insofern schachtelbar, als ihre Instanzvariablen vom Typ einer Klasse sein können. Dabei ist es insbesondere erlaubt, daß die Membervariablen von demselben Typ wie die zu definierende Klasse sind. Da in Java alle Objekte als Referenzen abgelegt werden, können auf diese Weise rekursive Datentypen erzeugt und zur Konstruktion von dynamischen Datenstrukturen verwendet werden.

13.1.5 Pakete

In großen Programmsystemen reichen Klassen als Strukturelemente alleine nicht aus. Deshalb bietet Java mit den Packages (oder Paketen) oberhalb der Ebene der Klassen eine weitere Kollektion für Programmelemente an.

Ein Paket ist eine Sammlung von Klassen, die einen gemeinsamen Zweck verfolgen oder aus anderen Gründen zusammengefaßt werden sollen. Jede Klasse in Java ist Bestandteil genau eines Pakets. Paketnamen können aus mehreren Teilen bestehen und beliebig tiefe Hierarchien ausdrücken.

Der Name einer Methode oder einer Variablen besteht damit grundsätzlich aus drei Elementen:

Ein Beispiel für einen Methodennamen ist java.lang.Math.sqrt. Wir werden später Mechanismen kennenlernen, mit denen es möglich ist, die Namen bei ihrer Verwendung abzukürzen.

13.1.6 Applikationen

Applikationen bilden eigenständige Programme in Java. Sie benötigen keinen Browser zur Ausführung, sondern nur den Java-Interpreter und die .class-Files der verwendeten Klassen.

Technisch betrachtet ist eine Applikation nicht mehr als eine einzelne Klasse, in der eine Methode vom Typ public static void main definiert wurde. Jede Klasse, die eine solche Methode enthält, kann als Applikation verwendet werden.

Durch einfaches Hinzufügen einer Methode public static void main kann also jede beliebige Klasse sehr leicht in eine Applikation verwandelt und vom Java-Interpreter aufgerufen werden. Dies kann beispielsweise nützlich sein, um in Low-Level-Klassen, die eigentlich nur als Dienstleister auftreten, eigenständig ausführbaren Testcode unterzubringen, oder um eine solche Klasse mit Benutzungshinweisen auszustatten, die der Entwickler durch einfaches Starten der Klasse als Applikation abrufen kann.

 Tip 

13.1.7 Applets

Applets sind ebenfalls lauffähige Java-Programme. Anders als Applikationen, werden sie aus einer HTML-Seite heraus aufgerufen und benötigen zur Ausführung einen Web-Browser (oder ein Hilfsprogramm wie den Appletviewer, das sich in gewissem Sinne wie ein Web-Browser verhält).

Applets werden nicht durch die Methode public static void main gestartet, sondern müssen aus der Klasse Applet abgeleitet und nach deren Architekturmerkmalen konstruiert werden. Zum Starten des Programms erzeugt der Browser eine Instanz der abgeleiteten Klasse und ruft nacheinander eine Reihe vordefinierter Callback-Methoden auf. Callback-Methoden sind Methoden, die von der abgeleiteten Klasse zur Verfügung gestellt und vom Browser oder AppletViewer aufgerufen werden. Weitere Details zur Applet-Programmierung finden sich in Kapitel 39 und Kapitel 40.

 Hinweis 


 Titel   Inhalt   Suchen   Index   DOC  Handbuch der Java-Programmierung, 3. Auflage, Addison Wesley, Version 3.0.1
 <<    <     >    >>   API  © 1998-2003 Guido Krüger, http://www.javabuch.de