Java super Keyword (Με παραδείγματα)

Σε αυτό το σεμινάριο, θα μάθουμε για την υπερ-λέξη-κλειδί στην Java με τη βοήθεια παραδειγμάτων.

Η superλέξη-κλειδί στην Java χρησιμοποιείται σε υποκατηγορίες για πρόσβαση σε μέλη superclass (χαρακτηριστικά, κατασκευαστές και μέθοδοι).

Πριν μάθουμε για τη superλέξη-κλειδί, φροντίστε να γνωρίζετε για την κληρονομιά Java.

Χρήσεις σούπερ λέξεων-κλειδιών

  1. Για να καλέσετε μεθόδους του superclass που παρακάμπτεται στην υποκατηγορία.
  2. Για να αποκτήσετε πρόσβαση σε χαρακτηριστικά (πεδία) του superclass εάν και τα δύο superclass και subclass έχουν χαρακτηριστικά με το ίδιο όνομα.
  3. Για να καλέσετε ρητά superclass no-arg (προεπιλογή) ή παραμετροποιημένο κατασκευαστή από τον κατασκευαστή της υποκατηγορίας.

Ας καταλάβουμε κάθε μία από αυτές τις χρήσεις.

1. Πρόσβαση στις παρακάμψεις μεθόδους του superclass

Εάν οι μέθοδοι με το ίδιο όνομα ορίζονται τόσο σε superclass όσο και σε subclass, η μέθοδος στην subclass υπερισχύει της μεθόδου στο superclass. Αυτό ονομάζεται παράκαμψη μεθόδου.

