java:inheritance

Differences

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

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
java:inheritance [2015/02/13 13:55]
gthanos [Implicit και Explicit Casting of Objects]
java:inheritance [2016/03/31 08:25] (current)
doufexi [Τι μπορούμε να κάνουμε σε μία υποκλάση...]
Line 1: Line 1:
 ====== Κληρονομικότητα ====== ====== Κληρονομικότητα ======
  
-Σε προηγούμενη παράγραφο, αναφερόμενοι στην κλάση έγινε ​[[:​java:​class#​Κληρονομικότητα Κλάσης | αναφορά στην κληρονομικότητα ​κλάσεων]] στην Java. Κάθε κλάση που κληρονομεί από μία άλλη κλάση ονομάζεται υποκλάση (//​subclass//​) της γονικής κλάσης από την οποία κληρονομεί. Αντίστοιχα,​ η γονική κλάση ονομάζεται υπερκλάση (//​superclass//​) της κληρονομούμενης κλάσης.+Βασικό χαρακτηριστικό του αντικειμενοστραφούς ​προγραμματισμού είναι η δυνατότητα να παράγουμε ​νέες κλάσεις ​με βάση υφιστάμενες κλάσεις, εξειδικεύοντας και ​επεκτείνοντας τα χαρακτηριστικά τους. Η διαδικασία επέκτασης των υφιστάμενων κλάσεων σε νέες ειδικότερες κλάσεις ονομάζεται κληρονομικότητα. 
 + 
 +Κάθε κλάση που κληρονομεί από μία άλλη κλάση ονομάζεται υποκλάση (//​subclass//​) της γονικής κλάσης από την οποία κληρονομεί. Αντίστοιχα,​ η γονική κλάση ονομάζεται υπερκλάση (//​superclass//​) της κληρονομούμενης κλάσης.
  
 {{  :​java:​super_sub_class.jpg ​ | }} {{  :​java:​super_sub_class.jpg ​ | }}
  
-Όπως φαίνεται και στο παραπάνω σχήμα μία κλάση (//​subclass//​) μπορεί να κληρονομεί __**ΜΟΝΟ ΜΙΑ**__ άλλη κλάση. Αντίστροφα μία κλάση (//​superclass//​) μπορεί να κληρονομεί πολλές διαφορετικές κλάσεις. Παρακάτω δίνουμε ​το παράδειγμα κληρονομικότητας που παρουσιάσαμε νωρίτερα ελαφρά παραλλαγμένο.+Όπως φαίνεται και στο παραπάνω σχήμα μία κλάση (//​subclass//​) μπορεί να κληρονομεί __**ΜΟΝΟ ΜΙΑ**__ άλλη κλάση. Αντίστροφα μία κλάση (//​superclass//​) μπορεί να κληρονομείται από ​πολλές διαφορετικές κλάσεις. Παρακάτω δίνουμε ​ένα ​παράδειγμα κληρονομικότητας ​από το site της [[https://​docs.oracle.com/​javase/​tutorial/​java/​IandI/​subclasses.html|Oracle]],​ όπου ​η κλάση ''​MountainBike'' ​αποτελεί εξειδίκευση της κλάσης ''​Bicycle''​.
  
 <code java Bicycle.java>​ <code java Bicycle.java>​
Line 80: Line 82:
 Μία κλάση η οποία κληρονομεί μία άλλη κλάση έχει πρόσβαση στα μέλη (πεδία και μεθόδους) της κλάσης αυτής ως εξής: Μία κλάση η οποία κληρονομεί μία άλλη κλάση έχει πρόσβαση στα μέλη (πεδία και μεθόδους) της κλάσης αυτής ως εξής:
  
-  * Έχει πρόσβαση στα //public// και //​protected//​ μέλη της γονικής κλάσης +  * Έχει πρόσβαση στα //**public**// και //**protected**// μέλη της γονικής κλάσης 
-  * Έχει πρόσβαση στα //package private// μέλη (δηλ. τα μέλη χωρίς προσδιοριστή πρόσβασης) μόνο αν βρίσκεται στο ίδιο πακέτο με την γονική κλάση. +  * Έχει πρόσβαση στα //**package private**// μέλη (δηλ. τα μέλη χωρίς προσδιοριστή πρόσβασης) μόνο αν βρίσκεται στο ίδιο πακέτο με την γονική κλάση. 
-  * Δεν έχει πρόσβαση στα //private// μέλη της κλάσης. ​+  * Δεν έχει πρόσβαση στα //**private**// μέλη της κλάσης. ​
  
-Αν υπάρχουν //public// μέθοδοι οι οποίες επιτρέπουν την πρόσβαση σε //private// πεδία, τότε αυτές μπορούν να χρησιμοποιηθούν για τον ορισμό ή για την λήψη της τιμής τους.+Αν υπάρχουν //**public**// μέθοδοι οι οποίες επιτρέπουν την πρόσβαση σε //**private**// πεδία, τότε αυτές μπορούν να χρησιμοποιηθούν για τον ορισμό ή για την λήψη της τιμής τους.
  
 ===== Τι μπορούμε να κάνουμε σε μία υποκλάση... ===== ===== Τι μπορούμε να κάνουμε σε μία υποκλάση... =====
Line 97: Line 99:
   * Μπορούμε να γράψουμε κατασκευαστές της υποκλάσης που χρησιμοποιούν κατασκευαστές της γονικής κλάσης.   * Μπορούμε να γράψουμε κατασκευαστές της υποκλάσης που χρησιμοποιούν κατασκευαστές της γονικής κλάσης.
  
-===== Implicit ​και ​Explicit Casting of Objects =====+| Προηγούμενο : [[  :​java:​access_modifiers | Περιοριστές πρόσβασης ]] | [[ :toc | Περιεχόμενα ]] | Επόμενο:​ [[ :​java:​type_casting | Ρητές (explicit) ​και ​άρρητες (implicit) μετατροπές τύπων ]]  |
  
-Σε συνέχεια του προηγούμενου παραδείγματος κληρονομικότητας μπορούμε να γράψουμε 
- 
-<code java> 
-MountainBike myBike = new MountainBike();​ 
-</​code>​ 
- 
-Από την παραπάνω δήλωση η μεταβλητή ''​myBike''​ είναι τύπου ''​MountainBike''​. Επειδή όμως ο τύπος ''​MountainBike''​ κληρονομεί από την μεταβλητή ''​Bicycle''​ η συγκεκριμένη μεταβλητή είναι και τύπου Bicycle. Επομένως θα μπορούσαμε να γράψουμε 
- 
-<code java> 
-Bicycle myBicycle = myBike; 
-   //ή 
-Βicycle yourBicycle = new MountainBike();​ 
-</​code>​ 
- 
-Την παραπάνω ανάθεση την ονομάζουμε //Implicit Casting// διότι αναθέτουμε μία μεταβλητή ενός τύπου δεδομένων (''​myBike''​) σε μία μεταβλητή γονικού τύπου δεδομένων (''​myBicycle''​),​ χωρίς type casting. 
- 
-Ας δοκιμάσουμε το ανάποδο παράδειγμα τώρα 
- 
-<code java> 
-Bycycle myBicycle = new Bicycle(); 
-MountainBike myBike = myBicycle; 
-</​code>​ 
- 
-Σε αυτή την περίπτωση ο compiler διαμαρτύρεται,​ διότι η μεταβλητή ''​myBicycle''​ είναι τύπου ''​Bicycle''​ και δεν είναι απαραίτητο ότι είναι και τύπου ''​MountainBike''​. Αν θέλουμε να ξεπεράσουμε το παραπάνω πρόβλημα θα πρέπει να γράψουμε το εξής: 
- 
-<code java> 
-Bycycle myBicycle = new Bicycle(); 
-MountainBike myBike = (MountainBike) myBicycle; 
-</​code>​ 
- 
-Εδώ ενημερώνουμε τον compiler ότι η μεταβλητή ''​myBicycle''​ είναι και τύπου ''​MountainBike'',​ λαμβάνοντας ο προγραμματιστής την ευθύνη ότι κάτι τέτοιο ισχύει. Εάν δεν ισχύει κάτι τέτοιο κατά την εκτέλεση του προγράμματος θα παραχθεί μία εξαίρεση (exception)*. Θα δούμε πιο κάτω τι είναι και πως διαχειριζόμαστε τις εξαιρέσεις. 
- 
-Ένα πιο ασφαλής τρόπος για να επαναλάβουμε τον παραπάνω κώδικα,​ χωρίς να παραχθεί εξαίρεση είναι ο εξής: 
- 
-<code java> 
-Bycycle myBicycle = new Bicycle(); 
-MountainBike myBike; 
-if (myBicycle instanceof MountainBike) { 
-    myBike = (MountainBike)myBicycle;​ 
-} 
-</​code>​ 
  
java/inheritance.1423835758.txt.gz · Last modified: 2016/02/26 11:15 (external edit)