Klassendeklarationen in Java
Die—etwas vereinfachte—Produktion für eine Klassendeklaration lautet folgendermaßen.
- 〈ClassDeclaration 〉 ::=
- [〈ClassModifiers 〉] "class" 〈Identifier 〉 〈ClassBody 〉.
Dabei legen die Klassenmodifizierer 〈ClassModifiers 〉 Eigenschaften der deklarierten Klasse fest, deren Name nach dem Schlüsselwort "class" als Bezeichner 〈Identifier 〉 festgelegt wird. Darauf folgt der Klassenrumpf 〈ClassBody 〉 mit den in geschweiften Klammern enthaltenen Elementen der Klasse.
Eine Klasse kann zusammengehörige Methoden zusammenfassen. Die Namen von Methoden einer Klasse brauchen nur innerhalb der Klasse eindeutig zu sein.
Liedtest.java/** Das Lied "Auf einem Baum ein Kuckuck sass" */
class AufEinemBaumEinKuckuckSass
{ /** Den Refrain des Liedes ausgeben. */
private static void refrainAusgeben()
{ System.out.println( "Sim sa la dim, bam ba," );
System.out.println( "Sa la du, sa la dim -" ); }
/** Den Text des Liedes ausgeben. */
public static void ausgeben()
{ { System.out.println( "Auf einem Baum ein Kuckuck, -" );
refrainAusgeben();
System.out.println( "Auf einem Baum ein Kuckuck sass." ); }
{ System.out.println( "Da kam ein junger Jaeger, -" );
refrainAusgeben();
System.out.println( "Da kam ein junger Jaegersmann." ); }
{ System.out.println( "Der schoss den armen Kuckuck, -" );
refrainAusgeben();
System.out.println( "Der schoss den armen Kuckuck tot." ); }}}
/** Das Lied "Vogelhochzeit" */
class Vogelhochzeit
{ /** Den Refrain des Liedes ausgeben. */
private static void refrainAusgeben()
{ System.out.println( "Fi-di-ra-la-la, fi-di-ra-la-la, fi-di-ra-la-la-la-la!" ); }
/** Den Text des Liedes ausgeben. */
public static void ausgeben()
{ System.out.println( "Ein Vogel wollte Hochzeit machen, in dem gruenen Walde." );
refrainAusgeben();
System.out.println( "Die Drossel war der Braeutigam, die Amsel war die Braute." );
refrainAusgeben();
System.out.println( "Die Lerche, die Lerche, die fuehrt die Braut zur Kerche." );
refrainAusgeben(); }}
/** Testklient fuer Liedklassen */
public class Liedtest
{ /** Testklient fuer Liedklassen */
public static void main( String[] args )
{ AufEinemBaumEinKuckuckSass.ausgeben();
Vogelhochzeit.ausgeben(); }}System.outAuf einem Baum ein Kuckuck, -
Sim sa la dim, bam ba,
Sa la du, sa la dim -
Auf einem Baum ein Kuckuck sass.
Da kam ein junger Jaeger, -
Sim sa la dim, bam ba,
Sa la du, sa la dim -
Da kam ein junger Jaegersmann.
Der schoss den armen Kuckuck, -
Sim sa la dim, bam ba,
Sa la du, sa la dim -
Der schoss den armen Kuckuck tot.
Ein Vogel wollte Hochzeit machen, in dem gruenen Walde.
Fi-di-ra-la-la, fi-di-ra-la-la, fi-di-ra-la-la-la-la!
Die Drossel war der Braeutigam, die Amsel war die Braute.
Fi-di-ra-la-la, fi-di-ra-la-la, fi-di-ra-la-la-la-la!
Die Lerche, die Lerche, die fuehrt die Braut zur Kerche.
Fi-di-ra-la-la, fi-di-ra-la-la, fi-di-ra-la-la-la-la!
In der Methode "main" wird zunächst die Methode "AufEinemBaumEinKuckuckSass.ausgeben" aufgerufen. Man sagt auch, daß der Klasse "AufEinemBaumEinKuckuckSass" die Nachricht "ausgeben()" geschickt werde. Dieselbe Nachricht wird in der nächsten Anweisung an eine andere Klasse geschickt und hat dann auch eine andere Wirkung.
Namen von Klassen sollten Hauptwörter (Nomen) oder kurze Nominalphrasen sein, die mit einem großen Buchstaben anfangen und in denen der Anfangsbuchstabe jedes weiteren Wortes groß geschrieben wird und sonst kleine Buchstaben verwendet werden.
In Java darf nur eine öffentliche Klasse pro Übersetzungseinheit (Quelldatei) deklariert werden. Die Klasse mit der Methode "main" muß öffentlich sein, da diese Methode von der Javamaschine, also von außen, aufgerufen werden kann. „Öffentlich“ bedeutet daß solch ein Aufruf einer Methode von einer Entität außerhalb der Übersetzungseinheit möglich ist: Dazu müssen die Klasse und die Methode beide öffentlich sein. Der Name der Datei mit der Übersetzungseinheit muß der Name der öffentlichen Klasse mit der Erweiterung ".java" sein.
Bei nicht-öffentlichen Klassen, die nicht selber in anderen Klassen enthalten sind, braucht und darf kein Klassenmodifizierer "private" geschrieben werden. Dieser ist aber nötig, wenn es sich um Klassen handelt, die innerhalb einer anderen Klasse deklariert werden (falls die inneren Klassen privat sein sollen). Die beiden Klassen für Lieder dürfen aber hier ohnehin nicht innerhalb der Klasse "Lieder" deklariert werden, weil sie dann keine statischen Methoden haben dürfen (Kenntnisse über andere Methoden werden in dieser Lektion noch nicht vorausgesetzt).
Die beiden anderen Klassen sind nicht öffentlich. Das ist auch nicht nötig, weil ihre Methoden nur aus derselben Übersetzungseinheit aufgerufen werden.
In der Übersetzungseinheit stehen Klassendeklarationen mit Methodendeklarationen und kleine Klassen oder Methoden, dennoch nennt man—nicht ganz genau—eine Klassendeklaration oder eine Methodendeklaration oft einfach nur eine „Klasse“ oder eine „Methode“, wenn keine Mißverständnisse zu befürchten sind.
Auch vor Klassendeklarationen sollte—wie vor Methodendeklarationen—jeweils ein Dokumentationskommentar stehen, der die deklarierte Entität beschreibt. Im Falle der hier vorgestellten Übersetzungseinheit wird unter normalen Umständen aber nur die öffentliche Methode "main" der öffentlichen Klasse "Liedtest" in die erzeugte Dokumentation aufgenommen, weil nur sie öffentlich ist und damit zur von außen verwendbaren Schnittstelle der Übersetzungseinheit gehört.
Liedtest [Dokumentation]Class Liedtest: Testklient fuer Liedklassen
main
public static void main( java.lang.String[] args )
Testklient fuer Liedklassen
Übungsaufgaben
- Liedklassen erweitern
- Erweitern Sie die Klasse "AufEinemBaumEinKuckuckSass" und die Klasse "Vogelhochzeit" um jeweils eine Methode "nameAusgeben", die den Namen des jeweiligen Liedes ausgibt. Die schon vorhandenen Methoden dieser beiden Klassen dürfen dabei nicht verändert werden. Rufen Sie diese Methoden in sinnvoller Weise in der Hauptmethode "main" auf.
- Grußklassen deklarieren
- Schreiben Sie eine Übersetzungseinheit mit einer Klasse "Englisch" und einer Klasse "Deutsch", die jeweils eine Methode "printHello" enthalten. Die Methode "printHello" der Klasse "Englisch" soll eine Begrüßung auf Englisch (z.B., den Text "Hello!") ausgeben, die Methode "printHello" der Klasse "Deutsch" soll eine Begrüßung auf Deutsch (z.B., den Text "Hallo!") ausgeben. Schreiben Sie eine Hauptmethode in einer weiteren öffentlichen Klasse dazu, die den beiden zuvor deklarierten Klassen jeweils die Nachricht "printHello" schickt und so einen Gruß auf Deutsch und einen Gruß auf Englisch ausgibt.