Académique Documents
Professionnel Documents
Culture Documents
Pré-requis :
Programmation objet de base (classe, objet, méthodes) en Java avec Visual Studio Code (VSCode)
T A B L E D E S M A T I E R E S
1. Contexte et objectifs______________________________________________________________1
2. Réalisation______________________________________________________________________2
2.1 Créer la classe Chat_____________________________________________________________________2
2.2 Créer des chats (des objets) et les afficher__________________________________________________2
2.3 Envoyer un message à un objet___________________________________________________________3
2.4 Référence d'objet, type référence_________________________________________________________4
2.4.1 Distinguer type valeur et type référence_________________________________________________________4
2.4.2 Comparaison d'objets de de la classe String______________________________________________________8
2.5 Mettre en oeuvre des méthodes surchargées_______________________________________________9
2.6 Mettre en oeuvre des membres statiques__________________________________________________11
2.7 Créer un tableau d'objets et l'utiliser______________________________________________________12
1. Contexte et objectifs
Représenter des animaux sous la forme de classes d'objets peut être utile dans le cadre de la gestion d'un refuge
d'animaux, d'un zoo, d'un cabinet de vétérinaires, etc..
Le cas Les animaux est ici essentiellement mis en oeuvre à des fins pédagogiques et servira de base à
l'introduction d'un certain nombre de concepts de la programmation objet.
2. Dans ce dossier lesAnimaux1, créez un fichier nommé Chat.java et implémentez-y la classe Chat selon le
diagramme de classe et les indications ci-dessous :
Chat
- String nom Légende :
- String race
- LocalDate dateNaissance - private
+ String getNom() + public
+ String getRace()
+ int getAge()
+ Chat(String pNom, String pRace, LocalDate pDateNaissance)
+ String decrire()
Une classe est un type abstrait de données muni d’une implémentation éventuellement partielle.
Un constructeur est une méthode qui définit les actions associées à la création d'un objet.
public int getAge()
{
LocalDate aujourdhui = LocalDate.now();
return Period.between(dateNaissance, aujourdhui).getYears();
}
Nous allons représenter 3 chats et donc créer 3 objets de la classe Chat. L'opération de création d'un objet à partir
d'une classe se nomme l'instanciation. Le résultat de l'instanciation est une instance de classe, en d'autres termes
un objet.
1. créez 3 objets de la classe Chat, vous nommerez les objets felix, sylvestre et isidore. Vous utiliserez les
valeurs affichées ci-dessous dans l'exemple
2. affichez les chats
Exemple d'affichage :
Pour afficher la description du chat Félix dans la fenêtre Console nous avons écrit :
System.out.println(felix.decrire());
felix.decrire() est une demande de service envoyée à l'objet felix. On lui demande de nous transmettre sa
description sous la forme d'une chaine de caractères (String). Cette demande de service envoyée à l'objet felix se
nomme un message.
La méthode decrire connaît donc toujours l’objet sur lequel elle agit, c’est l’objet récepteur du message. Il est
inutile de le passer en paramètre, cet objet précède le point .
Dans le message felix.decrire() l'objet qui reçoit le message est felix. Dans l’implémentation de la méthode
decrire, felix (l’objet qui a reçu le message) est appelé alors objet courant et est désigné par this.
(this peut être assimilé à moi)
Exemple
Envoi de message
System.out.println(felix.decrire());
Type valeur
// type valeur
int nb;
nb = 15;
System.out.printf("\nentier (type valeur) : nb = %d", nb);
int nbDeux = nb;
Mettez un point d'arrêt (breakpoint) à la ligne 21 comme suit. Il suffit de cliquer à gauche du numéro de
ligne :
Exécutez les instructions en mode débogage pour faire apparaitre les informations détaillées :
L'instruction surlignée de jaune n'est pas encore exécutée. On peut observer le contenu des variables au
fur et à mesure dans le volet de gauche (variables) et en surligné jaune dans le code :
la variable nb a comme valeur 15. Ici en mode débogage, VSCode affiche la valeur de la variable.
nb désigne une variable de type valeur. La valeur est directement stockée à l'adresse mémoire indiquée par nb
Comme nb est une variable de type valeur son affichage affiche sa valeur, ici on affiche simplement la valeur 15.
On obtient :
Type référence
// référence d'objet, type référence
Chat picasso;
picasso = new Chat("Picasso", "persan", LocalDate.of(2012, 6, 15));
System.out.printf("\nobjet crée avec new : picasso = %s", picasso);
Chat theodore = picasso;
Exécutez les instructions ci-dessous en mode débogage pour faire apparaitre les informations
détaillées :
picasso désigne la référence de l'objet. L'objet est seulement déclaré et non crée. La référence ne donne
aucune adresse (pointeur null affiché dans un autre EDI :
).
Cliquez sur l'outil "Pas à pas principal"
Après exécution de la ligne 30 (new Chat) la référence d'objet correspond maintenant à une adresse
mémoire. A cette adresse on trouve les valeurs des attributs de l'objet. Ici en mode débogage, VSCode affiche
les valeurs des attributs et des propriétés (accesseurs) dans le volet de gauche.
Comme picasso est une référence d'objet (une adresse en mémoire) son affichage n'a pas de sens
pour l'utilisateur, ici avec un System.out.printf on affiche simplement le type (la classe) de l'objet (suivi d'une
adresse) et non ses attributs.
On obtient :
la variable objet theodore contient maintenant la même référence que picasso et désigne donc le même objet.
La référence d'objet correspond à une adresse mémoire. A cette adresse on trouve les valeurs des attributs
de l'objet.
null
Chat unChat;
unChat
unChat = new Chat("Félix", "persan",
LocalDate.of(2009, 6, 15)); @606d8acf
@606d8acf
@606d8acf
la référence d'objet correspond maintenant à l'adresse
mémoire (simplifiée). Cette adresse se situe dans le 20090615 Félix persan
segment de mémoire nommé le tas. A cette adresse on
trouve les valeurs des attributs de l'objet.
Type référence
Lorsque l’opérateur new est invoqué en association avec un constructeur il renvoie une référence à l'objet
nouvellement alloué et initialisé du type classe.
La référence de l’objet désigne un objet (une instance d’une classe) qui dispose d'un exemplaire
unique des attributs déclarés dans la classe. Elle correspond à l'adresse de l'objet en mémoire centrale.
// ********* particularités classe String
System.out.println("\n\n\n STRING\n");
String salut = "salut";
String salut2 = "salut";
String salut3 = new String("salut");
System.out.printf("\nsalut = %s salut2 = %s salut3 = %s\n\n", salut, salut2, salut3);
System.out.printf("\nsalut != salut2 = %s", salut != salut2); // false
System.out.printf("\nsalut == salut2 = %s", salut == salut2); // true
System.out.printf("\nsalut.equals(salut2) = %s", salut.equals(salut2)); // true
System.out.printf("\nsalut3 != salut2 = %s", salut3 != salut2); // true
System.out.printf("\nsalut3 == salut2 = %s", salut3 == salut2); // false
System.out.printf("\nsalut.equals(salut3) = %s", salut.equals(salut3)); // true
System.out.printf("\nid salut = %d", System.identityHashCode(salut)); // identité objet
System.out.printf("\nid salut2 = %d",System.identityHashCode(salut2));
System.out.printf("\nid salut3 = %d",System.identityHashCode(salut3));
salut2 = "bonjour";
System.out.printf("\n**********\nsalut = %s salut2 = %s", salut, salut2);
System.out.printf("\nsalut != salut2 = %s", salut != salut2); // true
System.out.printf("\nsalut == salut2 = %s", salut == salut2); // false
System.out.printf("\nsalut.equals(salut2) = %s", salut.equals(salut2)); // false
System.out.printf("\nid salut = %d", System.identityHashCode(salut));
System.out.printf("\nid salut2 = %d",System.identityHashCode(salut2));
System.out.printf("\nid salut3 = %d",System.identityHashCode(salut3));
// == compare les références d'objets
// equals compare les valeurs des objets. La méthode equals() permet de tester l'égalité de
deux objets d'un point de vue sémantique.
2. Exécutez, vous obtenez les résultats des tests comme indiqué dans les commentaires.
5. Conserver le cri de chaque chat en créant un nouvel attribut dans la classe Chat,
Ajoutez l'attribut (le champ) cri dans la classe Chat :
public class Chat {
// champs, attributs
private String nom;
Classe Chat
private String race;
private LocalDate dateNaissance;
private String cri;
// constructeur surchargé
// = redéfini avec le même nom mais une liste de paramètres différente
Créer le public Chat(String pNom, String pRace, LocalDate pDateNaissance, String pCri) {
constructeur
nom = pNom;
ci contre
race = pRace;
(B) dateNaissance = pDateNaissance;
cri = pCri;
}
// constructeur surchargé
// = redéfini avec le même nom mais une liste de paramètres différente
constructeur public Chat(String pNom, String pRace, LocalDate pDateNaissance) {
de la classe
nom = pNom;
Chat
race = pRace;
(A) dateNaissance = pDateNaissance;
cri = "Miaou";
}
Le constructeur qui sera exécuté lors de la création d'un objet Chat sera celui qui correspond à la liste de
paramètres à l'appel
Chat felix = new Chat("Félix", "persan", LocalDate.of(2009, 6, 15));
Le constructeur (A) est exécuté
public String miauler() {
return cri + " !";
}
// méthode surchargée = redéfinie avec le même nom mais une liste de paramètres différente
public String miauler(int nombre) {
String uneChaine = "";
if (nombre > 0) {
for (int i = 1; i <= nombre; i++) {
uneChaine += cri + " ";
}
}
return uneChaine;
}
Dès que vous saisissez le point après le nom d'un objet Chat, Visual Studio Code affiche la liste des possibilités. Les
deux versions de la méthode miauler sont bien présentées :
// invoquer méthode surchargée
System.out.printf("\nAppel felix.miauler() : %s", felix.miauler());
System.out.printf("\nAppel felix.miauler(5) : %s", felix.miauler(5));
System.out.printf("\nAppel tigrou.miauler() : %s", tigrou.miauler());
System.out.printf("\nAppel tigrou.miauler(5) : %s", tigrou.miauler(5));
vous obtenez :
Définition :
Une méthode redéfinie avec une autre liste d’arguments est appelée une méthode surchargée.
Observons le constructeur
public Chat(String pNom, String pRace, LocalDate pDateNaissance) {
nom = pNom;
race = pRace;
dateNaissance = pDateNaissance;
cri = "Miaou";
}
On constate qu'un littéral "Miaou" y est utilisé. En fait il s'agit du cri par défaut pour un chat. C'est une sorte de
constante. Le "Miaou" n'est pas propre à un chat en particulier, mais à tous les chats, c'est-à-dire à la notion même
de chat. Ainsi, il serait préférable de définir le "Miaou" comme tel, c'est-à-dire comme un attribut de la classe Chat.
C'est possible en le définissant comme un attribut statique. Comme les autres classes ne sont pas autorisées à
accéder à ce champ, nous allons le protéger en le déclarant comme un membre privé de la classe Chat ( private).
// champ statique (à portée classe et non instance)
private static String Miaulement = "Miaou";
// constructeur surchargé = redéfini avec le même nom mais une liste de paramètres différente
public Chat(String pNom, String pRace, LocalDate pDateNaissance) {
nom = pNom;
race = pRace;
dateNaissance = pDateNaissance;
cri = Chat.Miaulement;
}
Remarques :
La déclaration d’un membre statique est précédée du mot réservé : static.
Comme un membre statique a une portée classe et non instance, son invocation prend la forme :
BLOC2 Programmation objet : cas lesAnimaux1 Marianne Delio page 11/12
nom_classe.nom_membre_statique
Un membre statique d’une classe est invoqué sans création préalable d’un objet de la classe.
L'attribut statique miaulement est privé et ne peut donc être utilisé que dans le corps de la classe Chat. Afin de
permettre l'accès en lecture aux autres classes, nous allons créer un accesseur en lecture .
// méthode statique (à portée classe et non instance)
public static String getMiaulement() {
return Chat.Miaulement;
}
Appelez cet accesseur (un accesseur est également une méthode) dans le programme
// invoquer accesseur statique
System.out.printf("\nAppel méthode Chat.getMiaulement : %s\n", Chat.getMiaulement());
Observez que les membres statiques ne sont pas proposés pour un objet (une instance de classe) :
Observez que les membres d'instance ne sont pas proposés pour la classe :
1. Dans le programme, déclarer un tableau de 3 chats et remplissez le tableau avec les 3 chats crées
précédemment.
2. Afficher la description de chaque chat en parcourant le tableau avec un for
3. Afficher le nombre de chats en utilisant le nombre d'éléments du tableau
4. Afficher la description de chaque chat en parcourant le tableau avec un foreach
5. Parcourir le tableau pour calculer et afficher la moyenne d'âge des chats
6. Parcourir le tableau pour chercher le chat le plus jeune et afficher son nom et son âge.