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 17:21] – [Πρόσβαση σε πεδία και μεθόδους των αντικειμένων της γονικής κλάσης μέσω του τελεστή super] gthanosjava:super_operator [2022/03/11 05:25] (current) – [Πρόσβαση στα πεδία της γονικής κλάσης] gthanos
Line 5: Line 5:
 ===== Πρόσβαση στους κατασκευαστές της γονικής κλάσης μέσω του τελεστή super ===== ===== Πρόσβαση στους κατασκευαστές της γονικής κλάσης μέσω του τελεστή super =====
  
-Λαμβάνοντας κώδικα από το προηγούμενο παράδειγμα του παραλληλογράμμου έχουμε...+Επαναλαμβάνοντας τον βασικό κώδικα από το προηγούμενο παράδειγμα του παραλληλογράμμου έχουμε:
  
 <code java BasicRectangle.java> <code java BasicRectangle.java>
Line 17: Line 17:
     height = initHeight;     height = initHeight;
   }   }
-  /* μέθοδοι της κλάσης +  
-   */+
 } }
 </code> </code>
 +
 +Η κλάση Rectangle περιέχει ένα πεδίο τύπου Point. Την κλάση Point μπορείτε να την βρείτε [[java:inheritance|εδώ]].
  
 <code java Rectangle.java> <code java Rectangle.java>
Line 36: Line 37:
     origin = new Point(originX,originY);     origin = new Point(originX,originY);
   }   }
 +  
 } }
 </code> </code>
  
 +Ο τελεστής **super** χρησιμοποιείται στην υποκλάση για να προσπελάσει τον κατασκευαστή της γονικής κλάσης και να αρχικοποιήσει με αυτό τον τρόπο τις μεταβλητές που ανήκουν στο γονικό κομμάτι της κλάσης.
 +
 +Η κλήση του γονικού κατασκευαστή με χρήση της λέξης super πρέπει να βρίσκεται ως πρώτη εντολή στο σώμα κάθε κατασκευαστή.
  
-H χρήση του τελεστή **super** χρησιμοποιείται για να προσπελάσει τον κατασκευαστή της γονικής κλάσης και να αρχικοποιήσει τις μεταβλητές που ανήκουν στο γονικό κομμάτι της κλάση. 
 ==== Σειρά αρχικοποίησης μεταξύ της γονικής και και της απογόνου κλάσης ==== ==== Σειρά αρχικοποίησης μεταξύ της γονικής και και της απογόνου κλάσης ====
  
-Στις περιπτώσεις που μία κλάση είναι απόγονος άλλης κλάσης η διαδικασία αρχικοποίησης έχει ως εξής. Αρχικά αρχικοποιείται το τμήμα της κλάσης που αφορά την γονική κλάση καλώντας των κατασκευαστή αυτής μέσω του τελεστή **super** και στη συνέχεια αρχικοποιείται η απόγονος κλάση. +Στις περιπτώσεις που μία κλάση είναι απόγονος άλλης κλάσης η διαδικασία αρχικοποίησης έχει ως εξής. Αρχικά αρχικοποιείται το τμήμα της κλάσης που αφορά την γονική κλάση καλώντας τον κατασκευαστή αυτής μέσω του τελεστή **super** και στη συνέχεια αρχικοποιείται η απόγονος κλάση. Εάν κατά την κλήση **super** η γονική κλάση έχει με τη σειρά της μία άλλη πρόγονο κλάση, οφείλει να καλέσει τον κατασκευαστή αυτής. Η διαδικασία επαναλαμβάνεται μέχρι να κληθεί ο κατασκευαστής της κλάσης [[https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html|java.lang.Object]].
  
 Εάν δεν υπάρχει κλήση του κατασκευαστή της γονικής κλάσης μέσω του τελεστή **super** στον κατασκευαστή της απογόνου κλάσης, τότε ο compiler αναζητά εάν υπάρχει ο **default** κατασκευαστής για την γονική κλάση (δηλ. κατασκευαστής χωρίς ορίσματα) και καλεί αυτόματα αυτόν. Εάν δεν υπάρχει ούτε **default** κατασκευαστής εμφανίζει μήνυμα λάθους. Εάν δεν υπάρχει κλήση του κατασκευαστή της γονικής κλάσης μέσω του τελεστή **super** στον κατασκευαστή της απογόνου κλάσης, τότε ο compiler αναζητά εάν υπάρχει ο **default** κατασκευαστής για την γονική κλάση (δηλ. κατασκευαστής χωρίς ορίσματα) και καλεί αυτόματα αυτόν. Εάν δεν υπάρχει ούτε **default** κατασκευαστής εμφανίζει μήνυμα λάθους.