Παράδειγμα 1: Παράκαμψη μεθόδου

 class Animal ( // overridden method public void display()( System.out.println("I am an animal"); ) ) class Dog extends Animal ( // overriding method @Override public void display()( System.out.println("I am a dog"); ) public void printMessage()( display(); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); dog1.printMessage(); ) ) 

Παραγωγή

 είμαι σκύλος 

Σε αυτό το παράδειγμα, κάνοντας ένα αντικείμενο dog1 της κλάσης Dog, μπορούμε να καλέσουμε τη μέθοδο printMessage () που στη συνέχεια εκτελεί τη display()δήλωση.

Δεδομένου ότι display()ορίζεται και στις δύο κατηγορίες, η μέθοδος της υποκατηγορίας Dog αντικαθιστά τη μέθοδο του superclass Animal. Ως εκ τούτου, display()καλείται η υποκατηγορία.

Τι γίνεται αν πρέπει να καλείται η αντικατασταθείσα μέθοδος του superclass;

Χρησιμοποιούμε super.display()εάν display()πρέπει να κληθεί η παράκαμψη της μεθόδου Superclass Animal.

Παράδειγμα 2: μέθοδος Super to Call Superclass

 class Animal ( // overridden method public void display()( System.out.println("I am an animal"); ) ) class Dog extends Animal ( // overriding method @Override public void display()( System.out.println("I am a dog"); ) public void printMessage()( // this calls overriding method display(); // this calls overridden method super.display(); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); dog1.printMessage(); ) ) 

Παραγωγή

 Είμαι σκύλος, είμαι ζώο 

Εδώ, πώς λειτουργεί το παραπάνω πρόγραμμα.

2. Χαρακτηριστικά πρόσβασης του Superclass

Η superclass και η υποκατηγορία μπορούν να έχουν χαρακτηριστικά με το ίδιο όνομα. Χρησιμοποιούμε τη superλέξη-κλειδί για πρόσβαση στο χαρακτηριστικό του superclass.

Παράδειγμα 3: Προσπελάστε το χαρακτηριστικό superclass

 class Animal ( protected String; ) class Dog extends Animal ( public String; public void printType() ( System.out.println("I am a " + type); System.out.println("I am an " + super.type); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); dog1.printType(); ) ) 

Έξοδος :

 Είμαι θηλαστικό Είμαι ζώο 

Σε αυτό το παράδειγμα, έχουμε ορίσει τον ίδιο τύπο πεδίου παρουσίας τόσο στο Superclass Animal όσο και στην υποκατηγορία Dog.

Στη συνέχεια δημιουργήσαμε ένα αντικείμενο dog1 της κατηγορίας Dog. Στη συνέχεια, η printType()μέθοδος καλείται χρησιμοποιώντας αυτό το αντικείμενο.

Μέσα στη printType()συνάρτηση,

  • Ο τύπος αναφέρεται στο χαρακτηριστικό της υποκατηγορίας Dog.
  • Το super.type αναφέρεται στο χαρακτηριστικό του superclass Animal.

Ως εκ τούτου, System.out.println("I am a " + type);εκτυπώνω είμαι θηλαστικό. Και, System.out.println("I am an " + super.type);εκτυπώσεις Είμαι ζώο.

3. Χρήση του super () για πρόσβαση στον κατασκευαστή superclass

Όπως γνωρίζουμε, όταν δημιουργείται ένα αντικείμενο μιας κλάσης, ο προεπιλεγμένος κατασκευαστής καλείται αυτόματα.

Για να καλέσουμε ρητά τον κατασκευαστή superclass από τον κατασκευαστή της υποκατηγορίας, χρησιμοποιούμε super(). Είναι μια ειδική μορφή της superλέξης-κλειδιού.

super() μπορεί να χρησιμοποιηθεί μόνο μέσα στον κατασκευαστή της υποκατηγορίας και πρέπει να είναι η πρώτη δήλωση.

Παράδειγμα 4: Χρήση του super ()

 class Animal ( // default or no-arg constructor of class Animal Animal() ( System.out.println("I am an animal"); ) ) class Dog extends Animal ( // default or no-arg constructor of class Dog Dog() ( // calling default constructor of the superclass super(); System.out.println("I am a dog"); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); ) ) 

Παραγωγή

 Είμαι ζώο, είμαι σκύλος 

Εδώ, όταν δημιουργείται ένα αντικείμενο dog1 of Dog class, καλεί αυτόματα τον προεπιλεγμένο ή μη-arg κατασκευαστή αυτής της κλάσης.

Inside the subclass constructor, the super() statement calls the constructor of the superclass and executes the statements inside it. Hence, we get the output I am an animal.

The flow of the program then returns back to the subclass constructor and executes the remaining statements. Thus, I am a dog will be printed.

However, using super() is not compulsory. Even if super() is not used in the subclass constructor, the compiler implicitly calls the default constructor of the superclass.

So, why use redundant code if the compiler automatically invokes super()?

It is required if the parameterized constructor (a constructor that takes arguments) of the superclass has to be called from the subclass constructor.

Η παραμετροποίηση super()πρέπει πάντα να είναι η πρώτη δήλωση στο σώμα του κατασκευαστή της υποκατηγορίας, διαφορετικά, έχουμε ένα σφάλμα συλλογής.

Παράδειγμα 5: Παραμετροποιημένος κατασκευαστής κλήσης με χρήση super ()

 class Animal ( // default or no-arg constructor Animal() ( System.out.println("I am an animal"); ) // parameterized constructor Animal(String type) ( System.out.println("Type: "+type); ) ) class Dog extends Animal ( // default constructor Dog() ( // calling parameterized constructor of the superclass super("Animal"); System.out.println("I am a dog"); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); ) ) 

Παραγωγή

 Τύπος: Ζώο Είμαι σκύλος 

Ο μεταγλωττιστής μπορεί να καλέσει αυτόματα τον κατασκευαστή no-arg. Ωστόσο, δεν μπορεί να καλέσει παραμετροποιημένους κατασκευαστές.

Εάν πρέπει να κληθεί ένας παραμετροποιημένος κατασκευαστής, πρέπει να τον ορίσουμε ρητά στον κατασκευαστή υποκατηγοριών

Σημειώστε ότι στο παραπάνω παράδειγμα, ονομάσαμε ρητά τον παραμετροποιημένο κατασκευαστή super("Animal"). Ο μεταγλωττιστής δεν καλεί τον προεπιλεγμένο κατασκευαστή του superclass σε αυτήν την περίπτωση.

ενδιαφέροντα άρθρα...