Warum muss void main() public sein?

WurstCase

Neues Mitglied
Der Einstiegspunkt eines jeden Java-Programms ist in der Regel die statische Methode public static void main(). Auf die Frage, weshalb die Methode public sein muss, findet sich vielerorts die Antwort, dass die JVM die Methode "von außerhalb" sehen können muss, um sie aufzurufen. Nun kann eine main()-Methode aber beispielsweise auch in einer privaten inneren Klasse sein und wird dennoch von der JVM gefunden. Etwa so:
Java:
public class OuterClass {
    private static class InnerClass {
        public static void main(String args[]) {
            System.out.println("Hello!");
        }
    }
}
// Kompilieren: javac.exe OuterClass.java
// Ausführen: java.exe OuterClass$InnerClass
Dies wird in einem StackOverflow-Post damit erklärt, dass der JVM-Startup-Mechanismus die Access Modifier einfach ignoriert (https://stackoverflow.com/a/7634222/4391651). Ok, nur: Wenn der JVM-Startup den private-Access Modifier der inneren Klasse übergeht, dann könnte er das doch auch ebenso gut bei der main()-Methode machen. Hat da jemand eine Idee, warum sie dennoch public sein muss, außer dass es einfach im Standard so festgelegt wurde?
 

AndyJ

Bekanntes Mitglied
Ignorieren ist wohl der falsche Term. InnerClass ist private zu OuterClass. Allerdings ist OuterClass gar nicht noetig, um an InnerClass zu kommen: "A static nested class interacts with the instance members of its outer class (and other classes) just like any other top-level class. In effect, a static nested class is behaviorally a top-level class that has been nested in another top-level class for packaging convenience." Source: https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html
Ich interpretiere das so, dass der Accessmodifier hier einfach keine Wirkung hat. In deinem Fall wird ja noch nicht mal eine Instanz erzeugt, es wird nur einfach main aufgerufen und das ist ja auch static.

Die main-Methode muss so aussehen:
Code:
public static void main(String[] args)
einfach deshalb, weil es in der Spezification so bestimmt wurde: http://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.1.4

Vermutlich haette man das auch anders definieren koennen. Wenn du dir den Ouput von javac auf deinem Rechner ansiehst, dann findest du auch tatsaechlich zwei class-files, nicht nur eine, wie man meinen moechte.

Cheers,
Andy
 

WurstCase

Neues Mitglied
"A static nested class interacts with the instance members of its outer class (and other classes) just like any other top-level class. In effect, a static nested class is behaviorally a top-level class that has been nested in another top-level class for packaging convenience." Source: https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html
Ich interpretiere das so, dass der Accessmodifier hier einfach keine Wirkung hat.
Stimmt, dieser Abschnitt war mir eigentlich bekannt und hätte mich zu demselben Schluss bringen sollen. :) Das wird es wohl sein.

Vermutlich haette man das auch anders definieren koennen. Wenn du dir den Ouput von javac auf deinem Rechner ansiehst, dann findest du auch tatsaechlich zwei class-files, nicht nur eine, wie man meinen moechte.
Ja, stimmt. War mir auch aufgefallen, als ich das Beispiel kompiliert hatte.