Line 80: Line 84:
 ===== Πρόσβαση σε πεδία και μεθόδους των αντικειμένων της γονικής κλάσης μέσω του τελεστή super ===== ===== Πρόσβαση σε πεδία και μεθόδους των αντικειμένων της γονικής κλάσης μέσω του τελεστή super =====
  
-Στο προηγούμενο παράδειγμα, μπορούμε να γράψουμε: +==== Πρόσβαση στις μεθόδους της γονικής κλάσης ====
-<code>  +
-super.color = color;  +
-  ή  +
-this.color = color; +
-</code> +
-διότι το πεδίο color ανήκει τόσο στην γονική κλάση όσο και στην υποκλάση.+
  
-Επιπλέον η μέθοδος toString της κλάσης MountainBike χρησιμοποιεί εσωτερικά την μέθοδο toString της προγόνου κλάσης Bicycle. Για να γίνει η κλήση πρέπει υποχρεωτικά να καλέσετε τη μέθοδο βάζοντας μπροστά τον τελεστή super. Εάν παραλήψετε τον τελεστή super η μέθοδος καλεί αναδρομικά (και διαρκώς) τον εαυτό της και όχι τη μέθοδο της γονικής κλάσης.+Ξαναγράφουμε τις κλάσεις ''BasicRectangle'' και ''Rectangle'', προσθέτοντας αυτή τη φορά τον ορισμό της μεθόδου ''public String toString()'' και στις δύο. Η μέθοδος αυτή, όπως έχουμε δει, είναι υπαρκτή σε όλα τα αντικείμενα διότι περιέχεται στην κλάση [[https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html|java.lang.Object]].
  
-<code java Bicycle.java> +<code java BasicRectangle.java> 
-public class Bicycle { +class BasicRectangle {
-         +
-    private int frameSize; +
-    private int gearsNumber; +
-    protected String color; +
-        +
-    public Bicycle(int frameSize, int gearsNumber, String color) { +
-        this.frameSize = frameSize; +
-        this.gearsNumber = gearsNumber; +
-        this.color = color; +
-    } +
-     +
-    public int getFrameSize() { +
-          return frameSize; +
-    } +
-     +
-    public int getGearsNumber() { +
-          return gearsNumber; +
-    } +
-     +
-    public String getColor() { +
-        return color; +
-    } +
-     +
-    public void setColor(String color) { +
-        this.color = color; +
-    }+
          
-    public String toString() { +  int width; 
-        return "frame: "+frameSize+", gears: "+gearsNumber+", color: "+color+  int height; 
-    }+  
 +  public Rectangle(int initWidth, int initHeight) { 
 +    width = initWidth; 
 +    height = initHeight; 
 +  } 
 +   
 +  public String toString() { 
 +    return "width: "+width+", height: "+height
 +  }
 } }
 </code> </code>
  
