Πολυμορφισμός σε Java (Στατικό και Δυναμικό)

⚡ Έξυπνη Σύνοψη

Πολυμορφισμός σε Java επιτρέπει σε μια διεπαφή να αναπαριστά πολλές μορφές, επομένως ένα μόνο όνομα μεθόδου συμπεριφέρεται διαφορετικά σε όλες τις σχετικές κλάσεις. Αποτελεί πυλώνα του αντικειμενοστρεφούς σχεδιασμού που προωθεί την ευελιξία, την επαναχρησιμοποίηση κώδικα και την καθαρή επέκταση παλαιών τραπεζικών, ιατρικών και εταιρικών συστημάτων.

  • 🎭 Πολλές μορφές, ένα όνομα: Πολυμορφισμός σε Java επιτρέπει στο ίδιο όνομα μεθόδου να αποστέλλεται σε διαφορετικές υλοποιήσεις με βάση τον πραγματικό τύπο αντικειμένου κατά τον χρόνο εκτέλεσης.
  • 🔀 Δύο γεύσεις: Ο πολυμορφισμός χρόνου μεταγλώττισης χρησιμοποιεί υπερφόρτωση μεθόδων, ενώ ο πολυμορφισμός χρόνου εκτέλεσης χρησιμοποιεί παράκαμψη μεθόδων μέσω κληρονομικότητας και JVM.
  • ⛓️ Στατική έναντι Δυναμικής σύνδεσης: Οι υπερφορτωμένες κλήσεις επιλύονται κατά τη στιγμή της μεταγλώττισης μέσω της στατικής σύνδεσης, ενώ οι παρακαμφθείσες κλήσεις επιλύονται κατά τον χρόνο εκτέλεσης μέσω της δυναμικής σύνδεσης.
  • ✅ Υπερδύναμη λέξεων-κλειδιών: Η λέξη-κλειδί super επιτρέπει σε μια υποκλάση να καλέσει την γονική υλοποίηση πριν προσθέσει τη δική της εξειδικευμένη συμπεριφορά στην κορυφή.
  • 🧪 Εμβέλεια σε πραγματικό κόσμο: Οι τραπεζικοί λογαριασμοί, οι ιεραρχίες του νοσοκομειακού προσωπικού και οι μηχανές απόδοσης σχημάτων βασίζονται στον πολυμορφισμό για να αναπτύξουν νέες απαιτήσεις χωρίς να παραβιάζουν τον δοκιμασμένο κώδικα.

Πολυμορφισμός σε Java

Σε τι είναι ο Πολυμορφισμός Java?

Πολυμορφισμός σε Java συμβαίνει όταν μία ή περισσότερες κλάσεις ή αντικείμενα σχετίζονται μεταξύ τους μέσω κληρονομικότητας. Είναι η ικανότητα ενός αντικειμένου να λαμβάνει πολλές μορφές. Η κληρονομικότητα επιτρέπει στους χρήστες να κληρονομούν χαρακτηριστικά και μεθόδους και ο Πολυμορφισμός χρησιμοποιεί αυτές τις μεθόδους για την εκτέλεση διαφορετικών εργασιών. Ο στόχος είναι η επικοινωνία, ενώ η προσέγγιση μπορεί να διαφέρει.

Για παράδειγμα, ένα smartphone χρησιμοποιείται για επικοινωνία. Η λειτουργία επικοινωνίας μπορεί να είναι μια κλήση, ένα μήνυμα κειμένου, ένα μήνυμα εικόνας ή ένα email. Ο στόχος είναι κοινός, δηλαδή η επικοινωνία, αλλά η προσέγγιση είναι διαφορετική. Αυτή η συμπεριφορά είναι η ουσία του ΠολυμορφισμόςΤώρα θα μάθουμε τον Πολυμορφισμό στο Java με παράδειγμα κώδικα, διαγράμματα και επεξηγήσεις βήμα προς βήμα.

Πατήστε εδώ εάν το βίντεο δεν είναι προσβάσιμο

Γιατί να Χρησιμοποιήσετε Πολυμορφισμό σε Java?

Πολυμορφισμός σε Java Χρησιμοποιείται επειδή καθιστά τον κώδικα ευέλικτο, επαναχρησιμοποιήσιμο και ευκολότερο στη συντήρηση. Μια μεμονωμένη μεταβλητή αναφοράς ενός γονικού τύπου μπορεί να δείχνει σε πολλά θυγατρικά αντικείμενα, επομένως η ίδια κλήση προσαρμόζεται σε οποιαδήποτε υποκλάση παρέχεται. Αυτό το μοτίβο διατηρεί τον δοκιμασμένο κώδικα ανέπαφο, ενώ προστίθεται νέα συμπεριφορά μέσω εξειδικευμένων υποκλάσεων, γι' αυτό ακριβώς εξαρτώνται από αυτό πλαίσια όπως το Spring και το Jakarta EE.

