Classes et objets
Notions théoriques
Définir une classe
Une classe se déclare avec le mot-clé class. Elle contient des attributs (variables de la classe) et des méthodes (fonctions de la classe).
public class Personnage {
// Attributs
String nom;
int force;
int pointsDeVie;
int defense;
}
Les attributs se déclarent directement dans le corps de la classe, avec leur type et leur nom. Java est un langage à typage fort : chaque variable doit avoir un type déclaré.
Types primitifs vs types objets
En Java, il existe deux catégories de types :
| Catégorie | Exemples | Stockage |
|---|---|---|
| Types primitifs | int, double, boolean, char | Valeur directe |
| Types objets (références) | String, Personnage, List | Référence vers l'objet en mémoire |
Une variable de type primitif contient directement la valeur (int force = 15). Une variable de type objet contient une référence (adresse mémoire) vers l'objet. C'est pourquoi on parle de "référence" en Java.
La valeur null
Quand une variable de type objet est déclarée sans être initialisée, elle vaut null : elle ne pointe vers aucun objet.
Personnage p; // p vaut null (non initialisé)
Personnage q = null; // explicitement null
Personnage r = new Personnage(); // r pointe vers un objet
Appeler une méthode sur une variable null provoque une NullPointerException, l'une des erreurs les plus fréquentes en Java. Toujours vérifier qu'un objet n'est pas null avant de l'utiliser.
Instancier un objet
Le mot-clé new crée une nouvelle instance de la classe. Chaque instance est indépendante.
Personnage hero = new Personnage();
hero.nom = "Aria";
hero.force = 15;
hero.pointsDeVie = 100;
Personnage ennemi = new Personnage();
ennemi.nom = "Golem";
ennemi.force = 10;
ennemi.pointsDeVie = 80;
Modifier hero.pointsDeVie n'affecte pas ennemi.pointsDeVie : ce sont deux objets distincts en mémoire.
Accéder aux membres
On accède aux attributs et méthodes d'un objet avec la notation point :
hero.nom // lire l'attribut nom
hero.force = 20; // modifier l'attribut force
hero.attaquer(); // appeler la méthode attaquer
Exemple pratique
// Fichier : Personnage.java
public class Personnage {
String nom;
int force;
int defense;
int pointsDeVie;
void afficher() {
System.out.println("Nom : " + nom);
System.out.println("Force : " + force);
System.out.println("Défense : " + defense);
System.out.println("PV : " + pointsDeVie);
}
boolean estVivant() {
return pointsDeVie > 0;
}
void recevoirDegats(int degats) {
int degatsEffectifs = degats - defense;
if (degatsEffectifs < 0) {
degatsEffectifs = 0;
}
pointsDeVie -= degatsEffectifs;
System.out.println(nom + " reçoit " + degatsEffectifs + " dégâts.");
}
}
// Fichier : Main.java
public class Main {
public static void main(String[] args) {
Personnage hero = new Personnage();
hero.nom = "Aria";
hero.force = 15;
hero.defense = 5;
hero.pointsDeVie = 100;
Personnage ennemi = new Personnage();
ennemi.nom = "Golem";
ennemi.force = 12;
ennemi.defense = 8;
ennemi.pointsDeVie = 80;
System.out.println("--- État initial ---");
hero.afficher();
ennemi.afficher();
System.out.println("--- Combat ---");
ennemi.recevoirDegats(hero.force);
System.out.println("Golem encore en vie ? " + ennemi.estVivant());
}
}
Test de mémorisation/compréhension
TP pour réfléchir et résoudre des problèmes
Vous allez enrichir la classe Personnage pour créer un mini-système de personnages RPG.
Étape 1 — Ajouter l'attribut defense
Ajoutez l'attribut defense de type int à la classe Personnage.
Regroupez toujours tous les attributs en haut de la classe, avant les méthodes. Cela améliore la lisibilité : on voit d'un coup d'œil toutes les données que gère la classe.
Étape 2 — Méthode estVivant()
Implémentez la méthode estVivant() qui retourne true si les points de vie sont supérieurs à 0.
Les méthodes qui retournent un boolean sont souvent nommées avec un préfixe is (anglais) ou est (français) : estVivant(), isAlive(). Cela rend le code lisible : if (hero.estVivant()) se lit comme une phrase.
Étape 3 — Créer trois personnages distincts
Dans Main.java, créez trois personnages (un guerrier, un mage, un archer) avec des attributs différents et affichez leurs statistiques.
Préférez des noms de variables qui décrivent le rôle de l'objet (guerrier, mage, ennemi) plutôt que des noms génériques (p1, p2, obj). Votre code sera beaucoup plus lisible.