2009-08-26 5 views

Répondre

33

Les packages en Java ne sont pas imbriqués.

Lorsque vous import java.awt.*, vous importez que toutes les classes et les interfaces qui sont dans le paquet java.awt - vous n'êtes pas importer tous les paquets qui sont sous java.awt, comme java.awt.event.

Même s'il semble que les paquets sont imbriqués (c'est-à-dire, il semble que java.awt.event soit un "sous-paquet" de java.awt), ce n'est pas vraiment le cas. Vous devriez considérer java.awt et java.awt.event comme deux paquets différents, sans rapport, qui ont une partie commune dans leurs noms.

+1

Est-il vrai que import java.awt. * Importe aussi java.awt.event? –

+15

Non - c'était le point de vue de Jesper. import java.awt. *; importe chaque classe dont le paquet est exactement java.awt. Il n'importe aucune classe dont le paquet commence simplement par java.awt. – Sbodd

5

La première importe uniquement les types à partir du package java.awt (mais pas ses sous-packages) et l'autre importe uniquement à partir de java.awt.event (mais pas à partir d'autres packages). Si les packages de Java peuvent (et doivent être) organisés dans une hiérarchie, l'instruction d'importation a tendance à être "conservative" - ​​lorsque vous importez tous les types de ce package, vous obtenez uniquement ceux qui sont spécifiques à ce niveau, et non au niveau inférieur dans la hiérarchie. Je pense que la logique qui sous-tend cette mesure est d'éviter les importations frauduleuses. C'est généralement une bonne idée d'importer le moins possible - juste le strict nécessaire, pour éviter le couplage, les dépendances et les ambiguïtés (par exemple, que se passe-t-il si une nouvelle classe est ajoutée au paquet avec un nom un autre paquet?). C'est pourquoi si vous utilisez Eclipse pour organiser vos importations, il ajoutera des instructions d'importation spécifiques à l'intérieur de la version de l'astérisque, même si cela signifie des lignes supplémentaires. Importer tout dans des sous-paquets serait encore pire, vous aurez vraiment tout.

De plus, une pratique courante consiste à placer des classes spécifiques et des classes spécifiques à l'implémentation, dans leurs propres sous-packages. Souvent, vous voulez spécifiquement éviter de les importer à moins que ce ne soit crucial. Encore une fois, l'importation de la sous-arborescence entière entrerait en conflit avec cela.

0

java.awt.* est pas une expression régulière, qui est ce que je pense que vous attendez/pensez.

java.awt.* vous donnera seulement les classes dans ce paquet exact, et non les paquets imbriqués. Imaginez les collisions de l'espace de nom impliqués ci-dessous!

import com.* 

Il convient de noter qu'il est considéré comme une mauvaise pratique à utiliser *. Les importations de nom de classe explicite sont préférées.

Pour en savoir plus: Wikipedia: Namespace (Computer Science)

+0

Est même import * pris en charge? : -o – OscarRyz

+2

@Oscar Reyes: Non, "import *" n'existe pas en Java. – Jesper

+0

convenu, ne fonctionne pas (ce qui me surprend vraiment). Je vais le changer pour ne pas dérouter personne ... –

1

Comme beaucoup l'ont dit avant.

import java.awt. * N'importer des classes java.awt.event ...

Et la différence entre les deux est que package java.awt.* inclure des classes comme un cadre, un bouton, etc et le paquetage java.awt.event. * inclut tout l'event/listener qui peut arriver. Par exemple, pour créer un bouton, vous avez besoin de la classe java.awt.Button, mais si vous voulez qu'une action se produise lorsque vous cliquez sur le bouton, vous avez besoin d'un java.awt.event.ActionListener qui "attendra" pour le bouton java.awt.event.ActionListener. cliquez sur, puis produisez un java.awt.event.ActionEvent.