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/03/15 20:13]
gthanos
java:type_casting [2021/04/05 15:09]
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''), χωρίς να ορίζουμε κάποια μετατροπή τύπου. 
- 
-Ας δοκιμάσουμε το ανάποδο παράδειγμα τώρα 
- 
-<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)