This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
java:super_operator [2015/02/13 14:20] gthanos [Πρόσβαση σε πεδία και μεθόδους των αντικειμένων της γονικής κλάσης μέσω του τελεστή super] |
java:super_operator [2017/02/16 13:40] gthanos |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Ο τελεστής super ====== | ====== Ο τελεστής super ====== | ||
- | Σε προηγούμενη παράγραφο είδαμε την χρήση του τελεστή **[[java:this_operator |this]]**. Σε αναλογία με τον τελεστή **this**, ο τελεστής **super** δείχνει στο αντικείμενο της γονικής κλάσης. Προϋπόθεση για την χρήση του τελεστή **super** είναι να υφίσταται γονική κλάση μέσω της διαδικασίας της κληρονομικότητας. | + | Σε προηγούμενη παράγραφο είδαμε την χρήση του **[[java:this_operator |τελεστή this]]**. Σε αναλογία με τον τελεστή **this**, ο τελεστής **super** δείχνει στο αντικείμενο της γονικής κλάσης. Προϋπόθεση για την χρήση του τελεστή **super** είναι να υφίσταται γονική κλάση μέσω της διαδικασίας της κληρονομικότητας. |
===== Πρόσβαση στους κατασκευαστές της γονικής κλάσης μέσω του τελεστή super ===== | ===== Πρόσβαση στους κατασκευαστές της γονικής κλάσης μέσω του τελεστή super ===== | ||
Line 69: | Line 69: | ||
</code> | </code> | ||
- | H χρήση του τελεστή super χρησιμοποιείται για να προσπελάσει τον κατασκευαστή της γονικής κλάσης και να αρχικοποιήσει τις μεταβλητές που ανήκουν στην κλάση αυτή. | + | H χρήση του τελεστή **super** χρησιμοποιείται για να προσπελάσει τον κατασκευαστή της γονικής κλάσης και να αρχικοποιήσει τις μεταβλητές που ανήκουν στην κλάση αυτή. |
+ | |||
+ | ===== Σειρά αρχικοποίησης μεταξύ της γονικής και και της απογόνου κλάσης ===== | ||
+ | |||
+ | Στις περιπτώσεις που μία κλάση είναι απόγονος άλλης κλάσης η διαδικασία αρχικοποίησης έχει ως εξής. Αρχικά αρχικοποιείται το τμήμα της κλάσης που αφορά την γονική κλάση καλώντας των κατασκευαστή αυτής μέσω του τελεστή **super** και στη συνέχεια αρχικοποιείται η απόγονος κλάση. | ||
+ | |||
+ | Εάν δεν υπάρχει κλήση του κατασκευαστή της γονικής κλάσης μέσω του τελεστή **super** στον κατασκευαστή της απογόνου κλάσης, τότε ο compiler αναζητά εάν υπάρχει ο **default** κατασκευαστής για την γονική κλάση (δηλ. κατασκευαστής χωρίς ορίσματα) και καλεί αυτόματα αυτόν. Εάν δεν υπάρχει ούτε **default** κατασκευαστής εμφανίζει μήνυμα λάθους. | ||
+ | |||
+ | Δείτε το παρακάτω παράδειγμα κώδικα που συμπυκνώνει τη διαδικασία αρχικοποίησης. Ακολουθήστε τα εξής βήματα: | ||
+ | - Προσπαθήστε να μεταγλωττίσετε ως έχει και δείτε το μήνυμα λάθους του μεταγλωττιστή. | ||
+ | - Αφαιρέστε από τα σχόλια την γραμμή 11 και μεταγλωττίστε. | ||
+ | - Προσθέστε σε σχόλια την γραμμή 11 και αφαιρέστε τα σχόλια από την γραμμή 15. Μεταγλωττίστε ξανά. | ||
+ | Παρατηρήστε ότι στις περιπτώσεις 2 και 3 ο κώδικας μεταγλωττίζεται. Εκτελέστε και δείτε τα μηνύματα που εκτυπώνονται. | ||
+ | |||
+ | <code java ObjectInitializationSequence.java> | ||
+ | class Animal { | ||
+ | |||
+ | private String name; | ||
+ | private int age; | ||
+ | |||
+ | public Animal(String name, int age) { | ||
+ | this.name = name; | ||
+ | this.age = age; | ||
+ | System. out.println("Animal constructor with args."); | ||
+ | } | ||
+ | //public Animal() { System. out.println("Default Animal constructor."); } // line 11 | ||
+ | } | ||
+ | |||
+ | class Cat extends Animal { | ||
+ | public Cat() { /*super("",0);*/ } // line 15 | ||
+ | } | ||
+ | |||
+ | public class ObjectInitializationSequence { | ||
+ | public static void main(String []args) { | ||
+ | new Cat(); | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
===== Πρόσβαση σε πεδία και μεθόδους των αντικειμένων της γονικής κλάσης μέσω του τελεστή super ===== | ===== Πρόσβαση σε πεδία και μεθόδους των αντικειμένων της γονικής κλάσης μέσω του τελεστή super ===== | ||
Line 104: | Line 141: | ||
Συμπερασματικά, ο τελεστής **super** δείχνει στο αντικείμενο της γονικής κλάσης και χρησιμοποιείται για να προσπελαστούν δεδομένα ή μεταβλητές που ανήκουν στο τμήμα του τρέχοντος αντικειμένου που αφορά την γονική κλάση. | Συμπερασματικά, ο τελεστής **super** δείχνει στο αντικείμενο της γονικής κλάσης και χρησιμοποιείται για να προσπελαστούν δεδομένα ή μεταβλητές που ανήκουν στο τμήμα του τρέχοντος αντικειμένου που αφορά την γονική κλάση. | ||
- | <WRAP important>Απαραίτητη προϋποθεση για την χρήση του τελεστη **super** είναι τα παιδιά της γονικής κλάσης να έχουν πρόσβαση στα δεδομένα ή τις μεθόδους της γονικής κλάσης. Για να γίνει αυτό, τα πεδία και οι μέθοδοι της γονικής κλάσης που θέλουμε να προσπελάσουμε δεν θα πρέπει να έχουν των προσδιοριστή πρόσβασης **private**. | + | <WRAP important 80% center round>Απαραίτητη προϋπόθεση για την πρόσβαση στα πεδία της γονικής κλάσης μέσω του τελεστη **super** είναι η κλάση να έχει πρόσβαση στα δεδομένα ή τις μεθόδους της γονικής κλάσης τις οποίες καλείται να προσπελάσει. Για να γίνει αυτό, τα πεδία και οι μέθοδοι της γονικής κλάσης που θέλουμε να προσπελάσουμε ΔΕΝ θα πρέπει **α)** να έχουν προσδιοριστή πρόσβασης **private** ή **β)** δεν θα πρέπει να έχουν προσδιοριστή **package private (δηλ. κανένα προσδιοριστή)** και να ανήκουν σε διαφορετικά πακέτα. |
</WRAP> | </WRAP> | ||
+ | |||
+ | |Προηγούμενο: [[ :java:final | Final Κλάσεις και Μέθοδοι ]] | [[ :toc | Περιεχόμενα ]] | Επόμενο: [[ :java:object_class | Η κλάση Object ]]| |