Tengo un archivo Test.java
y el siguiente código dentro.
public class Abcd
{
//some code here
}
Ahora la clase no se compila, pero cuando elimino el public
modificador, se compila bien.
¿Cuál es el razonamiento detrás de Java que nos permite compilar un nombre de clase que es diferente del nombre del archivo cuando no es público?
Sé que es una pregunta para novatos, pero no puedo encontrar una buena explicación.
Respuestas:
La razón es permitir más de una clase de nivel superior por
.java
archivo.Muchas clases, como los oyentes de eventos, son solo de uso local y las primeras versiones de Java no admitían clases anidadas. Sin esta relajación de la regla "nombre de archivo = nombre de clase", todas y cada una de esas clases habrían requerido su propio archivo, con el resultado inevitable de la proliferación interminable de
.java
archivos pequeños y la dispersión de código estrechamente acoplado.Tan pronto como Java introdujo clases anidadas, la importancia de esta regla disminuyó significativamente. Hoy en día puede revisar cientos de archivos Java, sin cambiar nunca uno que lo aproveche.
fuente
La razón es la misma que para las placas de la puerta. Si alguna persona reside oficialmente en la oficina (declarada pública), su nombre debe estar en la etiqueta de la puerta. Como "Alex Jones" o "Detective Colombo". Si alguien visita la sala, habla con un funcionario o limpia el piso, su nombre no tiene que ponerse oficialmente en la puerta. En cambio, la puerta puede leer "Utilidades" o "Sala de reuniones".
fuente
La especificación Java establece que solo puede tener como máximo una clase pública por archivo. En este caso, el nombre de la clase debe coincidir con el nombre del archivo. Todas las clases no públicas pueden tener cualquier nombre, independientemente del nombre del archivo.
fuente
Creo que permitirlos es un requisito previo para las clases anidadas. Las clases anónimas, en particular, reducen drásticamente la cantidad de archivos .java necesarios. Sin soporte para esto, necesitaría muchas implementaciones de interfaz de método único en sus propios archivos separados de la clase principal en la que se utilizan. (Estoy pensando en los oyentes de acción en particular)
Hay una buena explicación de todas las clases anidadas en el tutorial Java Clases anidadas en el sitio web de Oracle, que tiene ejemplos de cada una. También tiene una razón por la que son útiles, que citaré:
(énfasis mío)
No estoy familiarizado con las especificaciones de Java en los primeros días, pero una búsqueda rápida muestra que se agregaron clases internas en Java 1.1.
fuente
Lo miro al revés. El estado natural de las cosas sería que el programador elija el nombre de la clase y el nombre del archivo de forma independiente. Probablemente para simplificar la búsqueda de clases públicas desde fuera de un paquete durante la compilación, existe una restricción especial de que una clase pública esté en un archivo con el nombre correspondiente.
fuente
Tenga en cuenta que Java distingue entre mayúsculas y minúsculas, pero el sistema de archivos no necesita serlo. Si el nombre base del archivo es "abcd", pero la clase es "Abcd", ¿se ajustaría a la regla en un sistema de archivos que no distingue entre mayúsculas y minúsculas? Ciertamente no cuando se transfiere a mayúsculas y minúsculas.
O supongamos que tiene una clase llamada ABCD, y una clase Abcd (no pensemos que es una mala idea: podría suceder) y el programa se transfiere a un sistema de archivos que no distingue entre mayúsculas y minúsculas. Ahora no solo tiene que cambiar el nombre de los archivos, sino también las clases, ¡vaya!
¿O qué pasa si no hay un archivo? Supongamos que tiene un compilador de Java que puede tomar datos de entrada estándar. Entonces, ¿la clase debe llamarse "StandardInput"?
Si explora racionalmente las implicaciones de requerir que los nombres de archivo sigan a los nombres de clase, encontrará que es una mala idea en más de una forma.
fuente
Foo
fue declarada, los identificadoresFOO
,foo
,fOo
, etc todos serían "indefinido", incluso si existieran dentro de los alcances exteriores. Tal diseño eliminaría el problema de mayúsculas y minúsculas para los nombres de archivo.También otro punto que muchas respuestas omitieron señalar es que sin la
public
declaración, la JVM nunca sabría qué método principal de las clases debe invocarse. Todas las clases declaradas en un archivo .java pueden tener métodos principales, pero el método principal se ejecuta solo en la clase marcada como pública. HTHfuente
Debido a que un archivo java puede contener más de una clase, puede tener dos clases en un archivo java. Pero un archivo Java debe contener una clase con el mismo nombre que el archivo si contiene una clase pública.
fuente