overriding predefined methods java
Αυτό το σεμινάριο εξηγεί πώς να παρακάμψετε προκαθορισμένες μεθόδους όπως ισούται με (), hashCode (), membandingkanTo () κ.λπ. στην Java με παραδείγματα:
Στο προηγούμενο σεμινάριό μας, συζητήσαμε τον πολυμορφισμό χρόνου εκτέλεσης στην Java. Ο πολυμορφισμός χρόνου εκτέλεσης στην Java εφαρμόζεται με χρήση μεθόδου παράκαμψης. Η παράκαμψη μεθόδου περιλαμβάνει τον επαναπροσδιορισμό της μεθόδου γονικής κλάσης στην υποκατηγορία.
Η Java έχει διάφορες προκαθορισμένες μεθόδους όπως ίσες (), hashCode (), membandingkanTo (), toString () κ.λπ. που χρησιμοποιούνται συνήθως για γενικά αντικείμενα ανεξάρτητα από την κατηγορία στην οποία ανήκουν. Αλλά για να λειτουργήσουν αυτές οι μέθοδοι για όλα τα αντικείμενα, πρέπει να παρακάμψουμε αυτές τις μεθόδους ή να επαναπροσδιορίσουμε τις υλοποιήσεις τους, ώστε να μπορούν να λειτουργήσουν με τα δεδομένα που θέλουμε.
=> Επισκεφθείτε εδώ για να μάθετε Java από το μηδέν.
Σε αυτό το σεμινάριο, θα συζητήσουμε την παράκαμψη όλων αυτών των μεθόδων μαζί με τις συνέπειες εάν δεν παρακάμψουμε αυτές τις μεθόδους.
Τι θα μάθετε:
- Μέθοδοι υπέρβασης ισούται με () και hashCode () σε Java
- Παράκαμψη στατικής μεθόδου στην Java
- Παράκαμψη σύγκρισηTo () Στην Java
- Παράκαμψη της μεθόδου toString () σε Java
- Συχνές Ερωτήσεις
- συμπέρασμα
- Συνιστώμενη ανάγνωση
Μέθοδοι υπέρβασης ισούται με () και hashCode () σε Java
Χρησιμοποιούμε τη μέθοδο equals () στην Java για να συγκρίνουμε δύο αντικείμενα. Αυτή η μέθοδος επιστρέφει αληθινή όταν τα αντικείμενα είναι ίδια και ψευδής όταν δεν είναι ίδια.
Χρησιμοποιούνται δύο τρόποι για τη σύγκριση της ισότητας δύο αντικειμένων.
# 1) Ρηχή σύγκριση
Η ρηχή σύγκριση είναι η προεπιλεγμένη εφαρμογή για τη μέθοδο ίσο () που ορίζεται στην κλάση 'java.lang.Object'. Ως μέρος αυτής της εφαρμογής, η μέθοδος equals () θα ελέγξει εάν δύο αντικείμενα που συγκρίνονται έχουν αναφορές που αναφέρονται στο ίδιο αντικείμενο.
Αυτό σημαίνει ότι εάν τα obj1 και obj2 είναι δύο αντικείμενα, τότε η προεπιλεγμένη εφαρμογή της μεθόδου ίσο () (ρηχή σύγκριση) θα ελέγξει μόνο εάν οι αναφορές obj1 και obj2 προέρχονται από το ίδιο αντικείμενο.
Σε ρηχή σύγκριση, δεν συγκρίνονται περιεχόμενα δεδομένων.
# 2) Βαθιά σύγκριση
Σε βαθιά σύγκριση, συγκρίνουμε τα μέλη δεδομένων κάθε αντικειμένου, δηλαδή τα αντικείμενα συγκρίνονται σε σχέση με την κατάσταση. Έτσι συγκρίνουμε τα αντικείμενα σε βαθύ επίπεδο, συμπεριλαμβανομένων των περιεχομένων του.
Για να συγκρίνουμε τα αντικείμενα χρησιμοποιώντας βαθιά σύγκριση συνήθως παρακάμπτουμε τη μέθοδο ίσο ().
Τώρα εξετάστε το ακόλουθο πρόγραμμα Java.
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 '); } } }
Παραγωγή:
Αν δούμε την έξοδο του παραπάνω προγράμματος, λέει ότι τα αντικείμενα δεν είναι ίδια παρόλο που το περιεχόμενο των δύο αντικειμένων είναι το ίδιο. Αυτό συμβαίνει επειδή, όταν ελέγχεται η ισότητα, καθορίζεται εάν τα δύο αντικείμενα c1 και c2 αναφέρονται στο ίδιο αντικείμενο.
Όπως φαίνεται στο πρόγραμμα, τα c1 και c2 είναι δύο διαφορετικά αντικείμενα, οπότε είναι διαφορετικές αναφορές και έτσι προκύπτει έτσι.
Τώρα ας δημιουργήσουμε μια τρίτη αναφορά c3 και να την εξισώσουμε με το c1 ως εξής:
Σύμπλοκο c3 = c1;
Σε αυτήν την περίπτωση, τα c3 και c1 θα αναφέρονται στο ίδιο αντικείμενο, και ως εκ τούτου (c3 == c1) θα επιστρέψουν αληθινά.
Αυτό που έκανε το παραπάνω πρόγραμμα ήταν η ρηχή σύγκριση. Πώς μπορούμε λοιπόν να ελέγξουμε εάν δύο αντικείμενα έχουν το ίδιο περιεχόμενο;
Εδώ, πηγαίνουμε για μια βαθιά σύγκριση, και για αυτόν τον σκοπό, παρακάμπτουμε τη μέθοδο ίσο ().
Το ακόλουθο πρόγραμμα δείχνει την παράκαμψη της μεθόδου ίσο (). Χρησιμοποιούμε την ίδια κατηγορία 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 '); } } }
Παραγωγή:
Τώρα που έχουμε μια μέθοδο παράκαμψης ίσων (), όταν συγκρίνουμε δύο αντικείμενα, η έξοδος δείχνει ότι τα δύο αντικείμενα είναι ίδια καθώς το περιεχόμενό τους είναι το ίδιο. Σημειώστε τη μέθοδο παράκαμψης ισούται με (). Εδώ ελέγχουμε αν και τα δύο αντικείμενα έχουν την ίδια αναφορά. Εάν όχι, ελέγξουμε μεμονωμένα το περιεχόμενο αυτών των αντικειμένων.
Στην Java, κάθε φορά που παρακάμπτουμε τη μέθοδο equals (), συνιστάται να παρακάμψετε τη μέθοδο hashCode (). Αυτό συμβαίνει επειδή εάν δεν παρακάμψουμε τη μέθοδο hashCode (), τότε κάθε αντικείμενο μπορεί να έχει διαφορετικό hashCode.
Αυτό ενδέχεται να μην επηρεάζει τα γενικά αντικείμενα, αλλά ορισμένες συλλογές που βασίζονται σε κατακερματισμούς όπως HashTable, HashSet και HashMap ενδέχεται να μην λειτουργούν σωστά.
Το ακόλουθο πρόγραμμα δείχνει τις μεθόδους ίσον () και hashCode ().
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()); } } }
Παραγωγή:
Σε αυτό το πρόγραμμα, χρησιμοποιούμε ένα hashMap. Έχουμε παρακάμψει και τις δύο μεθόδους ίσο () και hashCode (). Έτσι, όταν λέμε map.put (e1, 'C ++'), κατακερματιστεί σε κάποια τοποθεσία κάδου. Στη συνέχεια, καλούμε map.put (e2, 'Python'). Αυτή τη φορά θα κατακερματιστεί στον ίδιο κάδο και θα αντικαταστήσει την προηγούμενη τιμή. Αυτό συμβαίνει επειδή έχουμε αντικαταστήσει τη μέθοδο hashCode ().
Παράκαμψη στατικής μεθόδου στην Java
Μπορούμε να παρακάμψουμε τη στατική μέθοδο στην Java;
Όσον αφορά την παράκαμψη της στατικής μεθόδου στην Java, η άμεση απάντηση σε αυτήν την ερώτηση είναι Όχι, δεν μπορούμε να παρακάμψουμε τη στατική μέθοδο.
Η στατική μέθοδος καλείται χρησιμοποιώντας το ίδιο το όνομα της τάξης. Δεν χρειαζόμαστε ένα αντικείμενο για να καλέσουμε μια στατική μέθοδο. Έτσι, ακόμη και αν δηλώσουμε μια μέθοδο με το ίδιο πρωτότυπο σε μια υποκατηγορία, δεν μπορούμε να την ονομάσουμε υπερισχύουσα. Αντ 'αυτού, κρύβουμε απλώς τον ορισμό της μητρικής κλάσης της στατικής μεθόδου.
Το ακόλουθο πρόγραμμα Java δείχνει τη στατική μέθοδο και τη μη στατική μέθοδο σε ένα σύστημα κληρονομιάς μαζί με τη συμπεριφορά τους στο χρόνο εκτέλεσης.
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(); } }
Παραγωγή:
Από την έξοδο του προγράμματος, μπορούμε να συμπεράνουμε τα ακόλουθα.
- Η κλήση στη στατική μέθοδο γίνεται πάντα με βάση τον τύπο αναφοράς. Ως εκ τούτου, όταν καλέσαμε new_obj. display () στο παραπάνω πρόγραμμα, καθώς η αναφορά new_obj είναι τύπου class Parent, καλείται η μέθοδος display () της κλάσης γονέα.
- Από την άλλη πλευρά, οι μη στατικές μέθοδοι καλούνται με βάση τα περιεχόμενα του αντικειμένου αναφοράς με το οποίο καλείται η μέθοδος. Ως εκ τούτου, στο παραπάνω πρόγραμμα, η μέθοδος new_obj.print () καλεί τη μέθοδο εκτύπωσης () της θυγατρικής κατηγορίας, καθώς τα περιεχόμενα new_obj είναι το αντικείμενο της θυγατρικής τάξης.
Αυτό εξηγεί την έξοδο του παραπάνω προγράμματος και πρέπει να θυμόμαστε και τα ακόλουθα σημεία, ενώ ασχολούμαστε με στατικές μεθόδους στο σύστημα OOP.
- Μια στατική μέθοδος δεν μπορεί να αποκρύψει μια μη στατική μέθοδο παρουσίας και μια μη στατική μέθοδο παρουσίας δεν μπορεί να παρακάμψει μια στατική μέθοδο.
- Μπορούμε να υπερφορτώσουμε τις μεθόδους από τη μητρική κλάση σε μια δευτερεύουσα τάξη, αλλά δεν παρακάμπτουν ούτε κρύβουν τις μεθόδους της μητρικής τάξης, αλλά είναι νέες μέθοδοι στην υποκατηγορία.
Παράκαμψη σύγκρισηTo () Στην Java
Γνωρίζουμε ότι η διεπαφή java.lang.Cararable παρέχει μια μέθοδο «membandingkanTo ()» χρησιμοποιώντας την οποία μπορούμε να ταξινομήσουμε τα αντικείμενα με φυσική σειρά όπως λεξική σειρά για αντικείμενα συμβολοσειράς, αριθμητική σειρά για ακέραιους κ.λπ.
Για να εφαρμόσουμε την ταξινόμηση σε αντικείμενα ή συλλογές που ορίζονται από τον χρήστη, πρέπει να παρακάμψουμε τη μέθοδο σύγκρισης () για να ταξινομήσουμε τα στοιχεία συλλογής ή τα αντικείμενα που ορίζονται από τον χρήστη.
Λοιπόν, τι κάνει μια μέθοδο σύγκρισης ();
Μια μέθοδος σύγκρισηTo () πρέπει να επιστρέφει θετική τιμή εάν το τρέχον αντικείμενο είναι μεγαλύτερο από το αντικείμενο που έχει περάσει στη σειρά και η αρνητική τιμή του τρέχοντος αντικειμένου είναι μικρότερη από το αντικείμενο που έχει περάσει. Εάν και τα δύο αντικείμενα είναι ίδια, τότε η μέθοδος σύγκρισης () θα επιστρέψει μηδέν.
Ένα άλλο σημείο που πρέπει να σημειωθεί είναι ότι η μέθοδος ισούται με () και το σύγκρισηTo () πρέπει να συμπεριφέρεται με συνέπεια μεταξύ τους. Αυτό σημαίνει ότι εάν η μέθοδος σύγκρισης () επιστρέψει ότι δύο αντικείμενα είναι ίδια (επιστρέφει μηδέν) τότε θα πρέπει να έχουμε την ίδια έξοδο από τη μέθοδο ίσο ().
Ας εφαρμόσουμε ένα πρόγραμμα Java που παρακάμπτει τη μέθοδο σύγκρισης (). Σε αυτό το πρόγραμμα, χρησιμοποιούμε μια κλάση χρώματος που έχει δύο ιδιωτικές μεταβλητές, δηλαδή όνομα και αναγνωριστικό. Έχουμε συσχετίσει το 'id' με κάθε χρώμα και θα παρακάμψουμε τη μέθοδο σύγκρισης () για να τακτοποιήσουμε τα χρώματα σύμφωνα με το αναγνωριστικό.
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() + ' , '); }
Παραγωγή:
Στην παραπάνω έξοδο, εμφανίζουμε πρώτα τη λίστα χρωμάτων και μετά τη λίστα χρωμάτων. Στο πρόγραμμα, έχουμε αντικαταστήσει τις μεθόδους σύγκρισηςTo () και σύγκρισης ().
oracle pl sql συνεντεύξεις ερωτήσεις και απαντήσεις για έμπειρους
Παράκαμψη της μεθόδου toString () σε Java
Η μέθοδος «toString ()» επιστρέφει την παράσταση συμβολοσειράς ενός αντικειμένου στην Java. Αλλά όταν έχουμε αντικείμενα που ορίζονται από το χρήστη, τότε αυτή η μέθοδος μπορεί να συμπεριφέρεται διαφορετικά.
Για παράδειγμα,εξετάστε το ακόλουθο πρόγραμμα.
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); } }
Παραγωγή:
Όπως φαίνεται σε αυτό το πρόγραμμα προβάλλουμε το αντικείμενο κλάσης Complex που έχουμε ορίσει νωρίτερα. Ωστόσο, η έξοδος που εμφανίζεται δεν είναι το περιεχόμενο αλλά είναι μάλλον κρυπτική.
Η έξοδος δείχνει ένα όνομα κλάσης Complex και ακολουθείται από το χαρακτήρα «@» και μετά τον κωδικό hashCode. Αυτή είναι η προεπιλεγμένη έξοδος που εκτυπώνεται με τη μέθοδο toString () της κλάσης Object.
Εάν θέλουμε τη σωστή έξοδο, τότε πρέπει να παρακάμψουμε τη μέθοδο toString () στην εφαρμογή μας.
Το ακόλουθο πρόγραμμα Java δείχνει πώς να παρακάμψετε τη μέθοδο toString () για να εκτυπώσετε τα περιεχόμενα του συμπλέγματος αντικειμένου.
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); } }
Παραγωγή:
Το παραπάνω πρόγραμμα δείχνει ότι η μέθοδος toString () παρακάμπτεται για την επιστροφή των περιεχομένων του σύνθετου αντικειμένου στη δεδομένη μορφή (πραγματικό + i * φανταστικό).
Σε γενικές γραμμές, όταν θέλουμε να εμφανίσουμε το αντικείμενο κλάσης χρησιμοποιώντας είτε print () είτε println () τότε είναι πάντα σκόπιμο να παρακάμψετε τη μέθοδο toString () έτσι ώστε να έχουμε την κατάλληλη έξοδο.
Συχνές Ερωτήσεις
Ε # 1) Γιατί να χρησιμοποιήσετε το .equals αντί για == Java;
Απάντηση: Χρησιμοποιούμε «==» για να συγκρίνουμε πρωτόγονους τύπους όπως int, char, boolean κ.λπ. Χρησιμοποιούμε ίσο () για να συγκρίνουμε αντικείμενα (προκαθορισμένα ή καθορισμένα από τον χρήστη). Συνήθως παρακάμπτουμε τη μέθοδο equals () για να συγκρίνουμε δύο αντικείμενα και η τιμή επιστροφής των ίσων () εξαρτάται από τον κώδικα που παρακάμπτεται.
Q # 2) Σε τι χρησιμοποιείται ο hashCode () και ισούται με ();
Απάντηση: Στην Java, η μέθοδος ίσο () χρησιμοποιείται για τη σύγκριση της ισότητας δύο αντικειμένων. Η μέθοδος hashCode () επιστρέφει τον κωδικό hashCode του αντικειμένου. Ενώ η μέθοδος equals () χρησιμοποιείται με τα περισσότερα αντικείμενα για τη δοκιμή της ισότητας τους, ο hashCode χρησιμοποιείται κυρίως σε συλλογές κατακερματισμού όπως HashTable, HashMap, HashSet κ.λπ.
Q # 3) Μπορούμε να αλλάξουμε τη λίστα ορισμάτων της παράκαμψης μεθόδου;
Απάντηση: Όχι. Όταν παρακάμπτουμε τη μέθοδο, διατηρούμε την υπογραφή της μεθόδου ή το πρωτότυπο της μεθόδου ίδια στην υποκατηγορία. Επομένως, δεν μπορούμε να αλλάξουμε τον αριθμό των παραμέτρων στη μέθοδο παράκαμψης.
Q # 4) Γιατί παρακάμπτουμε το String ();
Απάντηση: Όταν η μέθοδος toString () παρακάμπτεται, μπορούμε να επιστρέψουμε τις τιμές του αντικειμένου για το οποίο η μέθοδος toString () παρακάμπτεται χωρίς να γράψουμε πάρα πολύ κώδικα. Αυτό συμβαίνει επειδή ο μεταγλωττιστής java επικαλείται τη μέθοδο toString () όταν εκτυπώνουμε ένα αντικείμενο.
Q # 5) Τι θα συνέβαινε εάν δεν παρακάμψετε τη μέθοδο toString ();
Απάντηση: Εάν δεν παρακάμψουμε τη μέθοδο toString (), τότε δεν θα λάβουμε πληροφορίες σχετικά με τις ιδιότητες ή την κατάσταση του αντικειμένου. Δεν θα ξέρουμε τι είναι πραγματικά μέσα στο αντικείμενο. Επομένως, όλες οι τάξεις πρέπει να παρακάμψουν τη μέθοδο toString ().
Αυτό συμβαίνει επειδή η προεπιλεγμένη εφαρμογή της μεθόδου toString () εμφανίζει την παράσταση συμβολοσειράς, αλλά όταν χρησιμοποιούμε την προεπιλεγμένη εφαρμογή toString () στο αντικείμενο, τότε δεν θα λάβουμε τα περιεχόμενα του αντικειμένου.
συμπέρασμα
Σε αυτό το σεμινάριο, συζητήσαμε για την παράκαμψη ορισμένων προκαθορισμένων μεθόδων Java και είδαμε επίσης γιατί πρέπει να τις παρακάμψουμε.
Όταν αντιμετωπίζουμε αντικείμενα, οι προεπιλεγμένες υλοποιήσεις μεθόδων όπως ισούται με (), membandingkanTo () και toString () ενδέχεται να μην παρέχουν τις σωστές πληροφορίες. Ως εκ τούτου πηγαίνουμε για υπέρβαση.
=> Ρίξτε μια ματιά στον Οδηγό για αρχάριους Java εδώ.
Συνιστώμενη ανάγνωση
- Εκμάθηση συμβολοσειράς Java | Μέθοδοι συμβολοσειράς Java με παραδείγματα
- Νήματα Java με μεθόδους και κύκλο ζωής
- Java String length () Μέθοδος με παραδείγματα
- Reverse An Array In Java - 3 μέθοδοι με παραδείγματα
- Πώς να χρησιμοποιήσετε τη μέθοδο Java toString;
- Java String index της μεθόδου με παραδείγματα κώδικα
- Το Java String περιέχει () Μέθοδος Εκμάθησης με Παραδείγματα
- Μέθοδος Java String Split () - Πώς να διαχωρίσετε μια συμβολοσειρά σε Java