Java Πολυμορφισμός σε OOPs με Παράδειγμα

Θεωρήστε μια γονική κλάση με το όνομα Λογαριασμός με συναρτήσεις για κατάθεση και ανάληψη. Η κλάση Account έχει δύο θυγατρικές κλάσεις. Η λειτουργία κατάθεσης και ανάληψης είναι η ίδια για τους λογαριασμούς ταμιευτηρίου και τους λογαριασμούς όψεως, επομένως οι κληρονομημένες μέθοδοι από την κλάση Account θα λειτουργήσουν.

Ενιαία κληρονομιά σε Java

Java Παράδειγμα πολυμορφισμού

Αλλαγή στις απαιτήσεις λογισμικού

Υπάρχει μια αλλαγή στις προδιαγραφές των απαιτήσεων, κάτι που είναι συνηθισμένο στον κλάδο του λογισμικού. Πρέπει να προστεθεί λειτουργικότητα για έναν προνομιακό Τραπεζικό Λογαριασμό με Δυνατότητα Υπερανάληψης. Η υπερανάληψη είναι μια δυνατότητα όπου ένας πελάτης μπορεί να κάνει ανάληψη ενός ποσού μεγαλύτερου από το διαθέσιμο υπόλοιπο στον λογαριασμό. Η μέθοδος ανάληψης για τον προνομιακό λογαριασμό χρειάζεται μια νέα εφαρμογή, ενώ ο δοκιμασμένος κώδικας σε λογαριασμούς Ταμιευτηρίου και Τρεχούμενου Λογαριασμού παραμένει ανέπαφος. Αυτή η απομόνωση είναι το πλεονέκτημα του OOPS.

Java Πολυμορφισμός

Βήμα 1) Όταν καλείται η μέθοδος ανάληψης για τον λογαριασμό ταμιευτηρίου, εκτελείται η μέθοδος που ορίζεται στην γονική κλάση Λογαριασμός.

Java Πολυμορφισμός

Βήμα 2) Όταν καλείται η μέθοδος ανάληψης για τον προνομιακό λογαριασμό (διευκόλυνση υπερανάληψης), εκτελείται η μέθοδος ανάληψης που ορίζεται στην προνομιακή κλάση. Αυτή η αποστολή είναι Πολυμορφισμός σε OOPs.

Java Πολυμορφισμός

Παράκαμψη μεθόδου Java

Η παράκαμψη μεθόδου είναι η διαδικασία επαναπροσδιορισμού μιας μεθόδου υπερκλάσης μέσα σε μια υποκλάση. Η υποκλάση διατηρεί την ίδια διατύπωση.tract, αλλά παρέχει μια νέα υλοποίηση που επιλέγεται κατά την εκτέλεση του προγράμματος.

Κανόνες για παράκαμψη μεθόδου

  • Η υπογραφή της μεθόδου, δηλαδή το όνομα της μεθόδου, η λίστα παραμέτρων και ο τύπος επιστροφής, πρέπει να ταιριάζουν ακριβώς.
  • Η μέθοδος που έχει παρακαμφθεί μπορεί να διευρύνει την προσβασιμότητα, αλλά δεν μπορεί να την περιορίσει. Εάν η μέθοδος είναι ιδιωτική στη βασική κλάση, η θυγατρική κλάση μπορεί να την κάνει δημόσια, αλλά όχι το αντίστροφο.

Κανόνες για την παράκαμψη μεθόδου Java

Παράδειγμα

