2012-05-04 23 views
17

Duplicar posible:
Why filename in java should be same as class name?¿Por qué un archivo Java debe tener el mismo nombre que su clase pública?

he llamado un archivo 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é esto no funciona?

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

¡Porque es la * ley *! –

+0

Mire el siguiente enlace http://wiki.answers.com/Q/Why_do_file_name_and_class_name_always_coincide_in_Java –

+1

¿Cómo se marca esta pregunta como duplicada sin un enlace al dup? ¿Es esto un legado de magia de 2012? – Zsw

Respuesta

21

En el primer ejemplo, la clase es en realidad declarados como "paquete privado" (sin modificadores), lo que significa que sólo las clases dentro del mismo paquete pueden acceder a ella. En su segundo ejemplo, lo ha declarado como público.

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

The JLS states:

Cuando los paquetes se almacenan en un sistema de archivos (§7.2.1), el sistema anfitrión puede elegir para hacer cumplir la restricción de que se trata de un error en tiempo de compilación si un tipo no se encuentra en un archivo con un nombre compuesto del nombre del tipo más una extensión (tal como .java o .jav) si cualquiera de lo siguiente es cierto:

  • el tipo se conoce por el código en otras unidades de compilación del paquete en que el tipo es declarado.
  • 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 un tipo de este tipo por unidad de compilación. Esta restricción hace que sea fácil para un compilador del lenguaje de programació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 del objeto correspondiente se encontraría en el archivo Toad.class en el mismo directorio.

Lo que esto significa es, para el escenario 1, que ya que sólo tiene temp.java con el paquete de clase privada demo, no se lo que se refiere al código en cualquier otra unidad de compilación del paquete, por lo tanto, se compilará sin problemas .

Su segundo escenario ha declarado que la clase es pública, lo que significa que es potencialmente accesible desde 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 intentó hacer referencia a la clase demo, debería obtener un error de compilación.

Cuestiones relacionadas