-<code java MountainBike.java> +<code java Rectangle.java> 
-public class MountainBike extends Bicycle {+class Rectangle extends BasicRectangle{
          
-    private boolean suspension;+  Point origin;
          
-    public MountainBike(int frameSize, int gearsNumberString color, boolean hasSuspension) { +  public Rectangle(int initWidth, int initHeightPoint initOrigin) { 
-        super(frameSizegearsNumber, color); +    super(initWidthinitHeight); 
-        this.suspension hasSuspension+    origin initOrigin
-    +  
-     +   
-    public boolean hasSuspension() { +  public Rectangle(int initWidth, int initHeight, int originX, int originY) { 
-        return suspension; +    super(initWidth, initHeight); 
-    +    origin new Point(originX,originY)
-     +  
-    public void updateColor(String color+   
-        super.color = color+  public String toString() { 
-        // ή ισοδύναμα +    return origin.toString() + " " + super.toString(); 
-        // this.color color+  } 
-         +   
-    +  public int area() { 
-     +    return width*height; 
-    public String toString() { +  }
-        String str = ", hasSuspension: " + (suspension ? "yes" : "no"); +
-        return super.toString() + str; +
-    }+
 } }
 </code> </code>
  
 +Παρατηρήστε ότι η μέθοδος toString για την κλάση Rectangle χρησιμοποιεί τη μέθοδο toString της κλάσης ''Point'' και της γονικής της κλάσης ''BasicRectangle'' (βλέπε ''super.toString()''). Ο λόγος που σε αυτό το σημείο είναι απαραίτητη η χρήση του τελεστή **super**, είναι ότι εάν δεν βάλουμε τη λέξη **super.** κατά την κλήση της toString(), η συνάρτηση δεν θα καλέσει τη συνάρτηση toString της γονικής κλάσης, αλλά τον εαυτό της. Σε αυτή την περίπτωση, η αναδρομική κλήση είναι ατέρμονη, μοιραία θα οδηγήσει σε υπέρβαση της διαθέσιμης στοίβας εκτέλεσης του προγράμματος, με συνέπεια τον τερματισμό του.
 +
 +==== Πρόσβαση στα πεδία της γονικής κλάσης ====
 +
 +Επιπλέον, στην κλάση Rectangle, ορίσαμε παραπάνω τη μέθοδο area. H μέθοδος μπορεί να γραφεί με τις εξής τρεις (3) ισοδύναμες παραλλαγές.
 +<code java> 
 +  public int area() {
 +    return width * height;
 +  }
 +</code>
 +<code java> 
 +  public int area() {
 +    return this.width * this.height;
 +  }
 +</code>
 +<code java> 
 +  public int area() {
 +    return super.width * super.height;
 +  }
 +</code>
 +
 +Ο λόγος που μπορούμε να γράψουμε τη συνάρτηση με τους δύο παραπάνω τρόπους είναι ότι το πεδίο width, που κληρονομείται από τη γονική κλάση, ανήκει τόσο στην τρέχουσα κλάση ''Rectangle'', όσο και στη γονική της ''BasicRectangle''.
  
-Συμπερασματικά, ο τελεστής **super** δείχνει στο αντικείμενο της γονικής κλάσης και χρησιμοποιείται για να προσπελαστούν πεδία ή μέθοδοι που ανήκουν στο τμήμα του τρέχοντος αντικειμένου που αφορά την γονική κλάση+Συμπερασματικά, ο τελεστής **super** δείχνει στο τμήμα του τρέχοντος αντικειμένου που αφορά τη γονική κλάση και χρησιμοποιείται για να προσπελαστούν πεδία ή μέθοδοι που ανήκουν σε αυτό
  
 <WRAP important 80% center round>Απαραίτητη προϋπόθεση για την πρόσβαση στα πεδία της γονικής κλάσης μέσω του τελεστη **super** είναι η κλάση να έχει πρόσβαση στα δεδομένα ή τις μεθόδους της γονικής κλάσης τις οποίες καλείται να προσπελάσει. Για να γίνει αυτό, τα πεδία και οι μέθοδοι της γονικής κλάσης που θέλουμε να προσπελάσουμε ΔΕΝ θα πρέπει **α)** να έχουν προσδιοριστή πρόσβασης **private** ή **β)** δεν θα πρέπει να έχουν προσδιοριστή **package private (δηλ. κανένα προσδιοριστή)** και να ανήκουν σε διαφορετικά πακέτα.  <WRAP important 80% center round>Απαραίτητη προϋπόθεση για την πρόσβαση στα πεδία της γονικής κλάσης μέσω του τελεστη **super** είναι η κλάση να έχει πρόσβαση στα δεδομένα ή τις μεθόδους της γονικής κλάσης τις οποίες καλείται να προσπελάσει. Για να γίνει αυτό, τα πεδία και οι μέθοδοι της γονικής κλάσης που θέλουμε να προσπελάσουμε ΔΕΝ θα πρέπει **α)** να έχουν προσδιοριστή πρόσβασης **private** ή **β)** δεν θα πρέπει να έχουν προσδιοριστή **package private (δηλ. κανένα προσδιοριστή)** και να ανήκουν σε διαφορετικά πακέτα. 
java/super_operator.1614964892.txt.gz · Last modified: 2021/03/05 17:21 by gthanos