J'ai un fichier Test.java
et le code suivant à l'intérieur.
public class Abcd
{
//some code here
}
Maintenant, la classe ne compile pas, mais quand je supprime le public
modificateur, elle se compile correctement.
Quel est le raisonnement derrière Java qui nous permet de compiler un nom de classe différent du nom de fichier lorsqu'il n'est pas public.
Je sais que c'est une question pour les débutants, mais je ne suis pas en mesure de trouver une bonne explication.
Réponses:
Le raisonnement est d'autoriser plus d'une classe de premier niveau par
.java
fichier.De nombreuses classes, telles que les écouteurs d'événements, sont à usage local uniquement et les premières versions de Java ne prenaient pas en charge les classes imbriquées. Sans cet assouplissement de la règle "nom de fichier = nom de classe", chacune de ces classes aurait eu besoin de son propre fichier, avec le résultat inévitable d'une prolifération sans fin de petits
.java
fichiers et de la dispersion d'un code étroitement couplé.Dès que Java a introduit les classes imbriquées, l'importance de cette règle a considérablement diminué. Aujourd'hui, vous pouvez parcourir plusieurs centaines de fichiers Java, sans jamais en trouver un qui en profite.
la source
La raison est la même que pour les plaques de porte. Si une personne réside officiellement dans le bureau (déclaré public), son nom doit figurer sur l'étiquette de porte. Comme "Alex Jones" ou "Detective Colombo". Si quelqu'un visite simplement la pièce, parle à un fonctionnaire ou nettoie le sol, son nom n'a pas à être officiellement inscrit sur la porte. Au lieu de cela, la porte peut lire «Utilitaires» ou «Salle de réunion».
la source
La spécification Java stipule que vous ne pouvez avoir au plus qu'une classe publique par fichier. Dans ce cas, le nom de la classe doit correspondre au nom du fichier. Toutes les classes non publiques sont autorisées à avoir n'importe quel nom, quel que soit le nom du fichier.
la source
Je pense que les autoriser est une condition préalable aux classes imbriquées. Les classes anonymes en particulier réduisent considérablement le nombre de fichiers .java requis. Sans support pour cela, vous auriez besoin de beaucoup d'implémentations d'interface de méthode unique dans leurs propres fichiers séparés de la classe principale dans laquelle ils sont utilisés (je pense aux écouteurs d'action en particulier)
Il y a une bonne explication de toutes les classes imbriquées dans le didacticiel Java sur les classes imbriquées sur le site Web d'Oracle, qui contient des exemples de chacune. Cela a également une raison pour laquelle ils sont utiles, que je vais citer:
(c'est moi qui souligne)
Je ne suis pas familier avec les spécifications Java à l'époque, mais une recherche rapide montre que des classes internes ont été ajoutées dans Java 1.1.
la source
Je regarde les choses dans l'autre sens. L'état naturel des choses serait que le programmeur choisisse à la fois le nom de la classe et le nom du fichier indépendamment. Probablement afin de simplifier la recherche de classes publiques depuis l'extérieur d'un package lors de la compilation, il existe une restriction spéciale selon laquelle une classe publique se trouve dans un fichier avec le nom correspondant.
la source
Notez que Java est sensible à la casse, mais que le système de fichiers n'a pas besoin de l'être. Si le nom de base du fichier est "abcd", mais que la classe est "Abcd", cela serait-il conforme à la règle sur un système de fichiers insensible à la casse? Certainement pas lorsqu'il est porté sur un système sensible à la casse.
Ou supposons que vous ayez une classe appelée ABCD, et une classe Abcd (ne pensons pas que ce soit une mauvaise idée: cela pourrait arriver) et que le programme soit porté sur un système de fichiers insensible à la casse. Maintenant, vous devez non seulement renommer les fichiers, mais aussi les classes, oups!
Ou que faire s'il n'y a pas de fichier? Supposons que vous ayez un compilateur Java qui peut prendre une entrée sur une entrée standard. Alors la classe doit être nommée "StandardInput"?
Si vous explorez rationnellement les implications d'exiger que les noms de fichiers suivent les noms de classe, vous constaterez que c'est une mauvaise idée à plus d'un titre.
la source
Foo
été déclarés, les identifiantsFOO
,foo
,fOo
, etc. seraient tous « non défini » , même si elles existaient dans les champs extérieurs. Une telle conception éliminerait le problème de la sensibilité à la casse pour les noms de fichiers.Un autre point que beaucoup de réponses ont manqué de souligner est que sans la
public
déclaration, la JVM ne saurait jamais quelle méthode principale de classes doit être appelée. Toutes les classes déclarées dans un fichier .java peuvent toutes avoir des méthodes principales, mais la méthode principale n'est exécutée que sur la classe marquée comme publique. HTHla source
Étant donné qu'un fichier java peut contenir plus d'une classe, il peut avoir deux classes dans un seul fichier java. Mais un fichier java doit contenir une classe portant le même nom que le nom de fichier s'il contient une classe publique.
la source