java:object_class
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
java:object_class [2016/02/15 16:51] – gthanos | java:object_class [2021/03/22 07:36] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 16: | Line 16: | ||
Λόγω της ύπαρξης της κλάσης //Object// όλα τα αντικείμενα στην Java κληρονομούν συγκεκριμένες μεθόδους που ορίζονται στην κλάση αυτή. Τις μεθόδους αυτές μπορείτε αν θέλετε να τις επαναορίσετε στις κλάσεις που δημιουργείτε ή να τις αφήσετε ως έχουν. Οι κυριότερες μέθοδοι της κλάσης //Object// είναι οι εξής: | Λόγω της ύπαρξης της κλάσης //Object// όλα τα αντικείμενα στην Java κληρονομούν συγκεκριμένες μεθόδους που ορίζονται στην κλάση αυτή. Τις μεθόδους αυτές μπορείτε αν θέλετε να τις επαναορίσετε στις κλάσεις που δημιουργείτε ή να τις αφήσετε ως έχουν. Οι κυριότερες μέθοδοι της κλάσης //Object// είναι οι εξής: | ||
- | * **public boolean equals(Object obj):** Η μέθοδος ελέγχει αν δύο αντικείμενα είναι ίδια. | + | * **public boolean equals(Object obj):** Η μέθοδος ελέγχει αν δύο αντικείμενα είναι ίδια. |
- | * **public int hashCode(): | + | * **public int hashCode(): |
- | * **public String toString(): | + | * **[[[[: |
<code java> | <code java> | ||
getClass().getName() + ' | getClass().getName() + ' | ||
Line 29: | Line 29: | ||
* **public final void wait(long timeout)** | * **public final void wait(long timeout)** | ||
* **public final void wait(long timeout, int nanos)** | * **public final void wait(long timeout, int nanos)** | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ===== Έλεγχος ισότητας μεταξύ δύο αντικειμένων ===== | ||
+ | |||
+ | Ας υποθέσουμε ότι έχουμε δύο αντικείμενα της [[java: | ||
+ | |||
+ | Θέλουμε να συγκρίνουμε τα δύο αυτά αντικείμενα μόνο ως προς την ισότητα. Για να το κάνουμε αυτό έχουμε δύο επιλογές: | ||
+ | * **χρήση του τελεστή =**: Ο τελεστής = ελέγχει οι δύο μεταβλητές αριστερά και δεξιά του τελεστή δείχνουν στο ίδιο αντικείμενο. Ως εκ τούτου δεν μπορεί να χρησιμοποιηθεί στη συγκεκριμένη περίπτωση. | ||
+ | * **χρήση της μεθόδου equals:** Θα πρέπει να επαναορίσουμε τη μέθοδο equals, ώστε όταν συγκρίνονται δύο αντικείμενα που έχουν τα ίδια πεδία η μέθοδος να επιστρέφει true. Εδώ θα πρέπει να σημειώσουμε ότι εφόσον η κλάση περιέχει και ένα πεδίο τύπου Point, μόνο εάν και τα πεδία τύπου Point των δύο αντικειμένων δείχνουν σε διαφορετικά αντικείμενα που έχουν κοινές τιμές τα δύο αντικείμενα τύπου Rectangle θα είναι ίδια. Ενδεικτικές υλοποιήσεις της μεθόδου equals των κλάσεων Point και Rectangle δίνονται παρακάτω: | ||
+ | |||
+ | <code java> | ||
+ | // equals method for class Point | ||
+ | @Override | ||
+ | public boolean equals(Object o) { | ||
+ | if(o == null) | ||
+ | return false; | ||
+ | if(o instanceof Point) { | ||
+ | Point p = (Point)o; | ||
+ | if(p.x == x && p.y == y) | ||
+ | return true; | ||
+ | } | ||
+ | return false; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | <code java> | ||
+ | // equals method for class Rectangle | ||
+ | @Override | ||
+ | public boolean equals(Object o) { | ||
+ | if(o == null) | ||
+ | return false; | ||
+ | if(o instanceof Rectangle) { | ||
+ | Rectangle r = (Rectangle)o; | ||
+ | if(r.width == width && r.height == height && r.origin.equals(origin)) | ||
+ | return true; | ||
+ | } | ||
+ | return false; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | |||
+ | Όμως ο επαναορισμός της μεθόδου equals δεν αρκεί ώστε να σηματοδοτήσει την ισότητα μεταξύ δύο αντικείμενων. [[https:// | ||
+ | |||
+ | <code java> | ||
+ | // equals method for class Point | ||
+ | @Override | ||
+ | public int hashCode() { | ||
+ | int hash = 3; | ||
+ | hash = 19 * hash + this.x; | ||
+ | hash = 17 * hash + this.y; | ||
+ | return hash; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | <code java> | ||
+ | // equals method for class Rectangle | ||
+ | @Override | ||
+ | public int hashCode() { | ||
+ | int hash = 7; | ||
+ | hash += 13 * width; | ||
+ | hash += 17 * height; | ||
+ | hash = 31 * hash + Objects.hashCode(this.origin); | ||
+ | return hash; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Μπορείτε να κατεβάσετε {{: | ||
+ | |||
+ | <code java EqualityDemo.java> | ||
+ | public class EqualityDemo { | ||
+ | |||
+ | public static void main(String[] args) { | ||
+ | |||
+ | // create two Rectangle objects with the same parameters | ||
+ | Rectangle r1 = new Rectangle(100, | ||
+ | Rectangle r2 = new Rectangle(100, | ||
+ | | ||
+ | // objctes are different. We fail here. | ||
+ | if( r1 == r2) | ||
+ | System.out.println(" | ||
+ | | ||
+ | // Equals function works! | ||
+ | if(r1.equals(r2)) | ||
+ | System.out.println(" | ||
+ | if(r2.equals(r1)) | ||
+ | System.out.println(" | ||
+ | | ||
+ | // hashCode return values are also equal. | ||
+ | System.out.format(" | ||
+ | System.out.format(" | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | <WRAP tip 80% center round> | ||
+ | Βάλτε σε σχόλια τις μεθόδους equals και hashCode στις παραπάνω κλάσεις και ελέγξτε τι εκτυπώνει το παραπάνω πρόγραμμα σε αυτή την περίπτωση. | ||
+ | </ | ||
+ | |||
+ | |||
+ | |Προηγούμενο: |
java/object_class.1455555065.txt.gz · Last modified: 2016/02/15 16:51 (external edit)