class Doctor{
  public void treatPatient(){
  // treatPatient method
  
}
class Surgeon extends Doctor{
  public void treatPatient(){
  // treatPatient method
  }
}
class Run{
  public static void main (String args[]){
    Doctor doctorObj = new Doctor();
    // treatPatient method in class Doctor will be executed
    doctorObj.treatPatient();
   
    Surgeon surgeonObj = new Surgeon();
    // treatPatient method in class Surgeon will be executed
    surgeonObj.treatPatient();
  }
}

Διαφορά μεταξύ υπερφόρτωσης μεθόδου και παράκαμψης μεθόδου

Η υπερφόρτωση μεθόδου συμβαίνει μέσα στην ίδια κλάση με το ίδιο όνομα μεθόδου αλλά διαφορετικές υπογραφές. Η παράκαμψη μεθόδου συμβαίνει σε μια σχέση κλάσης γονέα-παιδιού, όπου η υποκλάση επαναπροσδιορίζει μια μέθοδο που δηλώνεται στην υπερκλάση.

Μέθοδος υπερφόρτωσης
Παράκαμψη μεθόδου
Η Υπερφόρτωση Μεθόδου ανήκει στην ίδια κλάση, όπου περισσότερες από μία μέθοδοι έχουν το ίδιο όνομα αλλά διαφορετικές υπογραφές. Η παράκαμψη μεθόδου είναι όταν μία από τις μεθόδους της υπερκλάσης επαναπροσδιορίζεται στην υποκλάση. Σε αυτήν την περίπτωση, η υπογραφή της μεθόδου παραμένει η ίδια.
ex:

void sum (int a , int b);
void sum (int a , int b, int c);
void sum (float a, double b);
ex:

class X{
  public int sum(){
     // some code
  }
}
class Y extends X{
  public int sum(){
    //overridden method
    //signature is same
 }
}

Τι είναι ο Δυναμικός Πολυμορφισμός;

Ο Δυναμικός Πολυμορφισμός στα OOP είναι ο μηχανισμός με τον οποίο μπορούν να οριστούν πολλαπλές μέθοδοι με το ίδιο όνομα και υπογραφή στην υπερκλάση και την υποκλάση. Η κλήση σε μια μέθοδο που έχει παρακαμφθεί επιλύεται κατά τον χρόνο εκτέλεσης μέσω Δυναμικής σύνδεσης μέσα στην JVM.

Παράδειγμα Δυναμικού Πολυμορφισμού

Μια μεταβλητή αναφοράς της υπερκλάσης μπορεί να αναφέρεται σε ένα αντικείμενο υποκλάσης:

 Doctor obj = new Surgeon();

Σκεφτείτε τη δήλωση:

obj.treatPatient();

Εδώ η μεταβλητή αναφοράς obj είναι της γονικής κλάσης, αλλά το αντικείμενο στο οποίο δείχνει είναι της θυγατρικής κλάσης, όπως φαίνεται στο διάγραμμα του Πολυμορφισμού.

Η κλήση obj.treatPatient() θα εκτελέσει τη μέθοδο treatPatient() της υποκλάσης Surgeon. Όταν χρησιμοποιείται μια αναφορά βασικής κλάσης για την κλήση μιας μεθόδου, η μέθοδος που καλείται αποφασίζεται από την JVM με βάση το πραγματικό αντικείμενο στο οποίο δείχνει η αναφορά. Παρόλο που obj είναι μια αναφορά στο Doctor, καλεί τη μέθοδο Surgeon, επειδή δείχνει σε ένα αντικείμενο Surgeon. Η απόφαση λαμβάνεται κατά τη διάρκεια του χρόνου εκτέλεσης, γι' αυτό και ονομάζεται Δυναμικός πολυμορφισμός ή πολυμορφισμός χρόνου εκτέλεσης.

Διαφορά μεταξύ στατικού και δυναμικού πολυμορφισμού

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

Στατικός πολυμορφισμός
Δυναμικός πολυμορφισμός
Σχετίζεται με την υπερφόρτωση μεθόδου. Σχετίζεται με την Παράκαμψη Μεθόδου.
Τα σφάλματα, εάν υπάρχουν, επιλύονται κατά τη μεταγλώττιση. Δεδομένου ότι ο κώδικας δεν εκτελείται κατά τη μεταγλώττιση, το όνομα είναι στατικό.

ex:

void sum (int a , int b);
void sum (float a, double b);
int sum (int a, int b); //compiler gives error.
Όταν μια μεταβλητή αναφοράς καλεί μια μέθοδο που έχει παρακαμφθεί, η μέθοδος που θα κληθεί καθορίζεται από το αντικείμενο στο οποίο δείχνει η μεταβλητή αναφοράς. Αυτό μπορεί να προσδιοριστεί μόνο κατά τον χρόνο εκτέλεσης, όταν ο κώδικας βρίσκεται υπό εκτέλεση, γι' αυτό και το όνομα είναι δυναμικό.

ex:

//reference of parent pointing to child object
 Doctor obj = new Surgeon();
// method of child called
obj.treatPatient();

Super Λέξη-κλειδί σε Java

Τι γίνεται αν η μέθοδος treatPatient στην κλάση Surgeon θέλει να εκτελέσει τη λειτουργικότητα που ορίζεται στην κλάση Doctor και στη συνέχεια να εκτελέσει τη δική της συγκεκριμένη συμπεριφορά; Σε αυτήν την περίπτωση, η λέξη-κλειδί super μπορεί να χρησιμοποιηθεί για πρόσβαση σε μεθόδους της γονικής κλάσης από τη θυγατρική κλάση. Η μέθοδος treatPatient στην κατηγορία Surgeon θα μπορούσε να γραφτεί ως εξής:

treatPatient(){
   super.treatPatient();
     //add code specific to Surgeon
}

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

Παράδειγμα: Για να μάθετε την Κληρονομικότητα, τον Πολυμορφισμό και τη λέξη-κλειδί super

Βήμα 1) Αντιγράψτε τον παρακάτω κώδικα σε ένα πρόγραμμα επεξεργασίας.

