java:tostring

This is an old revision of the document!


A PCRE internal error occured. This might be caused by a faulty plugin

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

java/tostring.1456485333.txt.gz · Last modified: 2017/02/16 12:17 (external edit)