User Tools

Site Tools


java:super_operator

Differences

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

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
java:super_operator [2021/03/05 19:00] gthanosjava:super_operator [2022/03/11 05:25] (current) – [Πρόσβαση στα πεδία της γονικής κλάσης] gthanos
Line 48: Line 48:
  
 Στις περιπτώσεις που μία κλάση είναι απόγονος άλλης κλάσης η διαδικασία αρχικοποίησης έχει ως εξής. Αρχικά αρχικοποιείται το τμήμα της κλάσης που αφορά την γονική κλάση καλώντας τον κατασκευαστή αυτής μέσω του τελεστή **super** και στη συνέχεια αρχικοποιείται η απόγονος κλάση. Εάν κατά την κλήση **super** η γονική κλάση έχει με τη σειρά της μία άλλη πρόγονο κλάση, οφείλει να καλέσει τον κατασκευαστή αυτής. Η διαδικασία επαναλαμβάνεται μέχρι να κληθεί ο κατασκευαστής της κλάσης [[https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html|java.lang.Object]]. Στις περιπτώσεις που μία κλάση είναι απόγονος άλλης κλάσης η διαδικασία αρχικοποίησης έχει ως εξής. Αρχικά αρχικοποιείται το τμήμα της κλάσης που αφορά την γονική κλάση καλώντας τον κατασκευαστή αυτής μέσω του τελεστή **super** και στη συνέχεια αρχικοποιείται η απόγονος κλάση. Εάν κατά την κλήση **super** η γονική κλάση έχει με τη σειρά της μία άλλη πρόγονο κλάση, οφείλει να καλέσει τον κατασκευαστή αυτής. Η διαδικασία επαναλαμβάνεται μέχρι να κληθεί ο κατασκευαστής της κλάσης [[https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html|java.lang.Object]].
- 
-===== Πρόσβαση στα πεδία και τις μεθόδους της γονικής κλάσης μέσω του τελεστή super ===== 
  
 Εάν δεν υπάρχει κλήση του κατασκευαστή της γονικής κλάσης μέσω του τελεστή **super** στον κατασκευαστή της απογόνου κλάσης, τότε ο compiler αναζητά εάν υπάρχει ο **default** κατασκευαστής για την γονική κλάση (δηλ. κατασκευαστής χωρίς ορίσματα) και καλεί αυτόματα αυτόν. Εάν δεν υπάρχει ούτε **default** κατασκευαστής εμφανίζει μήνυμα λάθους. Εάν δεν υπάρχει κλήση του κατασκευαστή της γονικής κλάσης μέσω του τελεστή **super** στον κατασκευαστή της απογόνου κλάσης, τότε ο compiler αναζητά εάν υπάρχει ο **default** κατασκευαστής για την γονική κλάση (δηλ. κατασκευαστής χωρίς ορίσματα) και καλεί αυτόματα αυτόν. Εάν δεν υπάρχει ούτε **default** κατασκευαστής εμφανίζει μήνυμα λάθους.
Line 86: Line 84:
 ===== Πρόσβαση σε πεδία και μεθόδους των αντικειμένων της γονικής κλάσης μέσω του τελεστή super ===== ===== Πρόσβαση σε πεδία και μεθόδους των αντικειμένων της γονικής κλάσης μέσω του τελεστή super =====
  
-Ξαναγράφουμε τις κλάσεις ''BasicRectangle'' και ''Rectangle'', προσθέτοντας αυτή τη φορά τον ορισμό της μεθόδου ''public String toString()'' και στις δύο. Η μέθοδος αυτή όπως έχουμε δει είναι υπαρκτή σε όλα τα αντικείμενα διότι περιέχεται στην κλάση [[https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html|java.lang.Object]].+==== Πρόσβαση στις μεθόδους της γονικής κλάσης ==== 
 + 
 +Ξαναγράφουμε τις κλάσεις ''BasicRectangle'' και ''Rectangle'', προσθέτοντας αυτή τη φορά τον ορισμό της μεθόδου ''public String toString()'' και στις δύο. Η μέθοδος αυτήόπως έχουμε δειείναι υπαρκτή σε όλα τα αντικείμενα διότι περιέχεται στην κλάση [[https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html|java.lang.Object]].
  
 <code java BasicRectangle.java> <code java BasicRectangle.java>
