Dans le cours précédent, toutes vos méthodes étaient static et les données circulaient en paramètres. La programmation orientée objet (POO) regroupe au même endroit des données et les opérations qui les manipulent.
- Une classe est un modèle : « un compte bancaire a un titulaire et un solde ; on peut y déposer et retirer de l’argent ».
- Un objet est un exemplaire concret construit à partir de ce modèle : le compte d’Ada, le compte de Linus.
Déclarer une classe
class CompteBancaire {
// Attributs (état de chaque objet)
String titulaire;
int solde; // en euros pour simplifier
// Constructeur : même nom que la classe, pas de type de retour
CompteBancaire(String titulaire, int soldeInitial) {
this.titulaire = titulaire; // this.titulaire = attribut ; titulaire = paramètre
this.solde = soldeInitial;
}
// Méthodes d'instance (pas de static) : elles agissent sur CET objet
void deposer(int montant) {
solde += montant;
}
boolean retirer(int montant) {
if (montant > solde) {
return false; // refus : solde insuffisant
}
solde -= montant;
return true;
}
@Override
public String toString() {
return "Compte de " + titulaire + " : " + solde + " EUR";
}
}
Créer et utiliser des objets
public class Main {
public static void main(String[] args) {
CompteBancaire a = new CompteBancaire("Ada", 100); // new appelle le constructeur
CompteBancaire b = new CompteBancaire("Linus", 20);
a.deposer(50);
boolean ok = b.retirer(30); // false
System.out.println(a); // Compte de Ada : 150 EUR (toString appelé)
System.out.println(b.solde); // 20
}
}
Chaque objet possède ses propres valeurs d’attributs : déposer sur a ne change rien à b. Plusieurs classes peuvent cohabiter dans un même fichier, mais une seule peut être public et elle doit porter le nom du fichier. Si vous lancez le fichier directement avec java Main.java, placez la classe Main en premier : le lanceur de Java (y compris Java 25) exécute la première classe déclarée dans le fichier. Dans un vrai projet, chaque classe a son propre fichier.
Constructeurs multiples
CompteBancaire(String titulaire) {
this(titulaire, 0); // appelle l'autre constructeur
}
Si vous n’écrivez aucun constructeur, Java fournit un constructeur sans paramètre ; dès que vous en écrivez un, ce constructeur par défaut disparaît.
Références et null
Une variable de type classe ne contient pas l’objet lui-même mais une référence vers lui :
CompteBancaire c = a; // c et a désignent le MÊME objet
c.deposer(10);
System.out.println(a.solde); // 160 : modifié via c
CompteBancaire d = null; // aucune référence
d.deposer(5); // NullPointerException à l'exécution !
C’est pour cela que == entre deux objets compare les références, et non le contenu (nous verrons equals à la leçon 5).
toString()
Toute classe hérite d’une méthode toString() qui affiche par défaut quelque chose comme CompteBancaire@6d06d69c. La redéfinir (annotation @Override) rend l’affichage et le débogage beaucoup plus agréables.
Dans cette première leçon, les attributs sont accessibles directement (b.solde). C’est pratique mais dangereux : rien n’empêche d’écrire b.solde = -1000. La leçon suivante règle ce problème avec l’encapsulation.
Exercices
Les solutions et les tests restent sur le serveur. Dans l'espace étudiant, ton code est exécuté et corrigé, et le tuteur donne des indices avant la solution.
Une classe Rectangle
Créez une classe
Rectangleavec deux attributsdouble largeurethauteur, un constructeur, les méthodesaire()etperimetre(), et untoString()qui renvoieRectangle 3.00 x 4.00. Dansmain, lisez largeur et hauteur puis affichez :Rectangle 3.00 x 4.00 Aire : 12.00 Périmètre : 14.00Formatez avec
String.format(Locale.ROOT, "%.2f", ...)et lisez les nombres avecDouble.parseDouble(sc.next()).import java.util.Locale; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); } } class Rectangle { // À compléter }Opérations sur un compte
Créez la classe
CompteBancairede la leçon (titulaire, solde entier,deposer,retirerqui renvoiefalsesi le solde est insuffisant ou le montant négatif,toString). Le programme lit :- une première ligne : le titulaire ;
- puis des lignes
D montant(dépôt) ouR montant(retrait) jusqu’à la fin de l’entrée.
Pour chaque retrait refusé, affichez
Refusé : <montant>. À la fin, affichezCompte de <titulaire> : <solde> EUR. Le solde initial est 0.import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String titulaire = sc.nextLine().trim(); } } class CompteBancaire { }Références
Après
CompteBancaire a = new CompteBancaire("Ada", 100); CompteBancaire c = a; c.deposer(50);, que vauta.solde?- 100
- 150
- 50
Quiz de fin de leçon
Que fait le mot-clé new ?
- Déclare une classe
- Crée un objet et appelle son constructeur
- Crée une variable static
Dans un constructeur, que désigne this.nom ?
- Le paramètre nom
- L'attribut nom de l'objet en cours de construction
- Une variable globale
Que se passe-t-il en appelant une méthode sur une variable qui vaut null ?
- La méthode renvoie null
- Une NullPointerException est levée
- Rien
La suite du cours
- Encapsulation, immutabilité et records20 min
- Héritage, classes abstraites et polymorphisme20 min
- Interfaces, types scellés et pattern matching20 min
- La classe Object : equals, hashCode, toString et membres static20 min
- Génériques et composition : concevoir un modèle objet20 min