overriding predefined methods java
Ce tutoriel explique comment remplacer des méthodes prédéfinies telles que equals (), hashCode (), compareTo (), etc. en Java avec des exemples:
Dans notre tutoriel précédent, nous avons abordé le polymorphisme d'exécution en Java. Le polymorphisme d'exécution en Java est implémenté en utilisant le remplacement de méthode. Le remplacement de méthode implique la redéfinition de la méthode de classe parente dans la sous-classe.
Java a diverses méthodes prédéfinies comme equals (), hashCode (), compareTo (), toString (), etc. qui sont couramment utilisées pour les objets généraux, quelle que soit la classe à laquelle ils appartiennent. Mais pour que ces méthodes fonctionnent pour tous les objets, nous devons remplacer ces méthodes ou redéfinir leurs implémentations afin qu'elles puissent fonctionner avec les données souhaitées.
=> Visitez ici pour apprendre Java à partir de zéro.
Dans ce didacticiel, nous discuterons de la substitution de toutes ces méthodes ainsi que des conséquences si nous ne remplaçons pas ces méthodes.
Ce que vous apprendrez:
- Remplacer les méthodes equals () et hashCode () en Java
- Remplacer la méthode statique en Java
- Remplacer compareTo () en Java
- Remplacer la méthode toString () en Java
- Questions fréquemment posées
- Conclusion
- lecture recommandée
Remplacer les méthodes equals () et hashCode () en Java
Nous utilisons la méthode equals () en Java pour comparer deux objets. Cette méthode renvoie true lorsque les objets sont égaux et false lorsqu'ils ne sont pas égaux.
Deux méthodes sont utilisées pour comparer l'égalité de deux objets.
# 1) Comparaison superficielle
La comparaison superficielle est l'implémentation par défaut de la méthode equals () définie dans la classe «java.lang.Object». Dans le cadre de cette implémentation, la méthode equals () vérifiera si deux objets comparés ont des références faisant référence au même objet.
Cela signifie que si obj1 et obj2 sont deux objets, alors l'implémentation par défaut de la méthode equals () (comparaison superficielle) vérifiera uniquement si les références de obj1 et obj2 proviennent du même objet.
Dans une comparaison superficielle, aucun contenu de données n'est comparé.
convertisseurs vidéo gratuits pour windows 10
# 2) Comparaison approfondie
En comparaison approfondie, nous comparons les données membres de chaque objet, c'est-à-dire que les objets sont comparés par rapport à l'état. Nous comparons donc les objets à un niveau profond, y compris son contenu.
Pour comparer les objets à l'aide de la comparaison approfondie, nous remplaçons généralement la méthode equals ().
Considérons maintenant le programme Java suivant.
class Complex { private double r, i; //declare real and imaginary component as private public Complex(double r, double i) { //constructor this.r = r; this.i = i; } } public class Main { public static void main(String() args) { Complex c1 = new Complex(5, 10); //c1 object Complex c2 = new Complex(5, 10); //c2 object if (c1 == c2) { System.out.println('Two Complex objects are Equal '); } else { System.out.println('Two Complex objects are not Equal '); } } }
Production:
Si nous voyons la sortie du programme ci-dessus, cela indique que les objets ne sont pas égaux même si le contenu des deux objets est le même. En effet, lorsque l'égalité est vérifiée, il est déterminé si les deux objets c1 et c2 font référence au même objet.
Comme on le voit dans le programme c1 et c2 sont deux objets différents, donc ce sont des références différentes et il en résulte ainsi.
Créons maintenant une troisième référence c3 et assimilons-la à c1 comme suit:
Complexe c3 = c1;
Dans ce cas, c3 et c1 feront référence au même objet, et par conséquent (c3 == c1) renverra true.
Ce que le programme ci-dessus a fait était la comparaison superficielle. Alors, comment vérifier si deux objets sont identiques en termes de contenu?
Ici, nous allons pour une comparaison approfondie, et dans ce but, nous remplaçons la méthode equals ().
Le programme suivant montre le remplacement de la méthode equals (). Nous utilisons la même classe Complex.
class Complex { private double r, i; public Complex(double r, double i) { this.r = r; this.i = i; } // override equals () method to compare two complex objects @Override public boolean equals(Object obj) { // returns true=>object is compared to itself if (obj == this) { return true; } //return false if obj is not an instance of Complex class if (!(obj instanceof Complex)) { return false; } // typecast obj to Complex type Complex c = (Complex) obj; // Compare the contents of two objects and return value return Double.compare(r, c.r) == 0 && Double.compare(i, c.i) == 0; } } public class Main { public static void main(String() args) { Complex c1 = new Complex(5, 10); Complex c2 = new Complex(5, 10); if (c1.equals(c2)) { System.out.println('Complex objects c1 and c2 are Equal '); } else { System.out.println('Complex objects c1 and c2 are not Equal '); } } }
Production:
Maintenant que nous avons une méthode equals () remplacée, lorsque nous comparons deux objets, la sortie montre que les deux objets sont égaux car leur contenu est le même. Notez la méthode equals () remplacée. Ici, nous vérifions si les deux objets ont la même référence. Sinon, nous vérifions individuellement le contenu de ces objets.
En Java, chaque fois que nous surchargons la méthode equals (), il est conseillé de surcharger également la méthode hashCode (). En effet, si nous ne remplaçons pas la méthode hashCode (), alors chaque objet peut avoir un hashCode différent.
Cela ne peut pas interférer avec les objets généraux, mais certaines collections basées sur le hachage comme HashTable, HashSet et HashMap peuvent ne pas fonctionner correctement.
Le programme suivant montre les méthodes equals () et hashCode () remplacées.
import java.io.*; import java.util.*; class EqualsHashCode { String name; int id; EqualsHashCode(String name, int id) { this.name = name; this.id = id; } @Override public boolean equals(Object obj) @Override public int hashCode() { // return current object's id as hashCode return this.id; } } class Main { public static void main (String() args) { // create two objects with same state EqualsHashCode e1 = new EqualsHashCode('Java', 1); EqualsHashCode e2 = new EqualsHashCode('Java', 1); //update the objects Map map = new HashMap(); map.put(e1, 'C++'); map.put(e2, 'Python'); //display contents for(EqualsHashCode eh : map.keySet()) { System.out.println(map.get(eh).toString()); } } }
Production:
Dans ce programme, nous utilisons un hashMap. Nous avons remplacé les méthodes equals () et hashCode (). Ainsi, quand nous disons map.put (e1, «C ++»), il hache vers un emplacement de compartiment. Ensuite, nous appelons un map.put (e2, «Python»). Cette fois, il hachera dans le même compartiment et remplacera la valeur précédente. C'est parce que nous avons remplacé la méthode hashCode ().
Remplacer la méthode statique en Java
Pouvons-nous remplacer la méthode statique en Java?
En ce qui concerne le remplacement de la méthode statique en Java, la réponse directe à cette question est Non, nous ne pouvons pas remplacer la méthode statique.
La méthode statique est appelée en utilisant le nom de classe lui-même. Nous n'avons pas besoin d'un objet pour appeler une méthode statique. Donc, même si nous déclarons une méthode avec le même prototype dans une sous-classe, nous ne pouvons pas l'appeler overriding. Au lieu de cela, nous masquons simplement la définition de classe parente de la méthode statique.
Le programme Java suivant montre la méthode statique et la méthode non statique dans un système d'héritage ainsi que leur comportement à l'exécution.
class Parent { // Parent class static method cannot be overridden by Child public static void display() { System.out.println('Parent class::static display()'); } // parent class non-static print method to be overridden by Child public void print() { System.out.println('Parent class::non-static print()'); } } // Subclass class Child extends Parent { // static display() method =>hides display() in Parent class public static void display() { System.out.println('Child class:: static display()'); } //overrides print() in Parent class public void print() { System.out.println('Child class::Non-static print()'); } } public class Main { public static void main(String args( )) { Parent new_obj = new Child(); // static methods are call as per the reference type. Since reference type //Parent, this call will execute Parent class's display method new_obj.display(); // here the print () method of Child class is called new_obj.print(); } }
Production:
À partir de la sortie du programme, nous pouvons conclure ce qui suit.
- L'appel à la méthode statique est toujours effectué en fonction du type de référence. Par conséquent, lorsque nous avons appelé new_obj. display () dans le programme ci-dessus, comme la référence new_obj est de type classe Parent, la méthode display () de la classe Parent est appelée.
- D'autre part, les méthodes non statiques sont appelées en fonction du contenu de l'objet de référence avec lequel la méthode est appelée. Par conséquent, dans le programme ci-dessus, la méthode new_obj.print () appelle la méthode print () de la classe enfant car le contenu new_obj est l'objet de la classe enfant.
Cela explique la sortie du programme ci-dessus et nous devons également nous souvenir des points suivants lorsque nous traitons des méthodes statiques dans le système OOP.
- Une méthode statique ne peut pas masquer une méthode d'instance non statique et une méthode d'instance non statique ne peut pas remplacer une méthode statique.
- Nous pouvons surcharger les méthodes de la classe parente dans une sous-classe mais elles ne remplacent ni ne masquent les méthodes de la classe parente, mais ce sont de nouvelles méthodes dans la sous-classe.
Remplacer compareTo () en Java
Nous savons que l’interface java.lang.Comparable fournit une méthode ‘compareTo ()’ qui nous permet de trier les objets dans un ordre naturel comme l’ordre lexical pour les objets String, l’ordre numérique pour les entiers, etc.
Pour implémenter le tri dans les objets ou les collections définis par l'utilisateur, nous devons remplacer la méthode compareTo () pour trier les éléments de collection ou les objets définis par l'utilisateur.
Alors, que fait une méthode compareTo ()?
Une méthode compareTo () doit renvoyer une valeur positive si l'objet actuel est supérieur à l'objet passé dans l'ordre et si la valeur négative de l'objet actuel est inférieure à l'objet passé. Si les deux objets sont égaux, la méthode compareTo () renverra zéro.
Un autre point à noter est que la méthode equals () et compareTo () doivent se comporter de manière cohérente l'une avec l'autre. Cela signifie que si la méthode compareTo () retourne que deux objets sont égaux (renvoie zéro), nous devrions également avoir la même sortie de la méthode equals ().
Implémentons un programme Java qui remplace la méthode compareTo (). Dans ce programme, nous utilisons une classe Color qui a deux variables privées, c'est-à-dire name et id. Nous avons associé le 'id' à chaque couleur et nous remplacerons la méthode compare () pour organiser les couleurs en fonction de l'identifiant.
import java.util.*; //color class class Color implements Comparator, Comparable { private String name; private int id; Color() { } Color(String n, int id) { this.name = n; this.id = id; } public String getColorName() { return this.name; } public int getColorId() { return this.id; } // Overriding the compareTo method @Override public int compareTo(Color c) { return (this.name).compareTo(c.name); } // Overriding the compare method to sort the colors on id @Override public int compare(Color c, Color c1) { return c.id - c1.id; } } public class Main { public static void main(String args()) { // List of Colors List list = new ArrayList(); list.add(new Color('Red', 3)); list.add(new Color('Green', 2)); list.add(new Color('Blue', 5)); list.add(new Color('Orange', 4)); list.add(new Color('Yellow', 1)); Collections.sort(list); // Sorts the array list System.out.println('The list of colors:'); for(Color c: list) // print the sorted list of colors System.out.print(c.getColorName() + ', '); // Sort the array list using comparator Collections.sort(list, new Color()); System.out.println(' '); System.out.println('The sorted list of colors:'); for(Color c: list) // print the sorted list of colors as per id System.out.print(c.getColorId() + ':' + c.getColorName() + ' , '); }
Production:
Dans la sortie ci-dessus, nous affichons d'abord la liste des couleurs, puis la liste triée des couleurs. Dans le programme, nous avons remplacé les méthodes compareTo () et compare ().
Remplacer la méthode toString () en Java
La méthode «toString ()» renvoie la représentation String d'un objet en Java. Mais lorsque nous avons des objets définis par l'utilisateur, cette méthode peut se comporter différemment.
Par exemple,considérez le programme suivant.
class Complex { private double r, i; public Complex(double r, double i) { this.r = r; this.i = i; } } public class Main { public static void main(String() args) { Complex c1 = new Complex(5, 20); //create complex class Object //print the contents of complex number System.out.println('Complex number contents: ' + c1); } }
Production:
Comme indiqué dans ce programme, nous affichons l'objet de classe Complex que nous avons défini précédemment. Cependant, la sortie affichée n’est pas le contenu mais elle est plutôt cryptique.
La sortie affiche un nom de classe Complex suivi du caractère «@», puis du hashCode de l'objet. Il s'agit de la sortie par défaut imprimée par la méthode toString () de la classe Object.
Si nous voulons la bonne sortie, nous devons remplacer la méthode toString () dans notre application.
Le programme Java suivant montre comment remplacer la méthode toString () pour imprimer le contenu de l'objet Complex.
class Complex { private double r, i; public Complex(double r, double i) { this.r = r; this.i = i; } //override toString () method to return String representation of complex number @Override public String toString() { return String.format(r + ' + i ' + i); } } public class Main { public static void main(String() args) { Complex c1 = new Complex(10, 15); System.out.println('Complex Number contents: ' + c1); } }
Production:
Le programme ci-dessus montre que la méthode toString () est surchargée pour renvoyer le contenu de l'objet Complex dans le format donné (réel + i * imaginaire).
En général, lorsque nous voulons afficher l'objet de classe à l'aide de print () ou println (), il est toujours conseillé de remplacer la méthode toString () afin d'obtenir le bon résultat.
Questions fréquemment posées
Q # 1) Pourquoi utiliser .equals au lieu de == Java?
Répondre: Nous utilisons «==» pour comparer des types primitifs comme int, char, boolean, etc. Nous utilisons equals () pour comparer des objets (prédéfinis ou définis par l'utilisateur). Nous remplaçons généralement la méthode equals () pour comparer deux objets et la valeur de retour de equals () dépend du code remplacé.
Q # 2) À quoi servent hashCode () et equals ()?
Répondre: En Java, la méthode equals () est utilisée pour comparer l'égalité de deux objets. La méthode hashCode () renvoie le hashCode de l'objet. Alors que la méthode equals () est utilisée avec la plupart des objets pour tester leur égalité, le hashCode est principalement utilisé dans les collections de hachage comme HashTable, HashMap, HashSet, etc.
Q # 3) Pouvons-nous changer la liste des arguments de la méthode remplacée?
Répondre: Non. Lorsque nous remplaçons la méthode, nous conservons la signature de méthode ou le prototype de la méthode identique dans la sous-classe également. Nous ne pouvons donc pas modifier le nombre de paramètres dans la méthode remplacée.
Q # 4) Pourquoi remplaçons-nous toString ()?
Répondre: Lorsque la méthode toString () est surchargée, nous pouvons renvoyer les valeurs de l'objet pour lequel la méthode toString () est surchargée sans écrire trop de code. C'est parce que le compilateur java invoque la méthode toString () lorsque nous imprimons un objet.
Q # 5) Que se passerait-il si vous ne remplaciez pas la méthode toString ()?
meilleur nettoyeur et optimiseur de pc gratuit
Répondre: Si nous ne remplaçons pas la méthode toString (), nous n'obtiendrons aucune information sur les propriétés ou l'état de l'objet. Nous ne saurons pas ce qu'il y a réellement à l'intérieur de l'objet. Ainsi, toutes les classes doivent remplacer la méthode toString ().
En effet, l'implémentation par défaut de la méthode toString () affiche la représentation String mais lorsque nous utilisons l'implémentation toString () par défaut sur l'objet, nous n'obtiendrons pas le contenu de l'objet.
Conclusion
Dans ce tutoriel, nous avons discuté de la substitution de quelques méthodes Java prédéfinies et nous avons également vu pourquoi nous devons les remplacer.
Lorsque nous traitons des objets, les implémentations par défaut de méthodes telles que equals (), compareTo () et toString () peuvent ne pas donner les informations correctes. Par conséquent, nous allons pour la priorité.
=> Jetez un œil au guide du débutant Java ici.
lecture recommandée
- Tutoriel Java String | Méthodes de chaîne Java avec exemples
- Threads Java avec méthodes et cycle de vie
- Méthode Java String length () avec exemples
- Inverser un tableau en Java - 3 méthodes avec des exemples
- Comment utiliser la méthode Java toString?
- Méthode Java String indexOf avec exemples de code
- Tutoriel sur la méthode Java String contains () avec des exemples
- Méthode Java String Split () - Comment diviser une chaîne en Java