Troisième partie
Encore des objets
Objectifs d'apprentissage
- Approfondir les notions liées à la programmation orientée objet
- Résoudre des problèmes à l'aide de Java
Rappel :
Variable d’instance vs variable de classe
Les variables d’instance sont liées à une instance de la classe. Ainsi, à chaque fois que l’on crée une nouvelle instance de la classe (un nouvel objet), une nouvelle copie de cette variable d’instance est créée.
Les variables de classe (aussi connu sous le nom de variable static) sont associées à la classe elle-même. Il n'en existe qu’une seule copie qui est partagée par toutes les instances (objets) de cette classe.
public class Person {
String firstName; //instance variable
String lastName; //instance variable
[...]
static int numberOfPersons = 0 //class variable
}
Variable privée
Une variable privée (private) est une variable qui ne peut être accédée que par la classe elle-même. Elle ne peut pas être accédée par une autre classe. Il faut donc utiliser des « setters » et des « getters » afin de pouvoir interagir avec cette variable. L'utilisation de variables privées est une bonne pratique à suivre. Il est donc important que vous déclariez vos variables d'instance « private » dans vos devoirs et dans vos examens si vous ne voulez pas perdre de points.
Note : Parfois, un paramètre peut avoir le même nom qu’une variable d’instance. Pour faire la différence entre les deux, on utilise le mot clé this afin de faire référence à la variable de classe ; this indique l’objet dans lequel le code est exécuté
public class Person {
private String firstName; //this variable is private
private String lastName; //this variable is private
[...]
static int numberOfPersons = 0
[...]
//example of a getter
public String getFirstName(){
return firstName; //Here we do not need to use "this"
}
//example of a setter
public void setFirstName(String firstName){
this.firstName = firstName; //Here we need to use the keyword "this"
}
}
Constructeurs
Un constructeur est une méthode unique qui est appelée lorsqu’une instance de la classe est créée (à aucun autre moment, le constructeur n'est appelé). Cette méthode permet d’initialiser la classe et les variables d’instance nécessaires. La méthode doit avoir le même nom que la classe et ne pas avoir de type de retour.
Une classe peut avoir plusieurs constructeurs dont le nombre de paramètres diffère (l'arité). Les constructeurs peuvent également être appelés explicitement à partir d'un constructeur différent, à l'aide du mot-clé this. Cette appel doit toujours être la première instruction dans le constructeur.
public class Person {
private String firstName; //this variable is private
private String lastName; //this variable is private
private String username; //this variable is private
[...]
static int numberOfPersons = 0;
[...]
//example of a constructor with a default value
public Person(String firstName, String lastName){
//no code before this call
this(firstName, lastName, firstName + "." + lastName);
//possibly more code here
}
//example of a constructor
public Person(String firstName, String lastName, String username){
this.firstName = firstName;
this.lastName = lastName;
this.username = username;
}
//example of a getter
public String getFirstName(){
return firstName; //Here we do not need to use "this"
}
//example of a setter
public void setFirstName(String firstName){
this.firstName = firstName; //Here we need to use the keyword "this"
}
}
2. Rational
Vous allez soumettre cet exercice. Téléchargez et complétez le fichier de démarrage ici: Rational.java.
Vous devez implémenter une classe Rational afin de représenter des nombres rationnels. Un nombre rationnel comporte un numérateur et un dénominateur, tous deux de type int. Puisque chaque nombre possède son propre numérateur et dénominateur, ces variables sont des variables d'instance. De plus, nous prenons la bonne habitude de déclarer ces variables privées.
2.1 Constructeurs
La class Rational possède deux constructeurs. L'un d'eux a deux paramètres formels, dont les valeurs servent pour l'initialisation des variables d'instance. L'autre constructeur n'a qu'un paramètre, il s'agit du numérateur ; la valeur du dénominateur est alors 1.
2.2 Méthodes d'accès
Implémentez des méthodes d'accès « getters », en lecture seulement, afin de retourner la valeur du numérateur et la valeur du dénominateur respectivement. Un objet qui n'a pas de méthodes d'accès en écriture, « setters », et aucune autre méthode afin de changer l'état de l'objet, est dit immuable. C'est une propriété fort intéressante. Discutez-en avec vos voisins et votre démonstrateur.
2.3 plus
Implémentez la méthode d'instance plus. Cette méthode n'a qu'un paramètre formel, de type Rational. La méthode retourne un nouvel objet Rational qui représente la somme de l'objet rational « this » avec celui passé en paramètre.
2.4 plus (partie 2)
Implémentez la méthode de classe plus. Cette méthode possède deux paramètres formels, tous les deux de type Rational. La méthode retourne un nouvel objet représentant la somme des deux valeurs.
2.5 gcd
Implémentez une méthode de classe privée afin de calculer le plus grand diviseur commun de deux nombres passés en paramètres.
2.6 reduce
Implémentez une méthode d'instance privée que vous nommerez reduce et qui transforme cette instance en sa forme réduite. (ex: 18/4 -> 9/2)
2.7 reduce (partie 2)
Effectuez les changements nécessaires pour que la classe sauvegarde toujours le nombre rationnel sous sa forme réduite.
2.8 equals
Implémentez la méthode d'instance public boolean equals( Rational o) qui retourne vrai si cette fraction et celle désignée par le paramètre représentent la même fraction au sens logique, et faux sinon.
2.9 toString
Implémentez une méthode public String toString() qui retourne une chaîne de caractères représentant cette fraction. Le format sera numérateur suivi de « / » suivi du dénominateur, ou encore, simplement le numérateur, si le dénominateur est 1.
2.10 compareTo
Implémentez la méthode d'instance int compareTo( Rational o). Celle-ci compare cet objet (this) et celui désigné par le paramètre « o » et retourne un entier négatif, si cette fraction est plus petite que celle désignée par le paramètre, 0 si elles sont égales, et un entier positif sinon.