This is an old revision of the document!
Σε προηγούμενη παράγραφο είδαμε την χρήση του τελεστή this. Σε αναλογία με τον τελεστή this, ο τελεστής super δείχνει στο αντικείμενο της γονικής κλάσης.
Λαμβάνοντας κώδικα από το προηγούμενο παράδειγμα του παραλληλογράμμου έχουμε…
class BasicRectangle { int width; int height; public Rectangle(int initWidth, int initHeight) { width = initWidth; height = initHeight; } /* μέθοδοι της κλάσης */ }
class Rectangle extends BasicRectangle{ Point origin; public Rectangle(int initWidth, int initHeight, Point initOrigin) { super(initWidth, initHeight); origin = initOrigin; } public Rectangle(int initWidth, int initHeight, int originX, int originY) { super(initWidth, initHeight); origin = new Point(originX,originY); } }
H χρήση του τελεστή super χρησιμοποιείται για να προσπελάσει τον κατασκευαστή της γονικής κλάσης και να αρχικοποιήσει τις μεταβλητές που ανήκουν στο γονικό κομμάτι της κλάση.
Στις περιπτώσεις που μία κλάση είναι απόγονος άλλης κλάσης η διαδικασία αρχικοποίησης έχει ως εξής. Αρχικά αρχικοποιείται το τμήμα της κλάσης που αφορά την γονική κλάση καλώντας των κατασκευαστή αυτής μέσω του τελεστή super και στη συνέχεια αρχικοποιείται η απόγονος κλάση.
Εάν δεν υπάρχει κλήση του κατασκευαστή της γονικής κλάσης μέσω του τελεστή super στον κατασκευαστή της απογόνου κλάσης, τότε ο compiler αναζητά εάν υπάρχει ο default κατασκευαστής για την γονική κλάση (δηλ. κατασκευαστής χωρίς ορίσματα) και καλεί αυτόματα αυτόν. Εάν δεν υπάρχει ούτε default κατασκευαστής εμφανίζει μήνυμα λάθους.
Δείτε το παρακάτω παράδειγμα κώδικα που συμπυκνώνει τη διαδικασία αρχικοποίησης. Ακολουθήστε τα εξής βήματα:
Παρατηρήστε ότι στις περιπτώσεις 2 και 3 ο κώδικας μεταγλωττίζεται. Εκτελέστε και δείτε τα μηνύματα που εκτυπώνονται.
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(); } }
Στο προηγούμενο παράδειγμα, αλλάζουμε την προσβασιμότητα του πεδίου color της κλάσης Bicycle, σε protected. Πλέον μπορούμε να το προσπελάσουμε στη μέθοδο updateColor της κλάσης MountainBike. Μπορούμε να γράψουμε:
super.color = color; ή this.color = color;
διότι το πεδίο color ανήκει τόσο στην γονική κλάση όσο και στην υποκλάση.
Επιπλέον η μέθοδος toString της κλάσης MountainBike χρησιμοποιεί εσωτερικά την μέθοδο toString της προγόνου κλάσης Bicycle. Για να γίνει η κλήση πρέπει υποχρεωτικά να καλέσετε τη μέθοδο βάζοντας μπροστά τον τελεστή super. Εάν παραλήψετε τον τελεστή super η μέθοδος καλεί αναδρομικά (και διαρκώς) τον εαυτό της και όχι τη μέθοδο της γονικής κλάσης.
public class Bicycle { 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() { return "frame: "+frameSize+", gears: "+gearsNumber+", color: "+color; } }
public class MountainBike extends Bicycle { private boolean suspension; public MountainBike(int frameSize, int gearsNumber, String color, boolean hasSuspension) { super(frameSize, gearsNumber, color); this.suspension = hasSuspension; } public boolean hasSuspension() { return suspension; } public void updateColor(String color) { super.color = color; // ή ισοδύναμα // this.color = color; } public String toString() { String str = ", hasSuspension: " + (suspension ? "yes" : "no"); return super.toString() + str; } }
Συμπερασματικά, ο τελεστής super δείχνει στο αντικείμενο της γονικής κλάσης και χρησιμοποιείται για να προσπελαστούν πεδία ή μέθοδοι που ανήκουν στο τμήμα του τρέχοντος αντικειμένου που αφορά την γονική κλάση.
Απαραίτητη προϋπόθεση για την πρόσβαση στα πεδία της γονικής κλάσης μέσω του τελεστη super είναι η κλάση να έχει πρόσβαση στα δεδομένα ή τις μεθόδους της γονικής κλάσης τις οποίες καλείται να προσπελάσει. Για να γίνει αυτό, τα πεδία και οι μέθοδοι της γονικής κλάσης που θέλουμε να προσπελάσουμε ΔΕΝ θα πρέπει α) να έχουν προσδιοριστή πρόσβασης private ή β) δεν θα πρέπει να έχουν προσδιοριστή package private (δηλ. κανένα προσδιοριστή) και να ανήκουν σε διαφορετικά πακέτα.
| Προηγούμενο: Κληρονομικότητα πολλαπλών γονικών κλάσεων | Περιεχόμενα | Επόμενο: Η κλάση Object |