java:super_operator

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: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 ]]|
java/super_operator.txt · Last modified: 2017/02/16 13:40 by gthanos