Une première classe ¶
Java est langage orienté objet. Cela signifie que (presque) tout est un objet. La définition d’un objet s’appelle une classe. Donc programmer en Java revient à déclarer des classes, à instancier des objets à partir des classes déclarées ou fournies et à effectuer des opérations sur ces objets.
Déclarer une classe ¶
Dans ce chapitre, nous allons ébaucher l’implémentation d’une classe Personne. La classe Personne sera une représentation abstraite d’une personne pour les besoins de notre application.
En Java, une classe est déclarée dans son propre fichier qui doit porter le même nom que la classe avec l’extension .java. Il nous faut donc créer le fichier Personne.java :
/**
* Une première classe représentant une personne
*/
public class Personne {
}
Vous pouvez
télécharger le
fichier Personne.java. Vous pouvez
également créer directement dans un projet sous Eclipse avec le menu File >
New > Class.
Note
Si vous créez le fichier à partir d’Eclipse, celui-ci va vous proposer de créer le fichier dans un package (par défaut ayant le même nom que le projet). Vous pouvez effacer le contenu du champ package de la boîte de dialogue en attendant que nous abordions la notion de package.
Anatomie d’une classe¶
En Java une classe est déclarée par le mot-clé class suivi du nom de la classe. Nous reviendrons plus tard sur le mot-clé public qui précède et qui permet de préciser la portée (scope) de la définition de cette classe.Ensuite, on ouvre un bloc avec des accolades pour déclarer le contenu de la classe.
La déclaration d’une classe peut contenir :
- des attributs
- Les attributs représentent l’état interne d’un objet.Par exemple, notre personne peut avoir un attribut pour mémoriser son âge.
- des méthodes
- Les méthodes représentent les opérations que l’on peut effectuer sur un objet de cette classe.
- des constantes
- Les constantes sont un moyen de nommer des valeurs particulières utiles à la compréhension du code.
- des énumérations
- Les énumérations sont des listes figées d’objets. Nous y reviendrons dans un chapitre ultérieur.
- des classes internes
- Un classe peut contenir la déclaration d’autres classes que l’on appelle alors classes internes (inner classes).Nous y reviendrons dans un chapitre ultérieur.
L’ordre dans lequel apparaissent ces éléments dans la déclaration de la classe est sans importance en Java. Pour des raisons de commodité de lecture, les développeurs adoptent en général une convention : d’abord les constantes, puis les énumérations, puis les attributs et enfin les méthodes.
Ajouter des méthodes¶
Ajoutons quelques méthodes à notre classe Personne. Nous allons commencer par ajouter la méthode getAge qui permet de connaître l'âge actuel d’une personne en années.
/**
* Une première classe représentant une personne
*/
public class Personne {
/**
* @return L'age de la personne en années
*/
public float getAge(){
}
}
Une méthode est identifée par sa signature. La signature d’une méthode est de la forme :
[portée] [type de retour] [identifiant] ([liste des paramètres]) {
[code]
}
Pour la méthode que nous venons de déclarer:
| portée | public |
| type de retour | float (nombre à virgule flottante) |
| identifiant | getAge |
| liste des paramètres | aucun |
Le code source précédent ne compilera pas, en effet, Java étant un langage fortement typé,nous sommes obligés d’indiquer le type de retour de la méthode getAge et le compilateur s’attend à ce que cette méthode retourne un nombre à virgule flottante. L'âge de la personne est typiquement une information qui correspond à l’état de la personne à un moment donné. Il est donc intéressant de stocker cette information comme attribut de la classe :
/**
* Une première classe représentant une personne
*/
public class Personne {
private float age;
/**
* @return L'age de la personne en années
*/
public float getAge(){
return age;
}
}
Un attribut est identifé par :
[portée] [type] [identifiant];
Pour l’attribut age, nous spécifions le type de portée private. En Java, un attribut a toujours une valeur par défaut qui dépend de son type. Pour le type float, la valeur par défaut est 0.
Nous pouvons maintenant enrichir notre classe avec des méthodes supplémentaires :
/**
* Une première classe représentant une personne
*/
public class Personne {
private float age;
/**
* @return L'age de la personne en années
*/
public float getAge(){
return age;
}
/**
* Pour vieillir la personne
* @param deltaAnnee Le nombre d'années supplémentaires
*/
public void vieillir(float deltaAnnee) {
age = age + deltaAnnee;
}
/**
* Pour rajeunir la personne
* @param deltaAnnee Le nombre d'années à soustraire
*/
public void rajeunir(float deltaAnnee) {
age = age - deltaAnnee;
}
/**
* Représentation de l'objet sous la forme
* d'une chaîne de caractères.
*/
public String toString() {
return "La personne a actuellement " + age + " ans.";
}
}
Les méthodes Personne.vieillir(float) et Personne.rajeunir(float) prennent toutes les deux un paramètre de type float. Comme ces méthodes ne retournent aucune valeur, nous sommes obligés de l’indiquer avec le mot-clé void.
La méthode toString() est une méthode particulière. Il s’agit de la méthode que le compilateur doit appeler s’il veut obtenir une représentation de l’objet sous la forme d’une chaîne de caractères. Notez, que l’opérateur + est utilisé en Java pour concaténer les chaînes de caractères et qu’il est possible de concaténer des chaînes de caractères avec d’autres types de données.Dans notre exemple, nous concaténons une chaîne de caractères avec le nombre à virgule flottante représentant l'âge de la personne.
Note
Java ne supporte pas la notion de fonction. Il n’est donc pas possible de déclarer des méthodes en dehors d’une classe.
La méthode main¶
Si nous voulons utiliser notre classe dans un programme, il nous faut déterminer un point d’entrée pour l’exécution du programme. Un point d’entrée est représenté par la méthode main qui doit avoir la signature suivante :
public static void main(String[] args) {
}
Une classe ne peut déclarer qu’une seule méthode main. En revanche,toutes les classes peuvent déclarer une méthode main. Cela signifie qu’une application Java peut avoir plusieurs points d’entrée(ce qui peut se révéler très pratique). Voilà pourquoi la commande java attend comme paramètre le nom d’une classe qui doit déclarer une méthode main.
Ajoutons une méthode main à la classe Personne pour réaliser une programme très simple :
/**
* Une première classe représentant une personne
*/
public class Personne {
private float age;
/**
* @return L'age de la personne en années
*/
public float getAge(){
return age;
}
/**
* Pour vieillir la personne
* @param deltaAnnee Le nombre d'années supplémentaires
*/
public void vieillir(float deltaAnnee) {
vitesse = vitesse + deltaVitesse;
}
/**
* Pour rajeunir la personne
* @param deltaAnnee Le nombre d'années à soustraire
*/
public void rajeunir(float deltaAnnee) {
vitesse = vitesse - deltaVitesse;
}
/**
* Représentation de l'objet sous la forme
* d'une chaîne de caractères.
*/
public String toString() {
return "La personne a actuellement " + age + " ans.";
}
public static void main(String[] args) {
Personne unePersonne = new Personne();
System.out.println(unePersonne);
unePersonne.vieillir(65);
System.out.println(unePersonne);
unePersonne.rajeunir(32);
System.out.println(unePersonne);
}
}
À la ligne 39, le code commence par créer une instance de la classe Personne.Une classe représente une abstraction ou, si vous préférez, un schéma de ce qu’est une Personne pour notre programme. Évidemment, une personne peut aussi être définie pas sa couleur, son genre, son nom, son adresse, des moyens de communication.Mais faisons l’hypothèse que, dans le cadre de notre programme, seule l'âge aura un intérêt. Voilà pourquoi notre classe Personne n’est qu’une abstraction du concept de Personne.
Si dans notre programme, nous voulons interagir avec une personne nous devons créer une instance de la classe Personne. Cette instance (que l’on appelle plus simplement un objet) dispose de son propre espace mémoire qui contient son état, c’est-à-dire la liste de ses attributs assignés à un instant T. Créer une instance d’un objet se fait grâce au mot-clé new.
Note
Remarquez l’utilisation des parenthèses avec le mot-clé new :
Personne unePersonne = new Personne();
Ces parenthèses sont obligatoires.
En Java, l’opérateur . sert à accéder aux attributs ou aux méthodes d’un objet. Donc si on dispose d’une variable personne de type Personne, on peut appeler sa méthode vieillir grâce à cet opérateur :
unePersonne.vieillir(65);
Aux lignes 41, 44 et 47, nous utilisons la classe System pour afficher du texte sur la sortie standard. Notez que nous ne créons pas d’instance de la classe System avec l’opérateur new.Il s’agit d’un cas particulier sur lequel nous reviendrons lorsque nous aborderons les méthodes et les attributs de classe. Nous utilisons l’attribut de classe out de la classe System qui représente la sortie standard et nous appelons sa méthode println qui affiche le texte passé en paramètre suivi d’un saut de ligne. Cependant, nous ne passons pas une chaîne de caractères comme paramètre mais directement une instance de notre classe Personne. Dans ce cas, la méthode println appellera la méthode Personne.toString() pour obtenir une représentation textuelle de l’objet.
Exécuter le programme en ligne de commandes¶
Dans un terminal, en se rendant dans le répertoire contenant le fichier Java, il est possible de le compiler
$ javac Personne.java
et de lancer le programme
$ java Personne
Ce qui affichera sur la sortie suivante :
La personne a actuellement 0 ans
La personne a actuellement 65 ans
La personne a actuellement à 33 ans
Exécuter le programme depuis Eclipse¶
Il suffit d’ajouter la classe Personne dans le répertoire src d’un projet Java dans Eclipse. Ensuite,il faut faire un clic droit sur le nom du fichier dans le Package Explorer et choisir Run as > Java Application.
Note
Vous pouvez aussi appuyer sur la touche F11 lorsque vous êtes positionné dans le fichier source pour lancer l’exécution de la classe.