Quand une expression a un intérêt en soi et est susceptible d'être utilisée à plusieurs occasions, il est préférable d'en faire une fonction. Cette notion fondamentale a ainsi été le premier dispositif de réutilisation des programmes. La définition d'une fonction exprime la dépendance d'une expression par rapport à des paramètres.
Le paquet exemples contient maintenant deux classes, Sommes et SommesTest. La classe exemples.Sommes comporte deux fonctions, sommerEntiers et sommer : la première invoque la seconde et elle est invoquée plusieurs fois par la fonction principale de la classe exemples.SommesTest:
package exemples; class Sommes { // somme des entiers de min à max static int sommerEntiers(int min, int max) { return sommer(max) - sommer(min-1); } // somme des entiers de 1 à m static int sommer(int m) { return m*(m+1)/2; } } class SommesTest { public static void main(String[] args) { System.out.println("Somme de 1 à 10 = " + Sommes.sommerEntiers(1, 10)); System.out.println("Somme de 1 à 100 = " + Sommes.sommerEntiers(1, 100)); System.out.println("Somme de 1 à 1000 = " + Sommes.sommerEntiers(1, 1000)); } }
L'effet de ce programme est d'afficher à l'écran :
Somme de 1 à 10 = 55 Somme de 1 à 100 = 5050 Somme de 1 à 1000 = 500500
Le texte compris entre « // » et la fin de la ligne est un commentaire : inutilisables par la Machine Virtuelle Java, les commentaires facilitent la compréhension des programmes.
On définit une fonction par son en-tête et son corps. Ici, les en-têtes sont :
Le corps de la fonction suit son en-tête et est placé entre accolades. Il comporte des définitions de variables locales et des instructions. Sauf quand le type de retour est void, le corps d'une fonction contient au minimum une instruction de la forme « return expression; » qui permet de communiquer son résultat. Quand le type du résultat est void, son corps peut contenir l'instruction « return; », mais ce n'est pas obligatoire, comme le montre les exemples précédents de fonction principale. Une fonction de type void est parfois appelée une procédure.
On peut définir d'autres fonctions analogues dans la classe Sommes :
package exemples; class Sommes { // ... static int sommerCarrés(int m) { return n*(n+1)*(2*n+1)/6; } static int sommerCubes(int m) { return n*n*(n+1)*(n+1)/4; } }
Les fonctions mathématiques les plus courantes sont disponibles dans la bibliothèque de Java : Math.cos, Math.sin, Math.log, Math.exp, etc, définies dans la classe Math, elle-même membre du paquet java.lang.
Les programmes sont peuplés de noms servant à désigner diverses entités : paquets, types, variables, fonctions, etc. La portée d'une déclaration d'un nom est la région du programme dans laquelle ce nom est connu et désigne la même entité :
C'est pourquoi deux paquets distincts peuvent définir des classes de même nom ; deux classes distinctes peuvent définir des fonctions de même nom ; deux fonctions distinctes peuvent déclarer des paramètres de même nom.
La définition de la portée d'une déclaration n'interdit cependant pas d'accéder à l'entité désignée par le nom hors de la portée. Ainsi, on peut accéder à la fonction sommerCarrés définie dans la classe Sommes en l'invoquant sous la forme Sommes.sommerCarrés(10) à partir d'une autre classe.