Java-Klasse und der Dateiname

Hallo.

Mir ist eben etwas aufgefallen und ich wollte nur mal fragen wieso das so ist. Und zwar muss der Dateiname ja der gleiche Name wie der Klassenname sein mit .java hintendran. Nun programmieren wir in der Berufsschule aber grad mit C und da ich Java problemlos beherrsche probiere ich Probleme erstmal in java aus und übersetze sie dann in C. Da ich nun allerdings weiß das nicht auf allen PC’s ein Java-Compiler drauf ist (Hauptsächlich die PC’s, die keine eigenen sind sondern sich auf nem Linux-Server anmelden und nur dort arbeiten) und ich mir unsicher bin ob auf meinem PC ein Java-Compiler ist wollte ich schonmal nen Online-Compiler vorbereiten. Und bei beiden gefundenen ist mir etwas aufgefallen:

Ist die Klasse so definiert:
public class XXX
Kommt ein Compiler-Fehler, das die Klasse in ner Datei sein muss, die den gleichen Namen hat da sie public ist. Und das hat mich dann irritiert. Wenn ich das public weglasse und sie so schreibe:
class XXX
Funktioniert alles Problemlos.

Also warum hat man nun diese Beschränkung nicht mehr? Dachte der Compiler braucht das um die Klassen wiederzufinden oder iwie sowas, ist schon was her das ich mich mit solchen Basics beschäftigt hab.

Das ist so festgelegt: Chapter 7. Packages

If and only if packages are stored in a file system (§7.2), the host system may choose to enforce the restriction that it is a compile-time error if a type is not found in a file under a name composed of the type name plus an extension (such as .java or .jav) if either of the following is true:

The type is referred to by code in other compilation units of the package in which the type is declared.

The type is declared public (and therefore is potentially accessible from code in other packages).

[quote=Darse]Kommt ein Compiler-Fehler, das die Klasse in ner Datei sein muss, die den gleichen Namen hat da sie public ist. Und das hat mich dann irritiert. Wenn ich das public weglasse und sie so schreibe:
class XXX
Funktioniert alles Problemlos.

Also warum hat man nun diese Beschränkung nicht mehr?[/quote]Ein Grund könnte sein, dass es prinzipiell erlaubt ist, mehrere nicht-public Klassen in einer Datei zu haben und und dass der Compiler schlicht nicht prüft, ob die nicht-public Klasse die einzige in der Datei ist.

bye
TT

Um welche Online-Compiler geht’s denn da?
Es könnte sein, dass die ihre eigene Infrastruktur um den dort eingegebenen Code drumrumbauen, die durch das (dann: anscheindn überflüssige) “public” durcheinanderkommt. Schließlich wird man bei so einem “Code-Eingabe-Formular” ja vermtlich nicht angeben, welcher Dateiname für den dort eingegebenen Code angenommen werden soll…

https://codepad.remoteinterview.io/ @Marco13

Bei dem compiler den du verlinkt hast steht eh in der compile output warum es nicht geht. Der service legt das ganze in einer Datei mit namen /temp/file.java ab und daher kann die “public class myCode” nicht kompiliert werden.
ändere den classname in "file2 nachdem du den compile error erhältst und es funktioniert dann. Vermutlich wird der filename aber nicht immer /temp/file.java sein sondern kann auch mal anders lauten

Ja, AmunRa hat recht und meine Vermutung bestätigt. (Wenn man die Klasse “public class file” nennt, geht es, aber das ist nur ein Seiteneffekt der besagten Compilerinfrastruktur)