significa - maquina virtual de java wikipedia
¿Por qué Java nos permite compilar una clase con un nombre diferente al nombre del archivo? (8)
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 usan. (Estoy pensando en los oyentes de acción en particular)
Hay una buena explicación de todas las clases anidadas en el tutorial de Nested Classes Java en el sitio web de Oracle, que tiene ejemplos de cada una. También tiene una razón por la cual son útiles, que citaré:
¿Por qué usar clases anidadas?
Las razones convincentes para usar clases anidadas incluyen lo siguiente:
Es una forma de agrupar lógicamente clases que solo se usan en un solo lugar : si una clase es útil solo para otra clase, entonces es lógico incluirla en esa clase y mantener las dos juntas. Anidar tales "clases de ayuda" hace que su paquete sea más eficiente.
Aumenta la encapsulación : Considere dos clases de nivel superior, A y B, donde B necesita acceso a los miembros de A que, de lo contrario, serían declarados privados. Al ocultar la clase B dentro de la clase A, los miembros de A pueden declararse privados y B puede acceder a ellos. Además, B puede ocultarse del mundo exterior.
Puede conducir a un código más legible y mantenible : anidar pequeñas clases dentro de las clases de nivel superior coloca el código más cerca de donde se usa.
(énfasis mío)
No estoy familiarizado con las especificaciones de Java en los primeros días, pero una búsqueda rápida muestra que las clases internas se agregaron en Java 1.1.
Tengo un archivo Test.java
y el siguiente código dentro de él.
public class Abcd
{
//some code here
}
Ahora la clase no compila, pero cuando elimino el modificador public
, 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 principiantes, pero no puedo encontrar una buena explicación.
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 nombre del archivo si contiene una clase pública.
La especificación de 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.
La razón es la misma que para las placas de la puerta. Si una 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 simplemente visita la sala, habla con un funcionario o limpia el piso, su nombre no tiene que ser oficialmente puesto en la puerta. En cambio, la puerta puede leer "Utilidades" o "Sala de reuniones".
La razón es permitir más de una clase de nivel superior por archivo .java
.
Muchas clases, como los detectores de eventos, son de uso local únicamente 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 tales clases habrían requerido su propio archivo, con el resultado inevitable de la proliferación interminable de pequeños archivos .java
y la dispersión del código estrechamente acoplado.
Tan pronto como Java introdujo las clases anidadas, la importancia de esta regla disminuyó significativamente. Hoy puede ir a través de muchos cientos de archivos Java, sin tener que recurrir a uno que lo aproveche.
Lo veo al revés. El estado natural de las cosas sería que el programador elija tanto el nombre de clase como el nombre de 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 para que una clase pública esté en un archivo con el nombre correspondiente.
También otro punto que muchas respuestas no mencionaron es que sin la declaración public
, la JVM nunca sabría qué método principal de las clases necesita invocarse. Todas las clases declaradas en un archivo .java pueden tener todos los métodos principales, pero el método principal se ejecuta solo en la clase marcada como pública. HTH
Tenga en cuenta que Java distingue entre mayúsculas y minúsculas, pero el sistema de archivos no tiene que ser así. Si el nombre base del archivo es "abcd", pero la clase es "Abcd", ¿se conformaría con la regla sobre un sistema de archivos insensible a mayúsculas y minúsculas? Ciertamente, no cuando se transporta a una sensible a mayúsculas y minúsculas.
O supongamos que tiene una clase llamada ABCD, y una clase Abcd (no entremos en que es una mala idea: podría suceder) y el programa se traslada 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 entrada en la entrada estándar. Entonces, ¿la clase debe llamarse "StandardInput"?
Si explora racionalmente las implicaciones de exigir que los nombres de archivo sigan los nombres de las clases, encontrará que es una mala idea en más de una forma.