Aller au contenu principal

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égorieExemplesStockage
Types primitifsint, double, boolean, charValeur directe
Types objets (références)String, Personnage, ListRéférence vers l'objet en mémoire
info

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
attention

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


Quel est le type Java pour stocker un entier ?


Que vaut une variable de type objet non initialisée en Java ?


Quelle notation permet d'accéder à l'attribut `nom` de l'objet `hero` ?


Que se passe-t-il si on appelle une méthode sur une variable null ?


Si on modifie `hero.force = 20`, est-ce que `ennemi.force` change aussi ?


Parmi ces types, lequel est un type primitif en Java ?


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.


Bonne pratique - Déclarer tous les attributs au même endroit

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.


Bonne pratique - Méthodes prédicats avec is/est

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.


Bonne pratique - Nommer les variables par leur rôle

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.

📌 Une solution