# Programmation Java/Paquetages

* Introduction
* La notion de machine virtuelle
* Installation
** NetBeans
** Eclipse
** Visual Studio Code
* Bases du langage
** Premier programme
** Commentaires
** Types de base
** Opérateurs
** Conditions
** Bloc de portée
** Itérations
** Tableaux
* Les classes en Java
** Membres
** Modificateurs d'accès
** Héritage
** Encapsulation
** Polymorphisme
** Classes abstraites
** Interfaces
** Classes internes
** Transtypage
** Types génériques
** Instanciation et cycle de vie
** « this »
** Objets comparables et clés
** Énumérations
** Exceptions
** Packages
* Classes de base
** Collections
** Nombre de taille arbitraire
** Tags Javadoc
** Annotations
** Entrées sorties
** Threads et synchronisation
** Méthodes natives
** Réflexion
** Regex
** JUnit
* Conclusion
* Exemples en Java
** Générer un carré magique
** Générer un triangle de Sierpiński
** XML
** Swing
*** Un premier exemple
*** Formulaire avec boutons sur image
*** Calcul de somme
*** Calcul de distance
* Annexes
** Les outils de base fournis avec le Java Development Kit
** Créer une archive Java
** Paramétrer la JVM
** Liste des mots réservés
** Débogage
** Java et les autres langages
* Introduction
* La notion de machine virtuelle
* Installation
** NetBeans
** Eclipse
** Visual Studio Code
* Bases du langage
** Premier programme
** Commentaires
** Types de base
** Opérateurs
** Conditions
** Bloc de portée
** Itérations
** Tableaux
* Les classes en Java
** Membres
** Modificateurs d'accès
** Héritage
** Encapsulation
** Polymorphisme
** Classes abstraites
** Interfaces
** Classes internes
** Transtypage
** Types génériques
** Instanciation et cycle de vie
** « this »
** Objets comparables et clés
** Énumérations
** Exceptions
** Packages
* Classes de base
** Collections
** Nombre de taille arbitraire
** Tags Javadoc
** Annotations
** Entrées sorties
** Threads et synchronisation
** Méthodes natives
** Réflexion
** Regex
** JUnit
* Conclusion
* Exemples en Java
** Générer un carré magique
** Générer un triangle de Sierpiński
** XML
** Swing
*** Un premier exemple
*** Formulaire avec boutons sur image
*** Calcul de somme
*** Calcul de distance
* Annexes
** Les outils de base fournis avec le Java Development Kit
** Créer une archive Java
** Paramétrer la JVM
** Liste des mots réservés
** Débogage
** Java et les autres langages
[ Modifier le sommaire ]
Les paquetages, ou packages, permettent de grouper ensemble des classes rattachées, à la manière des dossiers qui permettent de classer des fichiers. En java, un paquetage particulier correspond à un répertoire. Les classes d'un projet en java devraient toutes être dans un paquetage particulier afin de les catégoriser. Cela a plusieurs avantages :
* retrouver les classes plus facilement
    Par exemple, la fenêtre d'édition EditorWindow dans le package app.editeur.fenetre.
* différencier deux classes ayant un nom identique ou similaire mais au rôle différent et éviter un conflit de nom.
    Par exemple, trois classes Adresse différentes :
*   * dans un package courrier.client pour la gestion d'une adresse postale ;
*   * dans un package réseau.hôte pour la gestion d'une adresse IP ;
*   * dans un package personnage.propriété pour la gestion de la caractéristique d'adresse d'un personnage de jeu de rôle.

## Utilisation

Le fichier à inclure dans un paquetage doit contenir le mot-clé 'package' suivi du nom du paquetage.
Ce nom peut être composé de plusieurs mots séparés par un point ( . ).

### Exemple

pour inclure la classe Toto dans le paquetage 'mesPackages.sousPackage1', écrire au début du fichier Toto.java :
La structure des répertoires doit suivre le nom du paquetage, c'est-à-dire que le fichier Toto.java doit se situer dans un sous-répertoire mesPackages/sousPackage1/Toto.java.
Lorsqu'ensuite on désire utiliser la classe Toto depuis une autre classe, il faudra au préalable écrire :
ou
ou utiliser directement une référence au paquetage :

## Conventions

En Java, les programmeurs attribuent généralement un nom qui commence par une minuscule pour un paquetage, et un nom qui commence par une capitale pour une classe.
Les bibliothèques Java destinées à être distribuées regroupent leurs classes dans un ou plusieurs paquetages dont le nom est normalement précédé par un nom de domaine dans l'ordre inverse, par exemple :
Cela permet également d'éviter les conflits de nom de paquetages et de classes venant de différents groupes et entités. Par exemple, une classe org.wikibooks.fr.Test pourra cohabiter avec une classe org.wikipedia.fr.Test sans conflit de noms de classe.

## Compilation

L'utilisation d'un paquetage nécessite une structure des répertoires correspondant au nom du paquetage. Un projet est composé de plusieurs paquetages, dont la racine est le répertoire qu'il faut passer à java dans le classpath pour qu'il puisse charger les classes des paquetages du projet.
Par exemple, le fichier Toto.java définit la classe Toto du paquetage org.wikibooks.exemple débute par :
et doit se situer dans le répertoire org/wikibooks/exemple.
Supposons que le chemin du fichier soit /home/me/javaprog/org/wikibooks/exemple/Toto.java. La compilation se fait en spécifiant le chemin du package racine (répertoire parent de org) comme classpath, et en spécifiant ensuite le chemin relatif à ce répertoire :
Quand un programme Java utilise cette classe, il doit être compilé et exécuté en spécifiant /home/me/javaprog (package racine) pour le paramètre classpath, et le nom de la classe doit inclure le nom du package :

## Import statique

Pour utiliser les membres statiques publiques d'une classe, il faut nommer la classe où ils sont définis.
Exemple 1 :
L'import statique permet d'importer les membres statiques d'une classe afin de ne pas nommer la classe en question.
Exemple 1 :
Exemple 2 :
L'abus d'import statique n'est pas conseillé car le code ne contient plus de référence à la classe définissant le membre statique utilisé. Il ne faut l'utiliser que si les membres statiques d'un petit nombre de classes sont utilisés fréquemment.

## Importation de paquetages depuis une archive jar

Pour importer un paquetage d'un fichier .jar, il faut s'assurer que le fichier est dans le classpath courant (à compile- et execution-time). Ensuite, l'import se déroule comme si le .jar était décompressé.
Par exemple, pour compiler et lancer une classe d'un projet du dossier parent (contenant deux répertoires : /source et /libraries) compiler :
Puis le lancer :
Cela nécessite que MainClass soit le package par défaut, ce qui n'est pas très explicite.
Il vaut mieux que la classe principale soit également dans un paquetage.