Dann vielen Dank schon mal für eure Beiträge!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
berserkerdq2 SceneBuilder GUI erstellt, nun muss ich noch ein Polygon erstellen, ist die Connection möglich? Allgemeine Java-Themen 3
berserkerdq2 Wenn ich bei Intelij javafx mit maven importieren will, muss ich das in die pom.xml reintun, aber warum noch in module-info.java? Allgemeine Java-Themen 3
Calli11 Was muss ich hier in die Main schreiben, damit das Programm ausgeführt wird? Allgemeine Java-Themen 4
M wiviel Java muss ich für die Berufswelt können ? Allgemeine Java-Themen 5
Zrebna Wieviele Testfälle muss man hier schreiben? (Software Engineering) Allgemeine Java-Themen 13
R Methoden Was fehlt mir bzw. muss ich bei der Methode countHarshabNumbers ändern damit ich die Harshad Zahlen im Intervall [51, 79] zählen kann? Allgemeine Java-Themen 19
R Was muss ich ändern, damit der Kreis links unten gezeichnet wird? Allgemeine Java-Themen 17
Drachenbauer Wie muss ein Konstructor aussehen, um dinge mit verschiedenen Zusätzen in den "<>" anzunehmen? Allgemeine Java-Themen 1
S Validation Null aber nicht Blank und muss Email sein Allgemeine Java-Themen 22
T Was muss ich zu JSMPP bzw anderen Lösungen wissen? Allgemeine Java-Themen 0
Neumi5694 Vererbung Parameter muss 2 Bedingungen erfüllen Allgemeine Java-Themen 2
K Muss ich Eclipse und Java nochmal neu installieren? Allgemeine Java-Themen 10
X Generic muss zwei Klassen/Interfaces erfüllen Allgemeine Java-Themen 5
E Compiler-Fehler wie muss ich die entstandene Quellcode kompilieren?? Allgemeine Java-Themen 2
P Mail wird nicht gesendet - Muss ich kein PW angeben ? Allgemeine Java-Themen 13
D Muss eine JNI Biblio testen (MAC OS X) Allgemeine Java-Themen 4
X Will JAR Datei zum Download anbieten, worauf muss ich rechtlich achten? Allgemeine Java-Themen 2
J Applet in JAR packen - was muss in main() stehen? Allgemeine Java-Themen 12
B welchen port muss ich angeben? Allgemeine Java-Themen 11
J Erstes Programm bei Sourceforge: Was muss ich beachten? Allgemeine Java-Themen 18
C JAVA Anwendung - Was muss auf dem Server installiert sein? Allgemeine Java-Themen 6
G Threads werden nicht beendet. Was muss dahin? Allgemeine Java-Themen 12
G wer muss hier wen aufrufen? Allgemeine Java-Themen 7
M Wie kann man eine void Methode mit Variablen von zwei verschiedenen Objekten ausführen? Allgemeine Java-Themen 15
P Variablen Variable von void im ActionListener verwenden Allgemeine Java-Themen 3
S auf public void Methode zugreifen ohne static Allgemeine Java-Themen 11
M Variablen Variablenzugriff aus static void Allgemeine Java-Themen 21
D Frage zu der Methode void print(file File) Allgemeine Java-Themen 3
badfish Inerhalb der [void main] auf ein Objekt der [protected void] zugreifen Allgemeine Java-Themen 13
MQue public void serialEvent(SerialPortEvent event) Allgemeine Java-Themen 4
J Warum heißt es eig. "public static void main" ? Allgemeine Java-Themen 4
T public void init wird nicht aufgerufen Allgemeine Java-Themen 12
S public void actionPerformed Allgemeine Java-Themen 5
N this im public static void Allgemeine Java-Themen 3
P Fehler: Hauptklasse Main konnte nicht gefunden oder geladen werden Ursache: java.lang.ClassNotFoundException: Main Allgemeine Java-Themen 24
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
Encera Zweite Main-Methode zuschalten Allgemeine Java-Themen 18
Splayfer Problem: no main manifest attribute Allgemeine Java-Themen 3
M Keine weitere Eingabe in der Main möglich. Eventueller Ansatz über while. Allgemeine Java-Themen 8
F Konstante an main - Argumenten initialisieren Allgemeine Java-Themen 1
S Exception in thread "main" java.lang.NullPointerException at FamilienApp.main(FamilienApp.java:15) Allgemeine Java-Themen 1
F Was ist der Dateityp meines Parameters für die Main Methode. Allgemeine Java-Themen 6
E HILFE !! Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/io/FileUtils Allgemeine Java-Themen 4
B Übernommene Variablen(werte) aus der Main-Klasse ändern? Allgemeine Java-Themen 9
G Programm, das nach abgearbeiteter main Methode weiterläuft Allgemeine Java-Themen 72
javaerd Binomialkoeffizient ausrechnen, Exception in thread "main" java.lang.StackOverflowError Allgemeine Java-Themen 6
L sortiertes Array im main aufrufen klappt nicht. Allgemeine Java-Themen 3
Tort-E Manifest Main-Class Allgemeine Java-Themen 8
J Exception in thread "main" java.lang.NoClassDefFoundError Allgemeine Java-Themen 4
A main-class Not found Allgemeine Java-Themen 3
A Konstrukt ohne Main für Xml-Parser Allgemeine Java-Themen 1
P JDK installieren Error: Could not find or load main class HelloWorld.java Allgemeine Java-Themen 3
I JFrame Icon in Main übergeben Allgemeine Java-Themen 1
Phash Can't find Main Class Allgemeine Java-Themen 4
X Could not find the main class programm will exit (textdokument) Allgemeine Java-Themen 3
127.0.0.1 Subversion neues SVN Projekt, keine Main gefunden ?! Allgemeine Java-Themen 7
S Could not find the main class Allgemeine Java-Themen 7
B Mal wieder "Could not find the main class" Allgemeine Java-Themen 3
C Could not find the main class. Allgemeine Java-Themen 15
I Main wird nicht gefunden Allgemeine Java-Themen 3
B Threads Main Thread warten auf abgebrochen Task warten lassen Allgemeine Java-Themen 25
A Could not find main class: start Allgemeine Java-Themen 5
S main() class finden Allgemeine Java-Themen 7
hdi Could not find main class? Allgemeine Java-Themen 8
B Cannot find main-claas... Allgemeine Java-Themen 21
G jar Datei findet Main Class nicht... Allgemeine Java-Themen 2
P Java Editor Could not find the main class GUI. Programm will exit. Allgemeine Java-Themen 3
E Programm von Main Methode starten Allgemeine Java-Themen 9
BattleMaster246 Could not find the Main class Allgemeine Java-Themen 30
reibi Main-Class in Jarfile Allgemeine Java-Themen 3
G Hauptthread anhalten / Unterschied zwischen Main-Thread und dialogelement-Thread Allgemeine Java-Themen 2
N Probleme mit .jar 'Could not find main class' Allgemeine Java-Themen 3
N Exception in thread "main" java.lang.UnsatisfiedLinkError: no lwjgl in java.library.p Allgemeine Java-Themen 4
J Main-Thread soll auf alleKinder Threads warten Allgemeine Java-Themen 5
B Main Thread Status abrufen Allgemeine Java-Themen 4
N import com.sun.tools.javac.Main; Allgemeine Java-Themen 1
V main(...) aus Klasse in PDF starten? Allgemeine Java-Themen 3
B UML: Main classe verschwindet nach code generierung nicht?! Allgemeine Java-Themen 4
I Signatur von Main-Methoden? Allgemeine Java-Themen 29
T zu Beginn der main: Heap space ermitteln und hochsetzen Allgemeine Java-Themen 11
E beim Ende der main() das Programm nicht beenden Allgemeine Java-Themen 3
J Unicode: cmd parameter (main args); exec params; filenames Allgemeine Java-Themen 2
V Mehrere main() in jar, wie starten? Allgemeine Java-Themen 4
J Methode nicht ausführbar in main Allgemeine Java-Themen 7
P Kann .jar nicht ausführen - main class not found Allgemeine Java-Themen 6
B Jar File und die Main Klassen Allgemeine Java-Themen 3
M zwei main-Methoden Allgemeine Java-Themen 7
L static main - Spezifikation? Allgemeine Java-Themen 7
N Main-Klasse wird beim Aufruf des JARs nicht gefunden Allgemeine Java-Themen 8
J Exception in thread "main" java.lang.OutOfMemoryEr Allgemeine Java-Themen 26
G [JDK 6u2] - JAR Failed to load Main-Class manifest attribute Allgemeine Java-Themen 6
P Zugriff von Klasse 2 auf Klasse 1 (die main methode hat) Allgemeine Java-Themen 5
G Programm ohne Main Allgemeine Java-Themen 10
M Parameter an main übergeben aber wie? Allgemeine Java-Themen 4
J jar-Datei enthält keine Main-Class Allgemeine Java-Themen 22
C Mehrere main-Klassen in JAR Allgemeine Java-Themen 2
S Exception in Thread "main" java.lang.NoClassDef. b Allgemeine Java-Themen 2
G "Could not find the main class. Program will exit" Allgemeine Java-Themen 20
A Warum gibts die Main und was sollte drin stehen? Allgemeine Java-Themen 31
B Exception in thread "main" java.lang.NoClassDefFou Allgemeine Java-Themen 12

Ähnliche Java Themen

Neue Themen


Oben