This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
|
java:super_operator [2017/03/03 13:21] gthanos [Πρόσβαση σε πεδία και μεθόδους των αντικειμένων της γονικής κλάσης μέσω του τελεστή super] |
java:super_operator [2022/03/11 05:23] gthanos [Πρόσβαση στις μεθόδους της γονικής κλάσης] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Ο τελεστής super ====== | ====== Ο τελεστής super ====== | ||
| - | Σε προηγούμενη παράγραφο είδαμε την χρήση του **[[java: | + | Σε προηγούμενη παράγραφο είδαμε την χρήση του **[[java: |
| ===== Πρόσβαση στους κατασκευαστές της γονικής κλάσης μέσω του τελεστή super ===== | ===== Πρόσβαση στους κατασκευαστές της γονικής κλάσης μέσω του τελεστή super ===== | ||
| - | Λαμβάνοντας κώδικα από το προηγούμενο παράδειγμα του ποδηλάτου έχουμε | + | Επαναλαμβάνοντας |
| - | <code java Bicycle.java> | + | <code java BasicRectangle.java> |
| - | public | + | class BasicRectangle |
| + | |||
| + | int width; | ||
| + | int height; | ||
| - | public | + | public |
| - | public int gear; | + | |
| - | public int speed; | + | |
| - | + | ||
| - | public Bicycle(int startCadence, int startSpeed, int startGear) { | + | |
| - | | + | |
| - | cadence | + | |
| - | | + | |
| } | } | ||
| - | + | | |
| - | public void setCadence(int newValue) { | + | |
| - | cadence = newValue; | + | |
| - | } | + | |
| - | + | ||
| - | public void setGear(int newValue) { | + | |
| - | gear = newValue; | + | |
| - | } | + | |
| - | + | ||
| - | public void applyBrake(int decrement) { | + | |
| - | speed -= decrement; | + | |
| - | } | + | |
| - | + | ||
| - | public void speedUp(int increment) { | + | |
| - | speed += increment; | + | |
| - | } | + | |
| } | } | ||
| </ | </ | ||
| - | <code java MountainBike.java> | + | Η κλάση Rectangle περιέχει ένα πεδίο τύπου Point. Την κλάση Point μπορείτε να την βρείτε [[java: |
| - | public class MountainBike extends Bicycle { | + | |
| - | public int seatHeight; | + | <code java Rectangle.java> |
| - | + | class Rectangle extends BasicRectangle{ | |
| - | public | + | |
| - | int startSpeed, int startGear) { | + | Point origin; |
| - | super(startCadence, startSpeed, startGear); | + | |
| - | | + | public |
| - | } | + | super(initWidth, initHeight); |
| - | + | | |
| - | public void setHeight(int newValue) { | + | |
| - | seatHeight | + | |
| } | } | ||
| + | | ||
| + | public Rectangle(int initWidth, int initHeight, int originX, int originY) { | ||
| + | super(initWidth, | ||
| + | origin = new Point(originX, | ||
| + | } | ||
| + | | ||
| } | } | ||
| </ | </ | ||
| - | H χρήση του | + | Ο τελεστής **super** χρησιμοποιείται |
| + | |||
| + | Η κλήση του γονικού κατασκευαστή με χρήση της λέξης super πρέπει να βρίσκεται ως πρώτη εντολή στο σώμα κάθε κατασκευαστή. | ||
| - | ===== Σειρά αρχικοποίησης μεταξύ της γονικής και και της απογόνου κλάσης | + | ==== Σειρά αρχικοποίησης μεταξύ της γονικής και και της απογόνου κλάσης ==== |
| - | Στις περιπτώσεις που μία κλάση είναι απόγονος άλλης κλάσης η διαδικασία αρχικοποίησης έχει ως εξής. Αρχικά αρχικοποιείται το τμήμα της κλάσης που αφορά την γονική κλάση καλώντας των κατασκευαστή αυτής μέσω του τελεστή **super** και στη συνέχεια αρχικοποιείται η απόγονος κλάση. | + | Στις περιπτώσεις που μία κλάση είναι απόγονος άλλης κλάσης η διαδικασία αρχικοποίησης έχει ως εξής. Αρχικά αρχικοποιείται το τμήμα της κλάσης που αφορά την γονική κλάση καλώντας τον κατασκευαστή αυτής μέσω του τελεστή **super** και στη συνέχεια αρχικοποιείται η απόγονος κλάση. Εάν κατά την κλήση **super** η γονική κλάση έχει με τη σειρά της μία άλλη πρόγονο κλάση, οφείλει να καλέσει τον κατασκευαστή αυτής. Η διαδικασία επαναλαμβάνεται μέχρι να κληθεί ο κατασκευαστής της κλάσης [[https:// |
| Εάν δεν υπάρχει κλήση του κατασκευαστή της γονικής κλάσης μέσω του τελεστή **super** στον κατασκευαστή της απογόνου κλάσης, | Εάν δεν υπάρχει κλήση του κατασκευαστή της γονικής κλάσης μέσω του τελεστή **super** στον κατασκευαστή της απογόνου κλάσης, | ||
| Line 96: | Line 84: | ||
| ===== Πρόσβαση σε πεδία και μεθόδους των αντικειμένων της γονικής κλάσης μέσω του τελεστή super ===== | ===== Πρόσβαση σε πεδία και μεθόδους των αντικειμένων της γονικής κλάσης μέσω του τελεστή super ===== | ||
| - | Στο παρακάτω παράδειγμα, | + | ==== Πρόσβαση στις μεθόδους της γονικής κλάσης |
| - | < | + | Ξαναγράφουμε τις κλάσεις '' |
| - | class Mammal { | + | |
| + | <code java BasicRectangle.java> | ||
| + | class BasicRectangle { | ||
| + | | ||
| + | int width; | ||
| + | int height; | ||
| + | |||
| + | public Rectangle(int initWidth, int initHeight) { | ||
| + | width = initWidth; | ||
| + | height = initHeight; | ||
| + | } | ||
| + | | ||
| public String toString() { | public String toString() { | ||
| - | return "I am a mammal."; | + | return "width: |
| } | } | ||
| } | } | ||
| + | </ | ||
| - | class Cat extends | + | <code java Rectangle.java> |
| + | class Rectangle | ||
| + | |||
| + | Point origin; | ||
| + | |||
| + | public Rectangle(int initWidth, int initHeight, Point initOrigin) { | ||
| + | super(initWidth, | ||
| + | origin = initOrigin; | ||
| + | } | ||
| + | |||
| + | public Rectangle(int initWidth, int initHeight, int originX, int originY) { | ||
| + | super(initWidth, | ||
| + | origin = new Point(originX, | ||
| + | } | ||
| + | | ||
| public String toString() { | public String toString() { | ||
| - | return | + | return |
| } | } | ||
| - | } | + | |
| - | + | public | |
| - | public class KittenBirth { | + | |
| - | public | + | |
| - | | + | |
| - | System.out.println(kitten); | + | |
| } | } | ||
| } | } | ||
| </ | </ | ||
| - | Αντίστοιχα, ο κατασκευαστής της κλάσης '' | + | Παρατηρήστε ότι η μέθοδος toString για την |
| - | < | + | ==== Πρόσβαση στα πεδία της γονικής κλάσης ==== |
| - | public class MountainBike extends Bicycle { | + | |
| - | + | Επιπλέον, | |
| - | // the MountainBike subclass has | + | <code java> |
| - | // one field | + | public int getPerimeter() { |
| - | | + | |
| - | + | } | |
| - | // the MountainBike subclass has | + | |
| - | // one constructor | + | |
| - | public MountainBike(int startHeight, | + | |
| - | int startSpeed, int startGear) { | + | |
| - | // | + | |
| - | super.cadence = startCadence; | + | |
| - | super.speed = startSpeed; | + | |
| - | super.gear = startGear; | + | |
| - | seatHeight = startHeight; | + | |
| - | } | + | |
| - | + | ||
| - | // the MountainBike subclass has | + | |
| - | // one method | + | |
| - | public void setHeight(int newValue) { | + | |
| - | seatHeight = newValue; | + | |
| - | | + | |
| - | + | ||
| - | } | + | |
| </ | </ | ||
| + | <code java> | ||
| + | public int getPerimeter() { | ||
| + | return 2*(super.width+super.height); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Ο λόγος που μπορούμε να γράψουμε τη συνάρτηση με τους δύο παραπάνω τρόπους είναι ότι το πεδίο width, που κληρονομείται από τη γονική κλάση, ανήκει τόσο στην τρέχουσα κλάση '' | ||
| - | Συμπερασματικά, | + | Συμπερασματικά, |
| <WRAP important 80% center round> | <WRAP important 80% center round> | ||