EMZETT.
Login

void main

Kurz: Der feste Einstiegspunkt jedes ausführbaren Java-Programms — die JVM sucht beim Start genau diese Methodensignatur, um loszulegen.

Genauer: Die exakte Signatur ist vorgeschrieben: public static void main(String[] args). static, weil die Methode ohne vorher ein Objekt zu erzeugen aufgerufen werden muss; String[] args nimmt Kommandozeilenargumente entgegen, die dem Programm beim Start übergeben wurden.

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

Im Detail

public class Programm {
    public static void main(String[] args) {
        if (args.length > 0) {
            System.out.println("Erstes Argument: " + args[0]);
        }
        System.out.println("Hallo Welt");
    }
}
// Aufruf über die Kommandozeile mit Argumenten:
// java Programm hallo welt
// -> args = {"hallo", "welt"}

Jeder Teil der Signatur public static void main(String[] args) hat einen zwingenden Grund: public, damit die JVM (die selbst außerhalb der Klasse steht) die Methode überhaupt aufrufen darf. static, weil beim Programmstart noch KEIN Objekt der Klasse existiert — die JVM kann also keine Instanzmethode aufrufen, nur eine statische, klassengebundene. void, weil die Methode keinen Rückgabewert an die JVM liefert (das Programm signalisiert Erfolg/Fehler stattdessen über den Exit-Code via System.exit(code), nicht über return). String[] args nimmt schließlich alle Kommandozeilenargumente entgegen, mit denen das Programm gestartet wurde — bei java Programm hallo welt enthält args die beiden Strings "hallo" und "welt", der Programmname selbst ist NICHT Teil von args.

Eine einzelne Klasse kann durchaus mehrere main-Methoden mit unterschiedlichen Parametern enthalten (Overloading) — die JVM ruft beim Programmstart aber ausschließlich die EXAKTE Signatur public static void main(String[] args) auf, alle anderen wären nur normale, manuell aufrufbare Methoden. Seit Java 21 gibt es zusätzlich experimentell eine vereinfachte Einstiegspunkt-Syntax ohne umschließende Klasse und ohne public static/args, gedacht für kleine Lern-/Scriptprogramme.

Siehe auch: void, Modifiers, Classes