User Tools

Site Tools


java:type_casting

Differences

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

Link to this comparison view

Both sides previous revision Previous revision
Previous revision
java:type_casting [2021/04/05 15:09]
java:type_casting [2021/04/05 16:09]
gthanos
Line 1: Line 1:
 +====== Ρητές (explicit) και άρρητες (implicit) μετατροπές τύπων ======
  
 +Σε συνέχεια του παραδείγματος κληρονομικότητας της προηγούμενης ενότητας μπορούμε να γράψουμε
 +
 +<code java>
 +Rectangle r1 = new Rectangle(100,100,5,-5);
 +</code>
 +
 +Από την παραπάνω δήλωση η μεταβλητή ''r1'' είναι τύπου ''Rectangle''. Επειδή όμως ο τύπος ''Rectangle'' κληρονομεί την κλάση ''BasicRectangle'' **η μεταβλητή r1 είναι και τύπου BasicRectangle**. Επομένως, θα μπορούσαμε να γράψουμε
 +
 +<code java>
 +BasicRectangle r2 = r1;
 +   //ή ισοδύναμα
 +BasicRectangle r2 = new Rectangle(100,100,5,-5);
 +</code>
 +
 +Την παραπάνω ανάθεση την ονομάζουμε άρρητη μετατροπή (//implicit casting//) διότι αναθέτουμε ένα αντικείμενο του κληρονομούμενου τύπου δεδομένων (''r1'') σε μία μεταβλητή του γονικού τύπου (''r2''), χωρίς να ορίζουμε κάποια μετατροπή τύπου.
 +
 +Αν θέλουμε να ζωγραφίσουμε τον κώδικα του προηγούμενου παραδείγματος μπορούμε να το κάνουμε όπως στο παρακάτω σχήμα. Παρατηρήστε ότι η μεταβλητές **r1** και **r2** δείχνουν στο ίδιο αντικείμενο. Η διαφορά είναι ότι η **r2** αν και δείχνει σε ένα αντικείμενο τύπου **Rectangle**, έχει πρόσβαση μόνο στο τμήμα του αντικειμένου που είναι του τύπου **BasicRectangle**. Ο λόγος για αυτόν τον περιορισμό είναι ότι λόγω του τύπου της ο //compiler// υποθέτει ότι δείχνει σε ένα αντικείμενο τύπου **BasicRectangle** με αποτέλεσμα να μην επιτρέπει την πρόσβαση στα πεδία και τις μεθόδους που δεν ανήκουν στην κλάση **BasicRectangle**, αλλά στην υποκλάση.
 +
 +{{  :java:implicit-casting.png  |}}
 +
 +=== Ρητή μετατροπή ===
 +
 +Ας δοκιμάσουμε το ανάποδο παράδειγμα τώρα
 +
 +<code java>
 +BasicRectangle r3 = new Rectangle(100,200,5,-5);
 +Rectangle r4 = r3;
 +</code>
 +
 +Σε αυτή την περίπτωση ο //compiler// διαμαρτύρεται, διότι η μεταβλητή ''r3'' είναι τύπου ''BasicRectangle'' και όχι τύπου ''Rectangle''. Αν θέλουμε να ξεπεράσουμε το παραπάνω μήνυμα λάθους του compiler θα πρέπει να γράψουμε το εξής:
 +
 +<code java>
 +BasicRectangle r3 = new Rectangle(100,200,5,-5);
 +Rectangle r4 = (Rectangle)r3;
 +</code>
 +
 +Σε αυτή την περίπτωση ο προγραμματιστής βεβαιώνει τον //compiler// ότι η μεταβλητή ''r4'' είναι και τύπου ''Rectangle''. Την παραπάνω ανάθεση την ονομάζουμε ρητή μετατροπή (//explicit casting//). Επειδή δεν ισχύει η παραπάνω μετατροπή, κατά την εκτέλεση του προγράμματος θα παραχθεί μία εξαίρεση (//exception//). Θα δούμε πιο κάτω τι είναι οι εξαιρέσεις και πως τις διαχειριζόμαστε.
 +
 +Ένας πιο ασφαλής τρόπος για να επαναλάβουμε τον παραπάνω κώδικα, χωρίς να παραχθεί εξαίρεση είναι ο παρακάτω. Εδώ η μετατροπή γίνεται αφού πρώτα γίνει έλεγχος ότι το αντικείμενο για το οποίο θα γίνει μετατροπή τύπου είναι και του νέου τύπου. Η μετατροπή θα γίνει μόνο εφόσον ο έλεγχος επιτύχει.
 +
 +<code java>
 +BasicRectangle r3 = new Rectangle(100,200,5,-5);
 +Rectangle r4;
 +if (r3 instanceof Rectangle) {
 +    r4 = (Rectangle)r3;
 +}
 +</code>
 +
 +|Προηγούμενο: [[ :java:inheritance | Κληρονομικότητα ]] | [[:toc | Περιεχόμενα]] | Επόμενο: [[ :java:inheritance_subclassing_vs_encapsulating | Κριτήριo χρήσης της κληρονομικότητας ]]|
java/type_casting.txt · Last modified: 2021/04/05 15:09 (external edit)