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 [2021/03/22 06:49] – gthanos | java:object_class [2021/03/22 07:36] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
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)** | ||
+ | |||
+ | |||
+ | |||
===== Έλεγχος ισότητας μεταξύ δύο αντικειμένων ===== | ===== Έλεγχος ισότητας μεταξύ δύο αντικειμένων ===== | ||
- | Ας υποθέσουμε ότι έχουμε δύο αντικείμενα της κλάσης [[https:// | + | Ας υποθέσουμε ότι έχουμε δύο αντικείμενα της [[java: |
Θέλουμε να συγκρίνουμε τα δύο αυτά αντικείμενα μόνο ως προς την ισότητα. Για να το κάνουμε αυτό έχουμε δύο επιλογές: | Θέλουμε να συγκρίνουμε τα δύο αυτά αντικείμενα μόνο ως προς την ισότητα. Για να το κάνουμε αυτό έχουμε δύο επιλογές: | ||
* **χρήση του τελεστή =**: Ο τελεστής = ελέγχει οι δύο μεταβλητές αριστερά και δεξιά του τελεστή δείχνουν στο ίδιο αντικείμενο. Ως εκ τούτου δεν μπορεί να χρησιμοποιηθεί στη συγκεκριμένη περίπτωση. | * **χρήση του τελεστή =**: Ο τελεστής = ελέγχει οι δύο μεταβλητές αριστερά και δεξιά του τελεστή δείχνουν στο ίδιο αντικείμενο. Ως εκ τούτου δεν μπορεί να χρησιμοποιηθεί στη συγκεκριμένη περίπτωση. | ||
- | * **χρήση της μεθόδου equals: | + | * **χρήση της μεθόδου equals: |
+ | |||
+ | <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.1616395744.txt.gz · Last modified: 2021/03/22 06:49 by gthanos