Ich habe eine Datei Test.java
und den folgenden Code darin.
public class Abcd
{
//some code here
}
Jetzt wird die Klasse nicht kompiliert, aber wenn ich den public
Modifikator entferne , wird sie gut kompiliert.
Was ist der Grund für Java, der es uns ermöglicht, einen Klassennamen zu kompilieren, der sich vom Dateinamen unterscheidet, wenn er nicht öffentlich ist?
Ich weiß, dass es sich um eine Anfängerfrage handelt, aber ich kann keine gute Erklärung finden.
Antworten:
Das Grundprinzip besteht darin, mehr als eine Klasse der obersten Ebene pro
.java
Datei zuzulassen .Viele Klassen - wie z. B. Ereignis-Listener - sind nur von lokalem Nutzen, und die frühesten Versionen von Java unterstützten keine verschachtelten Klassen. Ohne diese Lockerung der Regel "Dateiname = Klassenname" hätte jede dieser Klassen ihre eigene Datei benötigt, mit dem unvermeidlichen Ergebnis einer endlosen Verbreitung kleiner
.java
Dateien und der Streuung eng gekoppelten Codes.Sobald Java verschachtelte Klassen einführte, nahm die Bedeutung dieser Regel erheblich ab. Heute können Sie viele hundert Java-Dateien durchgehen, ohne auf eine zu stoßen, die diese Vorteile nutzt.
quelle
Der Grund ist der gleiche wie für die Türschilder. Wenn eine Person offiziell im Büro wohnt (für öffentlich erklärt), muss ihr Name auf dem Türschild stehen. Wie "Alex Jones" oder "Detective Colombo". Wenn jemand nur den Raum besucht, mit einem Beamten spricht oder den Boden putzt, muss sein Name nicht offiziell an der Tür angebracht werden. Stattdessen kann an der Tür "Dienstprogramme" oder "Besprechungsraum" angezeigt werden.
quelle
Die Java-Spezifikation besagt, dass Sie höchstens eine öffentliche Klasse pro Datei haben können. In diesem Fall sollte der Klassenname mit dem Dateinamen übereinstimmen. Alle nicht öffentlichen Klassen dürfen unabhängig vom Dateinamen einen beliebigen Namen haben.
quelle
Ich denke, sie zuzulassen ist eine Voraussetzung für verschachtelte Klassen. Insbesondere anonyme Klassen reduzieren die Anzahl der erforderlichen Java-Dateien erheblich. Ohne Unterstützung dafür würden Sie viele Implementierungen von Schnittstellen für einzelne Methoden in ihren eigenen separaten Dateien von der Hauptklasse benötigen, in der sie verwendet werden. (Ich denke insbesondere an Action-Listener.)
Eine gute Erklärung aller verschachtelten Klassen finden Sie im Java-Lernprogramm für verschachtelte Klassen auf der Oracle-Website, das Beispiele für jede Klasse enthält . Es hat auch einen Grund, warum sie nützlich sind, den ich zitieren werde:
(Hervorhebung von mir)
Ich bin mit Java-Spezifikationen in den frühen Tagen nicht vertraut, aber eine schnelle Suche zeigt, dass innere Klassen in Java 1.1 hinzugefügt wurden.
quelle
Ich sehe es umgekehrt. Der natürliche Zustand wäre, dass der Programmierer sowohl den Klassennamen als auch den Dateinamen unabhängig voneinander auswählt. Wahrscheinlich, um das Auffinden öffentlicher Klassen von außerhalb eines Pakets während der Kompilierung zu vereinfachen, gibt es eine besondere Einschränkung, dass sich eine öffentliche Klasse in einer Datei mit dem entsprechenden Namen befindet.
quelle
Beachten Sie, dass bei Java zwischen Groß- und Kleinschreibung unterschieden wird, das Dateisystem jedoch nicht. Wenn der Basisname der Datei "abcd" lautet, die Klasse jedoch "Abcd", entspricht dies der Regel in einem Dateisystem, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird? Sicherlich nicht, wenn auf eine Groß- und Kleinschreibung portiert wird.
Oder nehmen wir an, Sie haben zufällig eine Klasse namens ABCD und eine Klasse Abcd (lassen Sie uns nicht darauf eingehen, dass dies eine schlechte Idee ist: Es könnte passieren), und das Programm wird auf ein Dateisystem portiert, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird. Jetzt müssen Sie nicht nur Dateien, sondern auch Klassen umbenennen, oops!
Oder was ist, wenn keine Datei vorhanden ist? Angenommen, Sie haben einen Java-Compiler, der Eingaben für Standardeingaben vornehmen kann. Also muss die Klasse "StandardInput" heißen?
Wenn Sie rational untersuchen, welche Auswirkungen es hat, dass Dateinamen Klassennamen folgen müssen, werden Sie feststellen, dass dies in mehrfacher Hinsicht eine schlechte Idee ist.
quelle
Foo
erklärt wurde, die KennungenFOO
,foo
,fOo
usw. alle „nicht definiert“ werden würde , selbst wenn sie innerhalb der äußeren Bereiche vorhanden waren . Ein solches Design würde das Problem der Groß- und Kleinschreibung für Dateinamen beseitigen.Ein weiterer Punkt, auf den viele Antworten nicht hingewiesen haben, ist, dass
public
die JVM ohne die Deklaration niemals wissen würde, welche Hauptmethode der Klassen aufgerufen werden muss. Alle in einer Java-Datei deklarierten Klassen können Hauptmethoden haben, die Hauptmethode wird jedoch nur für die als öffentlich gekennzeichnete Klasse ausgeführt. HTHquelle
Da eine Java-Datei mehr als eine Klasse enthalten kann, kann sie zwei Klassen in einer Java-Datei enthalten. Eine Java-Datei muss jedoch eine Klasse mit demselben Namen wie der Dateiname enthalten, wenn sie eine öffentliche Klasse enthält.
quelle