2009-08-26 8 views

Respuesta

33

Los paquetes en Java no están anidados.

Cuando import java.awt.*, sólo se va a importar todas las clases e interfaces que están en el paquete java.awt - usted es no la importación de todos los paquetes que se encuentran bajo java.awt, como java.awt.event.

Aunque parece que los paquetes están anidados (es decir, parece que java.awt.event es un "subpaquete" de java.awt), este no es realmente el caso. Debe considerar java.awt y java.awt.event como dos paquetes diferentes, no relacionados que tienen una parte común en sus nombres.

+1

¿No es cierto que la importación de java.awt. * También importa java.awt.event automáticamente? –

+15

No, ese era el punto de Jesper. import java.awt. *; importa cada clase cuyo paquete es exactamente java.awt. No importa ninguna clase cuyo paquete simplemente comience con java.awt. – Sbodd

5

Los primeros únicos tipos de importación del paquete java.awt (pero no sus subpaquetes), y el otro solo importa de java.awt.event (pero no de ningún otro paquete).

Mientras que los paquetes en Java pueden (y deben) organizarse en una jerarquía, la instrucción de importación tiende a ser "conservadora": cuando importa todos los tipos desde ese paquete, solo obtiene aquellos específicamente en ese nivel, no en el nivel inferior en la jerarquía.

Creo que la razón detrás de esto es evitar las importaciones falsas. En general, es una buena idea importar lo menos posible, solo las necesidades básicas, evitar el acoplamiento, las dependencias y las ambigüedades (por ejemplo, qué sucede si se agrega una nueva clase al paquete con un nombre que entra en conflicto con un nombre en otro paquete?). Es por eso que si usa Eclipse para organizar sus importaciones, realmente agregará instrucciones de importación específicas dentro de la versión de asterisco, aunque eso signifique líneas adicionales. Importar todo en subpaquetes sería aún peor, realmente obtendrá todo.

Además, una práctica común es colocar clases de propósito especial y clases específicas de implementación, en sus propios subpaquetes. A menudo, específicamente desea evitar importarlos a menos que sea crucial. Nuevamente, importar todo el subárbol entraría en conflicto con eso.

0

java.awt.* es no una expresión regular, que es lo que creo que está esperando/pensando.

java.awt.* le dará solo las clases en ese paquete exacto, y no los paquetes anidados. ¡Imagínese las colisiones de nombres de espacios relacionados con abajo!

import com.* 

Debe tenerse en cuenta que se considera mala práctica utilizar *. Se prefieren las importaciones explícitas del nombre de la clase.

Para la lectura adicional: Wikipedia: Namespace (Computer Science)

+0

¿Se admite incluso la importación *? : -o – OscarRyz

+2

@Oscar Reyes: No, "importar *" no existe en Java. – Jesper

+0

de acuerdo, no funciona (lo que realmente me sorprende). Lo cambiaré para no confundir a nadie ... –

1

Como muchos han dicho antes.

import java.awt. * No importará ninguna clase en java.awt.event ...

Y la diferencia entre los dos es que el paquete java.awt.* incluye clases como Frame, Button, etc. y el paquete java.awt.event. * incluye todos los eventos/escuchas que pueden suceder.

Ejemplo, para crear un Botón necesitas la clase java.awt.Button pero si quieres que ocurra alguna acción al hacer clic en el Botón, necesitas un java.awt.event.ActionListener que "esperará" el haga clic, luego produzca un java.awt.event.ActionEvent.