public class Test{
     public static void main(String args[]){
        X x= new X();
        Y y = new Y();
        y.m2();
        //x.m1();
        //y.m1();
        //x = y;// parent pointing to object of child
        //x.m1() ;
        //y.a=10;
   }
}
class X{
   private int a;
   int b;
      public void m1(){
       System.out.println("This is method m1 of class X");
     }
}
class Y extends X{
      int c; // new instance variable of class Y
         public void m1(){
            // overridden method
            System.out.println("This is method m1 of class Y");
        }
       public void m2(){
           super.m1();
           System.out.println("This is method m2 of class Y");
      }
}

Βήμα 2) Αποθηκεύστε, μεταγλωττίστε και εκτελέστε τον κώδικα. Παρατηρήστε το αποτέλεσμα.

Βήμα 3) Αποσχολιάστε τις γραμμές 6 έως 9. Αποθηκεύστε, μεταγλωττίστε και εκτελέστε τον κώδικα. Παρατηρήστε το αποτέλεσμα.

Βήμα 4) Αποσχολιάστε τη γραμμή 10. Αποθηκεύστε και μεταγλωττίστε τον κώδικα.

Βήμα 5) Σφάλμα = ? Αυτό συμβαίνει επειδή η υποκλάση δεν έχει πρόσβαση σε ιδιωτικά μέλη της υπερκλάσης.

Συχνές Ερωτήσεις

Πολυμορφισμός σε Java είναι η ικανότητα ενός αντικειμένου να λαμβάνει πολλές μορφές. Το ίδιο όνομα μεθόδου μπορεί να εκτελέσει διαφορετικό κώδικα ανάλογα με το αντικείμενο υποκλάσης που αναφέρεται κατά τον χρόνο εκτέλεσης, η οποία είναι η βασική συμπεριφορά OOP.

Java Υποστηρίζει πολυμορφισμό κατά τη μεταγλώττιση μέσω της υπερφόρτωσης μεθόδων και πολυμορφισμό κατά την εκτέλεση μέσω της υπερφόρτωσης μεθόδων. Η υπερφόρτωση επιλύεται κατά τη μεταγλώττιση μέσω στατικής σύνδεσης, ενώ η υπερφόρτωση επιλύεται κατά την εκτέλεση μέσω δυναμικής σύνδεσης που χειρίζεται η JVM.

Η στατική σύνδεση συνδέει μια κλήση μεθόδου με τον ορισμό της κατά τον χρόνο μεταγλώττισης και χρησιμοποιείται για την Υπερφόρτωση Μεθόδου. Η δυναμική σύνδεση συνδέει την κλήση κατά τον χρόνο εκτέλεσης με βάση τον πραγματικό τύπο αντικειμένου και ενεργοποιεί την Υπέρβαση Μεθόδου σε Java.

Η λέξη-κλειδί super επιτρέπει σε μια υποκλάση να καλέσει την μέθοδο που έχει παρακαμφθεί ή να έχει πρόσβαση σε ένα μέλος δεδομένων από τη γονική της κλάση. Αυτό επιτρέπει στο θυγατρικό να επαναχρησιμοποιήσει τη γονική λογική και στη συνέχεια να προσθέσει εξειδικευμένη συμπεριφορά πάνω σε αυτήν.

Οι καθηγητές Τεχνητής Νοημοσύνης, όπως το ChatGPT και το GitHub Copilot Chat, μπορούν να εξηγήσουν τον Πολυμορφισμό στο Java με προσαρμοσμένες αναλογίες, δημιουργήστε προβλήματα εξάσκησης, περιηγηθείτε σε δέντρα κληρονομικότητας και υποβάλετε κουίζ στους μαθητές σχετικά με τη στατική έναντι της δυναμικής σύνδεσης για ταχύτερη εξάσκηση.

Ναι. Οι βοηθοί αναδιαμόρφωσης που βασίζονται στην τεχνητή νοημοσύνη, όπως το Cursor, το Sourcegraph Cody και το IntelliJ AI Assistant, μπορούν να εντοπίσουν διπλότυπες υποθετικές εκφράσεις, να προτείνουν ιεραρχίες κλάσεων και να ξαναγράψουν παλαιές εκδόσεις. Java κώδικα έτσι ώστε η Method Overriding να αντικαθιστά τις επαναλαμβανόμενες αλυσίδες if-else.

Συνοψίστε αυτήν την ανάρτηση με: