java:tostring

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

java:tostring [2017/01/26 10:44]
gthanos [Αναπαράσταση δεδομένων αντικειμένου σε μορφή κειμένου]
java:tostring [2022/02/24 12:42]
Line 1: Line 1:
-======  Η μέθοδος 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**) μιας μεθόδου θα εξηγηθεί λεπτομερώς σε επόμενη ενότητα. Προς το παρόν, αρκεί να γνωρίζετε τα εξής: 
- 
-<WRAP tip 80% center round> 
-  * Η μέθοδος **toString** είναι ήδη ορισμένη για όλες τις κλάσεις και επιστρέφει μια κειμενική αναπαράσταση ενός αντικειμένου.  
-  * Υπάρχει η δυνατότητα να την ξαναορίσουμε σε μια κλάση, υλοποιώντας τη με τον τρόπο που θέλουμε 
-  * Η δική μας υλοποίηση, εφόσον υπάρχει, έχει προτεραιότητα έναντι της προκαθορισμένης υλοποίησης.  
-</WRAP> 
- 
-Ορίζουμε λοιπόν στην κλάση Point την μέθοδο public String toString() ως εξής:  
- 
-<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.txt · Last modified: 2022/02/24 12:42 (external edit)