Line 124: Line 124:
   }   }
      
-  public int getPerimeter() { +  public int area() { 
-    return 2*(width+height);+    return width*height;
   }   }
 } }
 </code> </code>
  
-Παρατηρήστε ότι η μέθοδος toString για την κλάση Rectangle χρησιμοποιεί τη μέθοδο toString της κλάσης Point και της γονικής της κλάσης BasicRectangle (βλέπε ''super.toString()''). Ο λόγος που σε αυτό το σημείο είναι απαραίτητη η χρήση του τελεστή super, είναι ότι εάν δεν βάλουμε τη λέξη super πριν από την κλήση της toString() η συνάρτηση δεν θα καλέσει τη συνάρτηση toString της γονικής κλάσης, αλλά τον εαυτό της. Σε αυτή την περίπτωση, η αναδρομική κλήση είναι ατέρμονη, μοιραία θα οδηγήσει σε υπέρβαση της διαθέσιμης στοίβας εκτέλεσης του προγράμματος, με συνέπεια τον τερματισμό του.+Παρατηρήστε ότι η μέθοδος toString για την κλάση Rectangle χρησιμοποιεί τη μέθοδο toString της κλάσης ''Point'' και της γονικής της κλάσης ''BasicRectangle'' (βλέπε ''super.toString()''). Ο λόγος που σε αυτό το σημείο είναι απαραίτητη η χρήση του τελεστή **super**, είναι ότι εάν δεν βάλουμε τη λέξη **super.** κατά την κλήση της toString()η συνάρτηση δεν θα καλέσει τη συνάρτηση toString της γονικής κλάσης, αλλά τον εαυτό της. Σε αυτή την περίπτωση, η αναδρομική κλήση είναι ατέρμονη, μοιραία θα οδηγήσει σε υπέρβαση της διαθέσιμης στοίβας εκτέλεσης του προγράμματος, με συνέπεια τον τερματισμό του.
  
-Επιπλέον, στην κλάση Rectangle, ορίζουμε τη μέθοδο getPerimeter. H μέθοδος μπορεί να γραφεί με τις εξής δύο (2) ισοδύναμες παραλλαγές. +==== Πρόσβαση στα πεδία της γονικής κλάσης ==== 
-<code>  + 
-  public int getPerimeter() { +Επιπλέον, στην κλάση Rectangle, ορίσαμε παραπάνω τη μέθοδο area. H μέθοδος μπορεί να γραφεί με τις εξής τρεις (3) ισοδύναμες παραλλαγές. 
-    return 2*(this.width+this.height);+<code java>  
 +  public int area() { 
 +    return width height; 
 +  } 
 +</code> 
 +<code java>  
 +  public int area() { 
 +    return this.width this.height;
   }   }
 </code> </code>
-<code>  +<code java>  
-  public int getPerimeter() { +  public int area() { 
-    return 2*(super.width+super.height);+    return super.width super.height;
   }   }
 </code> </code>
  
-Ο λόγος που μπορούμε να γράψουμε τη συνάρτηση με τους δύο παραπάνω τρόπους είναι ότι το πεδίο width επειδή κληρονομείται από τη γονική κλάση ανήκει τόσο στην τρέχουσα κλάση Rectangle, όσο και στη γονικής BasicRectangle.+Ο λόγος που μπορούμε να γράψουμε τη συνάρτηση με τους δύο παραπάνω τρόπους είναι ότι το πεδίο widthπου κληρονομείται από τη γονική κλάσηανήκει τόσο στην τρέχουσα κλάση ''Rectangle'', όσο και στη γονική της ''BasicRectangle''.
  
 Συμπερασματικά, ο τελεστής **super** δείχνει στο τμήμα του τρέχοντος αντικειμένου που αφορά τη γονική κλάση και χρησιμοποιείται για να προσπελαστούν πεδία ή μέθοδοι που ανήκουν σε αυτό.  Συμπερασματικά, ο τελεστής **super** δείχνει στο τμήμα του τρέχοντος αντικειμένου που αφορά τη γονική κλάση και χρησιμοποιείται για να προσπελαστούν πεδία ή μέθοδοι που ανήκουν σε αυτό. 
java/super_operator.1614970832.txt.gz · Last modified: 2021/03/05 19:00 by gthanos