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
Last revision Both sides next revision
java:inheritance [2015/02/13 12:42]
gthanos
java:inheritance [2016/02/26 11:15]
127.0.0.1 external edit
Line 1: Line 1:
 ====== Κληρονομικότητα ====== ====== Κληρονομικότητα ======
  
-Σε προηγούμενη παράγραφο, αναφερόμενοι στην κλάση έγινε [[:​java:​class#​Κληρονομικότητα Κλάσης αναφορά στην κληρονομικότητα ​κλάσεων]] στην JavaΚάθε ​κλάση που κληρονομεί από μία άλλη ​κλάση ονομάζεται υποκλάση (//​subclass//​) ​της γονικής κλάσης από ​την οποία ​κληρονομεί. Αντίστοιχα, η γονική κλάση ονομάζεται ​υπερκλάση (//​superclass//​) της ​κληρονομούμενης ​κλάσης.+Βασικό χαρακτηριστικό του αντικειμενοστραφούς ​προγραμματισμού είναι η δυνατότητα να παράγουμε ​νέες κλάσεις ​με βάση υφιστάμενες κλάσεις, εξειδικεύοντας και επεκτείνοντας ​τα χαρακτηριστικά τουςΗ διαδικασία ​επέκτασης των υφιστάμενων κλάσεων σε νέες ειδικότερες ​κλάσεις ​ονομάζεται κληρονομικότητα.
  
-{{  :​java:​super_sub_class.jpg  | }}+Κάθε κλάση που κληρονομεί από μία άλλη κλάση ονομάζεται υποκλάση (//​subclass//​) της γονικής κλάσης από την οποία κληρονομεί. Αντίστοιχα,​ η γονική κλάση ονομάζεται υπερκλάση (//​superclass//​) της κληρονομούμενης κλάσης.
  
 +{{  :​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 76: Line 77:
 } }
 </​code>​ </​code>​
 +
 +===== Προσβασιμότητα των κληρονομούμενων πεδίων =====
 +
 +Μία κλάση η οποία κληρονομεί μία άλλη κλάση έχει πρόσβαση στα μέλη (πεδία και μεθόδους) της κλάσης αυτής ως εξής:
 +
 +  * Έχει πρόσβαση στα //​**public**//​ και //​**protected**//​ μέλη της γονικής κλάσης
 +  * Έχει πρόσβαση στα //**package private**// μέλη (δηλ. τα μέλη χωρίς προσδιοριστή πρόσβασης) μόνο αν βρίσκεται στο ίδιο πακέτο με την γονική κλάση.
 +  * Δεν έχει πρόσβαση στα //​**private**//​ μέλη της κλάσης. ​
 +
 +Αν υπάρχουν //​**public**//​ μέθοδοι οι οποίες επιτρέπουν την πρόσβαση σε //​**private**//​ πεδία, τότε αυτές μπορούν να χρησιμοποιηθούν για τον ορισμό ή για την λήψη της τιμής τους.
 +
 +===== Τι μπορούμε να κάνουμε σε μία υποκλάση... =====
 +
 +  * Να χρησιμοποιήσουμε τα πεδία της γονικής κλάσης στα οποία έχουμε πρόσβαση (public, protected, package-private στο ίδιο package).
 +  * Να ορίσουμε νέα πεδία.
 +  * Να ορίσουμε νέα πεδία που να έχουν ίδιο όνομα με πεδία της γονικής κλάσης. Σε αυτή την περίπτωση "​κρύβουμε"​ τα πεδία της γονικής κλάσης. Η συγκεκριμένη πρακτική δεν συνίσταται και παραπέμπει σε λανθασμένη σχεδίαση κώδικα.
 +  * Να χρησιμοποιήσουμε τις μεθόδους της γονικής κλάσης στις οποίες έχουμε πρόσβαση (public, protected, package-private στο ίδιο package).
 +  * Μπορούμε να γράψουμε νέες στατικές ή μη στατικές μεθόδους για τη υποκλάση.
 +  * Μπορούμε να γράψουμε νέες μεθόδους που έχουν το ίδιο //​signature//​ (ίδιο όνομα, ίδιο αριθμό και ίδιο τύπο ορισμάτων),​ ώστε να επαναορίσουμε (//​override//​) τις μεθόδους αυτές στην υποκλάση. Η πρακτική αυτή είναι συνήθης.
 +  * Μπορούμε να γράψουμε νέες στατικές (//​static//​) μεθόδους που έχουν το ίδιο //​signature//,​ ώστε να επαναορίσουμε (//​override//​) τις μεθόδους αυτές στην υποκλάση. Επαναορίζοντας στατικές μεθόδους,​ κρύβουμε τις αντίστοιχες μεθόδους της γονικής κλάσης.
 +  * Μπορούμε να γράψουμε κατασκευαστές της υποκλάσης που χρησιμοποιούν κατασκευαστές της γονικής κλάσης.
 +
 +|Προηγούμενο:​ [[ :​java:​interfaces | Διεπαφές ]] | Επόμενο:​ [[ :​java:​type_casting | Ρητές (explicit) και άρρητες (implicit) μετατροπές τύπων ]]|
 +
java/inheritance.txt · Last modified: 2016/03/31 08:25 by doufexi