====== Η μέθοδος toString ====== ===== Αναπαράσταση δεδομένων αντικειμένου σε μορφή κειμένου ===== Θυμηθείτε την κλάση **Point** που ορίσαμε σε προηγούμενη ενότητα. Θα θέλαμε να μπορούμε να γράψουμε: Point aPoint = new Point(4, 5); System.out.println(aPoint); και να εκτυπωθούν στην οθόνη τα δεδομένα του σημείου που ορίσαμε, δηλαδή οι συντεταγμένες, σε κατανοητή μορφή κειμένου η οποία διαβάζεται εύκολα από τον χρήστη, για παράδειγμα, ''(4, 5)'' Αν όμως εκτελέσουμε το παραπάνω κομμάτι κώδικα, τότε θα εκτυπωθεί κάτι αρκετά διαφορετικό: ''Point@5ffdfb42'', το οποίο αποτελείται από το όνομα της κλάσης στην οποία ανήκει το αντικείμενό μας και ένα ειδικό κωδικό (hash code) για τον οποίο μπορείτε να διαβάσετε [[:java:object_class | στην ενότητα για την κλάση Object ]]. Αυτό που δε φαίνεται στον κώδικα είναι ότι όταν ζητάμε να αντιμετωπιστεί ένα αντικείμενο ως κείμενο (πχ. για να εκτυπωθεί στην οθόνη) τότε καλείται έμμεσα μια συνάρτηση με όνομα **toString** η οποία είναι προκαθορισμένη για κάθε κλάση και επιστρέφει ένα String όπως το ''Point@5ffdfb42''. Στην πραγματικότητα ο κώδικας που εκτελέστηκε ήταν : System.out.println(aPoint.toString()); Το ερώτημα είναι, πώς μπορούμε να εκτυπώσουμε το πιο φιλικό ''(4, 5)'' ; Ένας απλός τρόπος είναι χρησιμοποιώντας τους getters που παρέχει η κλάση: System.out.println( "(" + aPoint.getX() + ", " + aPoint.getY() + ")"); Ένα σημαντικό μειονέκτημα της παραπάνω "λύσης" είναι ότι υποχρεώνουμε το χρήστη της κλάσης να υλοποιήσει μια λειτουργία που θα ήταν πιο σωστό να παρέχει άμεσα η ίδια η κλάση. Η κλάση είναι αυτή που έχει πρόσβαση σε όλα τα πεδία (πιθανώς να μην διατίθενται getters για όλα), και μπορεί να εγγυηθεί ότι η κειμενική αναπαράσταση θα έχει πάντα ακριβώς την ίδια μορφή. Ο σωστός τρόπος να επιτύχουμε αυτό που θέλουμε είναι υπερκαλύπτοντας τη μέθοδο **toString()**. Η υπερκάλυψη (**override**) μιας μεθόδου θα εξηγηθεί λεπτομερώς σε επόμενη ενότητα. Προς το παρόν, αρκεί να γνωρίζετε τα εξής: * Η μέθοδος **toString** είναι ήδη ορισμένη για όλες τις κλάσεις και επιστρέφει μια κειμενική αναπαράσταση ενός αντικειμένου. * Υπάρχει η δυνατότητα να την ξαναορίσουμε σε μια κλάση, υλοποιώντας τη με τον τρόπο που θέλουμε * Η δική μας υλοποίηση, εφόσον υπάρχει, έχει προτεραιότητα έναντι της προκαθορισμένης υλοποίησης. Ορίζουμε λοιπόν στην κλάση Point: @Override public String toString () { return "(" + x + ", " + y + ")"; } και τώρα όταν γράψουμε στο πρόγραμμά μας System.out.println(aPoint); θα εμφανιστεί στην οθόνη: ''(4, 5)'' |Προηγούμενο: [[:java:member_initialization | Αρχικοποίηση των μελών της κλάσης ]] | [[:toc | Περιεχόμενα]] | Επόμενο: [[:java:wrapper_classes | Βασικοί τύποι δεδομένων και ισοδύναμοι αναφορικοί τύποι ]]|