Une classe est un plan
Jusqu'à présent, votre code vivait dans des méthodes qui se passaient de simples valeurs. Une classe vous permet de regrouper des données liées et le comportement qui agit sur elles au sein d'un seul type nommé. La classe est le plan ; les choses réelles avec lesquelles vous travaillez sont les objets créés à partir d'elle.
Une classe déclare deux sortes de membres : les champs (les données que détient chaque objet) et les méthodes (ce que chaque objet sait faire).
new Dog() construit un objet en mémoire et vous remet une référence vers lui. d.name et d.bark() accèdent à cet objet précis.
Chaque objet a son propre état
Tout l'intérêt d'une classe est que vous pouvez produire de nombreux objets indépendants, chacun portant ses propres valeurs de champs. En modifier un n'en touche jamais un autre.
rex et bella sont deux objets distincts. Chacun a son propre name, donc chaque bark() affiche une valeur différente. Ces données propres à chaque objet s'appellent l'état d'instance.
Champs et méthodes fonctionnent ensemble
Les méthodes d'une classe peuvent lire et mettre à jour directement les champs de l'objet, sans avoir à les passer en paramètres. La méthode « vit déjà sur » l'objet dont elle manipule les données.
Remarquez que increment() ne prend aucun argument. Elle agit sur le champ appartenant au Counter sur lequel vous l'avez appelée. C'est là la différence entre une méthode de classe et une méthode statique isolée : la méthode dispose d'un objet implicite sur lequel agir.
Le mot-clé this
À l'intérieur d'une méthode, this est une référence vers l'objet sur lequel la méthode a été appelée. En général, vous n'en avez pas besoin : écrire count signifie déjà this.count. Mais this devient indispensable lorsqu'un nom de paramètre entre en collision avec un nom de champ, ce qui arrive constamment dans les setters et les constructeurs.
Une erreur classique de débutant consiste à écrire x = x; dans move. Cela ne fait qu'affecter le paramètre à lui-même et laisse le champ intact : le compilateur ne vous avertit pas et votre objet conserve silencieusement ses anciennes valeurs. C'est this.x = x; qui met réellement à jour le champ.
Valeurs par défaut des champs et références null
Lorsque vous créez un objet, ses champs ne contiennent pas n'importe quoi : Java les initialise à des valeurs par défaut : 0 pour les nombres, false pour boolean et null pour les références d'objets comme String. Cette valeur par défaut null est à l'origine d'un plantage classique.
u.name vaut null parce que personne ne l'a affecté, donc appeler .length() dessus lève une NullPointerException. Affectez toujours des valeurs pertinentes à un objet avant d'utiliser ses champs, ce qui est précisément le problème que résolvent les constructeurs.
Organiser le code autour des classes
Les vrais programmes modélisent leur domaine sous forme de classes qui regroupent les données et les opérations qui s'y appliquent. Ici, une seule classe BankAccount conserve un solde et encadre la façon dont il évolue :
Les données (balance) et les règles qui les modifient (deposit, withdraw) vivent au même endroit. Le code extérieur demande au compte d'effectuer des actions plutôt que de manipuler directement ses chiffres : c'est le fondement d'une conception propre et maintenable.
Suite : les constructeurs
Affecter chaque champ à la main après new est fastidieux et facile à oublier et, comme vous venez de le voir, un champ oublié laisse un null prêt à provoquer un plantage. Un constructeur vous permet d'exiger et d'initialiser les champs d'un objet au moment même de sa création, de sorte qu'un BankAccount ne puisse jamais exister sans propriétaire. C'est le sujet de la page suivante.
Questions fréquentes
Qu'est-ce qu'une classe en Java ?
Une classe est un plan qui définit les données (champs) et le comportement (méthodes) qu'aura un type d'objet. La classe elle-même n'est que le modèle : vous créez les objets réels à partir d'elle avec new. Par exemple, une classe Dog décrit que chaque chien possède un name et peut faire bark(), tandis que chaque new Dog() est un chien distinct avec son propre nom.
Quelle est la différence entre une classe et un objet en Java ?
Une classe est la définition ; un objet est une instance concrète construite à partir de cette définition avec new. Une seule classe Person peut produire de nombreux objets Person, chacun conservant ses propres valeurs de champs. Voyez la classe comme l'emporte-pièce et les objets comme les biscuits individuels : modifier les champs d'un objet n'affecte jamais ceux d'un autre.
À quoi sert le mot-clé this dans une classe Java ?
this fait référence à l'objet courant, l'instance précise dont la méthode est en cours d'exécution. Vous l'utilisez pour accéder aux propres champs d'un objet, surtout lorsqu'un paramètre porte le même nom qu'un champ (this.name = name;). Sans this, l'affectation ne ferait qu'assigner le paramètre à lui-même et le champ resterait inchangé.