Les programmes Java sont des familles de types, plus exactement de classes et d'interfaces, dont certains sont publics, afin d'être accessibles à d'autres utilisateurs que leur auteur. Ces familles de types sont organisées en paquet (en anglais, package), dans le but de garantir une désignation non-ambiguë de chaque type, si possible dans le monde entier1.3.
Les bibliothèques de Java rassemblent elles-mêmes des types alors que celles d'autres langages (comme C ou Fortran) rassemblent des fonctions. Elles introduisent une profusion de types d'objets utiles au développement de programmes, par exemple le type String des chaînes de caractères, les types InputStream et OutputStream des flots d'entrée et de sortie. Ces bibliothèques sont aussi organisés en paquets qui rassemblent des types apparentés, par exemple java.io ou java.util.
Les membres d'un paquet sont des types qui sont définis dans des unités de compilation, et des sous-paquets. Par exemple, le paquet java est composé des sous-paquets applet, awt, beans, io, lang, math, net, rmi, security, sql, text et util ; chacun de ses sous-paquets est désigné par son nom complet : java.applet, java.awt, etc.
Le programme source d'une application est un ensemble d'unités de compilation. Une unité de compilation se compose de définitions de types (classes ou interfaces). Par exemple, le paquet java.util contient les définitions des types Collection, Set, HashSet, etc. L'usage est de désigner les paquets par des noms commençant par une minuscule, les classes par des noms commençant par une majuscule, et les membres d'une classe à nouveau par des noms commençant par une minuscule. Ainsi, le nom complet java.lang.System.out désigne le membre out de la classe System du paquet java.lang. Les noms de variable (paramètre, variable locale, etc.) commencent aussi par une minuscule.
Pour qu'un type puisse être utilisé hors du paquet dont il est membre, il doit être déclaré public ; de même, pour qu'une fonction soit utilisée en dehors du paquet, elle doit être déclarée publique : dans les deux cas, il suffit de faire précéder leur définition du mot-clé public (ce qui est toujours le cas, par exemple, de la fonction main).
Ainsi, si l'on estime que les fonctions sommerEntiers, sommerCarrés et sommerCubes sont destinées à être utilisés dans d'autres applications, il faut en faire des fonctions publiques d'une classe publique, par exemple :
package utilites; public class Sommes { public static int sommerEntiers(int min, int max) { ... } public static int sommerCarrés(int min, int max) { ... } public static int sommerCubes(int min, int max) { ... } }
La définition d'un type public doit figurer dans une unité de compilation de même nom ; par exemple, le type public utilites.Sommes doit figurer dans un fichier de nom Sommes.java.
Une application pourra utiliser ces fonctions en important la classe utilites.Sommes qui les définit, ce qui a pour effet d'étendre la portée de la définition de la classe utilites.Sommes au paquet application :
package application; import utilites.Sommes; class A { ... Sommes.sommerEntiers(1, 10) ... }