¿Por qué un archivo Java debe tener el mismo nombre que su clase pública?

Posible duplicado:
¿Por qué el nombre de archivo en Java debe ser el mismo que el nombre de clase?

Tengo un archivo llamado temp.java . Escribí el siguiente código. ¿Por qué funciona esto?

 class demo //not public keyword and not same as filename { public static void main(String []args) { System.out.println("this is Main method"); } } 

¿Por qué no funciona esto?

 public class demo { public static void main(String []args) { System.out.println("this is Main method"); } } 

En su primer ejemplo, su clase en realidad se declara como “paquete privado” (sin modificadores), lo que significa que solo las clases dentro del mismo paquete pueden acceder a él. En su segundo ejemplo, lo ha declarado como público.

Este es un escenario donde el comstackdor se ha reunido bastante bien con el JLS.

Los estados JLS:

Cuando los paquetes se almacenan en un sistema de archivos (§7.2.1), el sistema host puede optar por imponer la restricción de que es un error en tiempo de comstackción si no se encuentra un tipo en un archivo con un nombre compuesto por el nombre de tipo más una extensión (como .java o .jav) si cualquiera de los siguientes es verdadero:

  • El tipo se refiere a código en otras unidades de comstackción del paquete en el que se declara el tipo.
  • El tipo se declara público (y, por lo tanto, es potencialmente accesible desde el código en otros paquetes).

Esta restricción implica que debe haber como máximo uno de esos tipos por unidad de comstackción. Esta restricción hace que sea fácil para un comstackdor del lenguaje de progtwigción Java o una implementación de la máquina virtual Java encontrar una clase nombrada dentro de un paquete; por ejemplo, el código fuente de un tipo público wet.sprocket.Toad se encontraría en un archivo Toad.java en el directorio wet / sprocket, y el código objeto correspondiente se encontraría en el archivo Toad.class en el mismo directorio.

Lo que esto significa es, para el escenario 1, que debido a que solo tiene temp.java con la demo clase privada del paquete, no se hace referencia al código en ninguna otra unidad de comstackción del paquete, por lo tanto se comstackrá sin problemas.

Su segundo escenario ha declarado que la clase es pública, lo que significa que es potencialmente accesible desde el código en otros paquetes, por lo que debe cumplir con los estándares de que el nombre de clase es igual al nombre del archivo.

Si creó otra clase en su primer escenario (dentro del mismo paquete) y luego trató de hacer referencia a la demo la clase, debería obtener un error de comstackción.