2011-10-03 20 views
5

Bien, entonces un archivo fuente java debe tener tener al menos una clase pública y el archivo debe llamarse "nombre-clase.java". Lo suficientemente justo.compilación Java de un archivo .java sin una clase pública

Por lo tanto, si tengo una clase, entonces la compile los siguientes:

public class HelloWorld { 
    public static void main(String[] args) { 
     System.out.println("Hello World!"); // Display the string. 
    } 
} 

Pero lo que me molesta es que si se quita el modificador de acceso 'público' en el código anterior, el código todavía compila. Simplemente no entiendo. Retirarlo, el código es el siguiente:

class HelloWorld { 
    public static void main(String[] args) { 
     System.out.println("Hello World!"); // Display the string. 
    } 
} 

En el código anterior, ya que me quita el modificador de acceso 'público', mi clase tiene por defecto o paquete de acceso privado, es decir, no se puede acceder desde el mundo exterior , solo desde dentro del paquete.

Así que mi pregunta es, ¿cómo se compila el código anterior? El archivo HelloWorld.java en este caso no tiene una clase 'pública' HelloWorld (solo un paquete-privado HelloWorld.class) y, por lo tanto, a mi entender no debería compilarse.

¡Aprecie su tiempo respondiendo mis preguntas!

cordiales, anon

+0

* "archivos fuente de Java debe tener al menos una clase pública" * Uh no, [que no necesitan tener nada en absoluto.] (Http://stackoverflow.com/q/7791487/1134080) – ADTC

Respuesta

1

Puede colocar clase no pública en un archivo, y no es un error, sino característica.

Tu problema es el nivel de empaque, no de compilar. Porque se puede compilar este archivo con la clase no pública, pero no se puede llamar desde el exterior, por lo que no está funcionando como clase base de la aplicación

De esta manera:

// [+] single file: SomeWrapper.java 

public class SomeWrapper { 
    ArrayList<_PrivateDataType> pdt; 
} 
// [-] single file: SomeWrapper.java 

// [+] single file: _PrivateDataType.java 
class _PrivateDataType { 
    // members, functions, whatever goes here 
} 

// [-] single file: _PrivateDataType.java 
+0

Gracias , pero mi punto es no agregar un tipo de datos privado ni nada. Mi pregunta es cómo compila el código anterior y/work, ya que aquí tengo un archivo .java, pero sin ninguna clase pública dentro de él. La única clase dentro de ella es una clase privada de paquete, no una clase pública. – anon1981

+0

¿Y dónde está el problema? Puede crear otra clase en el mismo paquete (con el mismo efecto) y usar esa clase package-private. –

+0

Una vez más, mi pregunta es no agregar ninguna clase nueva dentro del archivo. Solo me preocupa el acceso privado al paquete. – anon1981

6

un archivo fuente de Java debe tener al menos una clase pública y el archivo debe llamarse class-name.java

Incorrecto, una clase de nivel superior no tiene que declararse pública. Los estados JLS;

Si una clase de nivel superior o tipo de interfaz no se declara pública, solo se podrá acceder a ella desde el paquete en el que se declara.

Ver http://java.sun.com/docs/books/jls/second_edition/html/names.doc.html#104285 sección 6.6.1.

+0

¡Gracias! Entonces, ¿estás diciendo que quien llama a main() lo llama desde algún tipo de contexto de paquete? Es decir, la persona que llama (la JVM supuestamente) que llama a main() está en el mismo paquete que mi clase HelloWorld. ¡Simplemente confundido! Así que gracias por tomarse el tiempo para responder mis preguntas. – anon1981

+0

Además, puede definir múltiples clases no públicas en un archivo java. –

+0

Así que ahora mi pregunta es: HelloWorld es una clase privada de paquete dentro de la clase predeterminada, ¿estoy bien? Por lo tanto, debe ser accesible desde el paquete predeterminado pero no desde fuera del paquete predeterminado, ¿verdad? Por lo tanto, deduciendo más, cuando se llama a main(), se debe llamar desde * dentro * del paquete predeterminado, ¿estoy en lo cierto? O bien, quien llame a main() está dentro del mismo paquete que la clase HelloWorld. Correcto ? – anon1981

-1

Cuando no especifica el modificador de acceso de la clase (o su campo o método), se le asigna acceso "predeterminado". Esto significa que solo es accesible desde el mismo paquete (en este caso, el paquete predeterminado).

El sitio web Javabeginner.com tiene un artículo sobre el tema: debe familiarizarse con los modificadores de acceso en Java, ya sea desde este sitio, u otros.

1

Un método principal es como cualquier otro método. La única diferencia es que puede invocarse desde la línea de comando con el comando java. Incluso si el método principal no es visible desde la línea de comandos, la clase todavía se puede usar como cualquier otra clase de Java, y su clase principal puede ser invocada por otra clase en el mismo paquete. Por lo tanto, tiene sentido que compila.

En la función principal de Java no son especiales en ningún sentido. Simplemente existe un comando de terminal que puede invocar métodos estáticos llamados main ...

+1

Así que ahora, la clase HelloWorld tiene accesibilidad de paquete privado. Por lo tanto, quien llame a main (¿JVM?) Ahora también tiene que estar dentro del mismo paquete, ¿verdad? – anon1981

+0

Llamé directamente de una clase de Java, entonces sí. Las reglas para la reflexión son, sin embargo, ligeramente diferentes. Con la reflexión, se puede invocar cualquier método no privado. La JVM usa la reflexión para invocar su método principal. –

1

eso no es nada de lo que preguntarse. Supongo que este comportamiento es similar al de algún compilador de C/C++.

Código como "void main() {/ ... /}" se compilará correctamente por los compiladores, aunque no es compatible con los estándares de código. Dicho simplemente, el compilador intercambia el "vacío" con "int".

Creo que el compilador de Java implementa un comportamiento similar.

Saludos, Xong

+0

Parece que estoy equivocado. =) – xong

1

Hay usos válidos para una clases no públicas. Entonces el compilador no da error cuando intenta compilar el archivo.

Cuestiones relacionadas