java:super_operator

Ο τελεστής super

Σε προηγούμενη παράγραφο είδαμε την χρήση του τελεστή this. Σε αναλογία με τον τελεστή this, ο τελεστής super δείχνει στο αντικείμενο της γονικής κλάσης. Προϋπόθεση για την χρήση του τελεστή super είναι να υφίσταται γονική κλάση μέσω της διαδικασίας της κληρονομικότητας.

Πρόσβαση στους κατασκευαστές της γονικής κλάσης μέσω του τελεστή super

Λαμβάνοντας κώδικα από το προηγούμενο παράδειγμα του ποδηλάτου έχουμε τα εξής:

Bicycle.java
    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;
        }
 
    }
MountainBike.java
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 κατασκευαστής εμφανίζει μήνυμα λάθους.

Δείτε το παρακάτω παράδειγμα κώδικα που συμπυκνώνει τη διαδικασία αρχικοποίησης. Ακολουθήστε τα εξής βήματα:

  1. Προσπαθήστε να μεταγλωττίσετε ως έχει και δείτε το μήνυμα λάθους του μεταγλωττιστή.
  2. Αφαιρέστε από τα σχόλια την γραμμή 11 και μεταγλωττίστε.
  3. Προσθέστε σε σχόλια την γραμμή 11 και αφαιρέστε τα σχόλια από την γραμμή 15. Μεταγλωττίστε ξανά.

Παρατηρήστε ότι στις περιπτώσεις 2 και 3 ο κώδικας μεταγλωττίζεται. Εκτελέστε και δείτε τα μηνύματα που εκτυπώνονται.

ObjectInitializationSequence.java
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 θα μπορούσε να γραφεί ως εξής.

MountainBike.java
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/super_operator.txt · Last modified: 2017/02/16 13:40 by gthanos