Grundstruktur eines Java-Programms

Wie alle Programmiersprachen, so regelt auch Java seine formale Syntax sehr genau. Wenn auch einige Freiheiten gegeben sind, so folgen alle Java-Programme dennoch einem Aufbau, der teils strikt vorgegeben, teils in den Codeconventions geregelt ist und teilweise sich einfach nur als sinnvoll erwiesen hat.
Das hier angeführte Beispiel entspricht der gängigen Grundstruktur eines Java-Programms, die jedoch, etwa durch Einfügen von inneren Klassen, deutlich umfangreicher und komplexer gestaltet sein kann.

In Java befindet sich der gesamte Quelltext fast vollständig innerhalb von Klassen. Ausnahmen hiervon sind nur Kommentare, package-Angaben und import-Anweisungen. Als public deklarierte Klassen müssen zudem in Dateien liegen, deren Namen identisch mit dem Klassennamen sind. Die Klasse public class HalloWelt muss sich also in einer Datei mit dem Namen HalloWelt.java befinden.
Klassennamen und somit auch Dateinamen, werden mit großem Anfangsbuchstaben geschrieben. In einer Datei dürfen die Deklarationen mehrerer Klassen stehen, von denen jedoch nur eine public sein darf.

Die Klassennamen folgen den allgemeinen Vorschriften für alle in Java gebräuchlichen Bezeichner. Sie dürfen alle alphanumerische ASCII-Zeichen enthalten, jedoch keine Sonderzeichen außer dem Unterstrich und müssen mit einem Buchstaben beginnen. Die in anderen Programmiersprachen häufige Verwendung des Unterstriches ist in Java eher unüblich und wird hier fast nur innerhalb der in durchgängiger Großschrift geschriebenen Bezeichner von static final deklarierten Variablen verwendet. Statt dessen wird für Klassenbezeichner, Variablennamen, etc. von Oracle die CamelCase-Schreibweise empfohlen. Näheres hierzu im Artikel zu den Code-Konventionen.
Implementiert die Klasse ein oder mehrere Interfaces, so werden deren Bezeichner mit vorangestelltem Schlüsselwort implements direkt nach dem Klassenbezeichner notiert.

package de.javabeginners.demo;

// hier nicht benötigt, nur zur Demonstration
// import javax.swing.ImageIcon;

/**
 * Die Klasse dient zur Ausgabe von "Hallo Welt"
 */
public class HalloWelt {

    public HalloWelt() {}
    
    public static void main(String[] args){
        gibAus();
    }
    
    public static void gibAus() {
        System.out.println("Hallo Welt!");
    }
}

Das Wort public vor dem Schlüsselwort class ist ein sog. Zugriffsmodifizierer, der in diesem Zusammenhang zunächst überflüssig ist und sogar weggelassen werden könnte. Der Körper der Klasse, ihr 'Inhalt' befindet sich in einem sog. Block, einem durch geschweifte Klammern ({...}) begrenzten Abschnitt. Blöcke stellen Bereiche dar, die u.a. die Gültigkeit von Variablen regulieren und Quelltextabschnitte zusammenfassen und gliedern.

Die Klasse enthält drei Methoden, den Konstruktor, die main()-Methode und eine Methode gibAus(), die lediglich einen Text auf der Konsole ausgibt.
Die Reihenfolge der Anordnung dieser Elemente innerhalb des Klassenblockes ist irrelevant und muss insbesondere nicht der Ausführungsreihenfolge entsprechen, da der Compiler, ausgehend von main(), die Laufzeitreihenfolge selbst ermittelt. Javas Code-Konventionen geben jedoch eine Reihenfolge vor, die im gleichnamigen Artikel aufgezeigt werden.

Die Methode gibAus() stellt ein Beispiel für eine, je nach Bedarf und Zweck, frei definierte Methode dar, von der eine beliebige Anzahl in einer Klasse enthalten sein darf. Allerdings müssen sich Methoden immer in ihrer sog. Signatur unterscheiden, da der Compiler die Methoden hieran dem jeweiligen Aufruf zuordnet. Die Signatur ist der eindeutige, klein geschriebene Methoden-Bezeichner mit der folgenden in runde Klammern gefassten, hier leeren Parameterliste.

Die main()-Methode ist immer die erste Methode, die in einem Programm ausgeführt wird. Sie wird nie im Quelltext direkt aufgerufen und besitzt immer den Methodenkopf public static void main(String[] args) und einen Methodenblock, der hier lediglich den Aufruf von gibAus() enthält.
Jedes Programm, das natürlich aus vielen Klassen/Dateien bestehen kann, muss eine Klasse mit einer main()-Methode enthalten. In ihr werden dann weitere Initialisierungen vorgenommen, weitere Methoden aufgerufen, etc. Mehrere main()-Methoden innerhalb einer Klasse sind in jedem Falle unzulässig.1

Der Konstruktor ist eine spezielle Methode, die der Objektbildung dient und in dem der Anfangszustand des Objektes festgelegt wird. Auch der Konstruktor ist hier nur zu Demonstrationszwecken angeführt, da er im vorliegenden Falle leer ist und ein solcher sog. Standard-Konstruktor bei Nicht-Existenz zur Kompilierzeit vom Compiler automatisch erzeugt wird. Ein Konstruktor ist meist als public deklariert und besteht darüber hinaus nur aus dem Klassennamen und einer in runde Klammern gefassten Parameterliste. Eine Klasse kann mehrere Konstruktoren enthalten, die sich dann jedoch in ihren Parameterlisten unterscheiden müssen. Konstruktoren werden nie direkt, sondern immer mit vorangestelltem Schlüsselwort new aufgerufen.

1) Ein Eclipse-Projekt kann übrigens mehrere Programme und somit auch mehrere Klassen mit main()-Methoden enthalten.