====== Ο τελεστής super ======
Σε προηγούμενη παράγραφο είδαμε την χρήση του **[[java:this_operator |τελεστή this]]**. Σε αναλογία με τον τελεστή **this**, ο τελεστής **super** δείχνει στο αντικείμενο της γονικής κλάσης. Προϋπόθεση για την χρήση του τελεστή **super** είναι να υφίσταται γονική κλάση μέσω της διαδικασίας της κληρονομικότητας.
===== Πρόσβαση στους κατασκευαστές της γονικής κλάσης μέσω του τελεστή super =====
Λαμβάνοντας κώδικα από το προηγούμενο παράδειγμα του ποδηλάτου έχουμε τα εξής:
public class Bicycle {
// the Bicycle class has
// three fields
public int cadence;
public int gear;
public int speed;
// the Bicycle class has
// one constructor
public Bicycle(int startCadence, int startSpeed, int startGear) {
gear = startGear;
cadence = startCadence;
speed = startSpeed;
}
// the Bicycle class has
// four methods
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;
}
}
public class MountainBike extends Bicycle {
// the MountainBike subclass has
// one field
public int seatHeight;
// the MountainBike subclass has
// one constructor
public MountainBike(int startHeight, int startCadence,
int startSpeed, int startGear) {
super(startCadence, startSpeed, startGear);
seatHeight = startHeight;
}
// the MountainBike subclass has
// one method
public void setHeight(int newValue) {
seatHeight = newValue;
}
}
H χρήση του τελεστή **super** χρησιμοποιείται για να προσπελάσει τον κατασκευαστή της γονικής κλάσης και να αρχικοποιήσει τις μεταβλητές που ανήκουν στην κλάση αυτή.
===== Σειρά αρχικοποίησης μεταξύ της γονικής και και της απογόνου κλάσης =====
Στις περιπτώσεις που μία κλάση είναι απόγονος άλλης κλάσης η διαδικασία αρχικοποίησης έχει ως εξής. Αρχικά αρχικοποιείται το τμήμα της κλάσης που αφορά την γονική κλάση καλώντας των κατασκευαστή αυτής μέσω του τελεστή **super** και στη συνέχεια αρχικοποιείται η απόγονος κλάση.
Εάν δεν υπάρχει κλήση του κατασκευαστή της γονικής κλάσης μέσω του τελεστή **super** στον κατασκευαστή της απογόνου κλάσης, τότε ο compiler αναζητά εάν υπάρχει ο **default** κατασκευαστής για την γονική κλάση (δηλ. κατασκευαστής χωρίς ορίσματα) και καλεί αυτόματα αυτόν. Εάν δεν υπάρχει ούτε **default** κατασκευαστής εμφανίζει μήνυμα λάθους.
Δείτε το παρακάτω παράδειγμα κώδικα που συμπυκνώνει τη διαδικασία αρχικοποίησης. Ακολουθήστε τα εξής βήματα:
- Προσπαθήστε να μεταγλωττίσετε ως έχει και δείτε το μήνυμα λάθους του μεταγλωττιστή.
- Αφαιρέστε από τα σχόλια την γραμμή 11 και μεταγλωττίστε.
- Προσθέστε σε σχόλια την γραμμή 11 και αφαιρέστε τα σχόλια από την γραμμή 15. Μεταγλωττίστε ξανά.
Παρατηρήστε ότι στις περιπτώσεις 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();
}
}
===== Πρόσβαση σε πεδία και μεθόδους των αντικειμένων της γονικής κλάσης μέσω του τελεστή super =====
Ο κατασκευαστής της κλάσης ''MountainBike'' θα μπορούσε να γραφεί ως εξής.
public class MountainBike extends Bicycle {
// the MountainBike subclass has
// one field
public int seatHeight;
// the MountainBike subclass has
// one constructor
public MountainBike(int startHeight, int startCadence,
int startSpeed, int startGear) {
//super(startCadence, startSpeed, 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;
}
}
Συμπερασματικά, ο τελεστής **super** δείχνει στο αντικείμενο της γονικής κλάσης και χρησιμοποιείται για να προσπελαστούν δεδομένα ή μεταβλητές που ανήκουν στο τμήμα του τρέχοντος αντικειμένου που αφορά την γονική κλάση.
Απαραίτητη προϋπόθεση για την πρόσβαση στα πεδία της γονικής κλάσης μέσω του τελεστη **super** είναι η κλάση να έχει πρόσβαση στα δεδομένα ή τις μεθόδους της γονικής κλάσης τις οποίες καλείται να προσπελάσει. Για να γίνει αυτό, τα πεδία και οι μέθοδοι της γονικής κλάσης που θέλουμε να προσπελάσουμε ΔΕΝ θα πρέπει **α)** να έχουν προσδιοριστή πρόσβασης **private** ή **β)** δεν θα πρέπει να έχουν προσδιοριστή **package private (δηλ. κανένα προσδιοριστή)** και να ανήκουν σε διαφορετικά πακέτα.
|Προηγούμενο: [[ :java:final | Final Κλάσεις και Μέθοδοι ]] | [[ :toc | Περιεχόμενα ]] | Επόμενο: [[ :java:object_class | Η κλάση Object ]]|