La classe racine Object
La classe Object est la superclasse fondamantale de toutes les classes Java. Elle se trouve au sommet de l'arborescence d'héritage. Toute classe qui n'utilise pas le mot-clé extends pour hériter explicitement d'une autre classe hérite implicitement de Object. Dans le cas contraire, l'héritage est indirect.
Les méthodes définies dans la classe Object sont disponibles pour tous les objets Java.
Le type Object peut référencer n'importe quel objet, ce qui permet de :
- L'utiliser comme paramètre acceptant tout type d'objet
- L'utiliser comme type de retour pour renvoyer n'importe quel objet
La méthode getClass()
public final Class<?> getClass()
Cette méthode retourne la classe réelle de l'objet référencé. Elle est souvent employée pour vérifier si deux références pointent vers des objets de même type.
public class Etudiant {
private String nom;
private int age;
public Etudiant(String nom, int age) {
this.nom = nom;
this.age = age;
}
public String getNom() { return nom; }
public void setNom(String nom) { this.nom = nom; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
}
public class TestClasse {
public static void main(String[] args) {
Etudiant e1 = new Etudiant("Alice", 20);
Etudiant e2 = new Etudiant("Bob", 22);
Class c1 = e1.getClass();
Class c2 = e2.getClass();
if (c1 == c2) {
System.out.println("e1 et e2 sont du même type");
} else {
System.out.println("e1 et e2 sont de types différents");
}
}
}
/*
Affiche : e1 et e2 sont du même type
*/
La méthode hashCode()
public int hashCode()
Retourne une valeur de hachage pour l'objet. Cette valeur est un entier (int) calculé par un algorithme de hachage basé sur l'adresse mémoire, une chaîne de caractères ou un nombre.
En principe, deux objets identiques (selon la méthode equals()) produisent la même valeur de hachage.
public class TestHashCode {
public static void main(String[] args) {
Etudiant e1 = new Etudiant("Alice", 20);
Etudiant e2 = new Etudiant("Bob", 22);
System.out.println(e1.hashCode());
System.out.println(e2.hashCode());
Etudiant e3 = e1;
System.out.println(e3.hashCode());
}
}
/*
Exemple de sortie :
460141958
1163157884
460141958
*/
La méthode toString()
public String toString()
Retourne une représentation textuelle de l'objet. On peut la redéfinir pour afficher les attributs de l'objet de manière personnalisée.
La méthode equals()
public boolean equals(Object obj)
Par défaut, cette méthode compare les adresses mémoire (this == obj). On peut la surcharger pour comparer le contenu des objets.
Étapes pour une surcharge correcte de equals() :
- Vérifier si les deux références pointent vers le même objet
- Vérifier si l'argument est
null - Vérifier si les deux objets sont du même type
- Effectuer un transtypage (cast) vers le type approprié
- Comparer chaque attribut pertinetn
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (obj instanceof Etudiant) {
Etudiant autre = (Etudiant) obj;
if (this.nom.equals(autre.getNom()) && this.age == autre.getAge()) {
return true;
}
}
return false;
}
Etudiant e1 = new Etudiant("Claire", 10);
Etudiant e2 = new Etudiant("Claire", 10);
System.out.println(e1.equals(e2));
// true
La méthode finalize()
protected void finalize() throws Throwable
Cette méthode est appelée par le ramasse-miettes (garbage collector) lorsqu'un objet est considéré comme pouvant être récupéré. Un objet est éligible au ramassage lorsqu'aucune référence active ne pointe vers lui.
Le ramassage peut être :
- Automatique : déclenché par la JVM lorsque la mémoire est insuffisante
- Manuel : via l'appel à
System.gc()
protected void finalize() throws Throwable {
System.out.println(this.nom + " est en cours de récupération");
}
public class TestFinalisation {
public static void main(String[] args) {
new Etudiant("Alice", 20);
new Etudiant("Bob", 22);
new Etudiant("Charlie", 21);
System.gc();
System.out.println("Nettoyage demandé");
}
}
/*
Exemple de sortie :
Nettoyage demandé
Bob est en cours de récupération
Charlie est en cours de récupération
Alice est en cours de récupération
*/