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

Σε τι είναι ο Πολυμορφισμός Java?
Πολυμορφισμός σε Java συμβαίνει όταν μία ή περισσότερες κλάσεις ή αντικείμενα σχετίζονται μεταξύ τους μέσω κληρονομικότητας. Είναι η ικανότητα ενός αντικειμένου να λαμβάνει πολλές μορφές. Η κληρονομικότητα επιτρέπει στους χρήστες να κληρονομούν χαρακτηριστικά και μεθόδους και ο Πολυμορφισμός χρησιμοποιεί αυτές τις μεθόδους για την εκτέλεση διαφορετικών εργασιών. Ο στόχος είναι η επικοινωνία, ενώ η προσέγγιση μπορεί να διαφέρει.
Για παράδειγμα, ένα smartphone χρησιμοποιείται για επικοινωνία. Η λειτουργία επικοινωνίας μπορεί να είναι μια κλήση, ένα μήνυμα κειμένου, ένα μήνυμα εικόνας ή ένα email. Ο στόχος είναι κοινός, δηλαδή η επικοινωνία, αλλά η προσέγγιση είναι διαφορετική. Αυτή η συμπεριφορά είναι η ουσία του ΠολυμορφισμόςΤώρα θα μάθουμε τον Πολυμορφισμό στο Java με παράδειγμα κώδικα, διαγράμματα και επεξηγήσεις βήμα προς βήμα.
Πατήστε εδώ εάν το βίντεο δεν είναι προσβάσιμο
Γιατί να Χρησιμοποιήσετε Πολυμορφισμό σε Java?
Πολυμορφισμός σε Java Χρησιμοποιείται επειδή καθιστά τον κώδικα ευέλικτο, επαναχρησιμοποιήσιμο και ευκολότερο στη συντήρηση. Μια μεμονωμένη μεταβλητή αναφοράς ενός γονικού τύπου μπορεί να δείχνει σε πολλά θυγατρικά αντικείμενα, επομένως η ίδια κλήση προσαρμόζεται σε οποιαδήποτε υποκλάση παρέχεται. Αυτό το μοτίβο διατηρεί τον δοκιμασμένο κώδικα ανέπαφο, ενώ προστίθεται νέα συμπεριφορά μέσω εξειδικευμένων υποκλάσεων, γι' αυτό ακριβώς εξαρτώνται από αυτό πλαίσια όπως το Spring και το Jakarta EE.
Java Πολυμορφισμός σε OOPs με Παράδειγμα
Θεωρήστε μια γονική κλάση με το όνομα Λογαριασμός με συναρτήσεις για κατάθεση και ανάληψη. Η κλάση Account έχει δύο θυγατρικές κλάσεις. Η λειτουργία κατάθεσης και ανάληψης είναι η ίδια για τους λογαριασμούς ταμιευτηρίου και τους λογαριασμούς όψεως, επομένως οι κληρονομημένες μέθοδοι από την κλάση Account θα λειτουργήσουν.
Java Παράδειγμα πολυμορφισμού
Αλλαγή στις απαιτήσεις λογισμικού
Υπάρχει μια αλλαγή στις προδιαγραφές των απαιτήσεων, κάτι που είναι συνηθισμένο στον κλάδο του λογισμικού. Πρέπει να προστεθεί λειτουργικότητα για έναν προνομιακό Τραπεζικό Λογαριασμό με Δυνατότητα Υπερανάληψης. Η υπερανάληψη είναι μια δυνατότητα όπου ένας πελάτης μπορεί να κάνει ανάληψη ενός ποσού μεγαλύτερου από το διαθέσιμο υπόλοιπο στον λογαριασμό. Η μέθοδος ανάληψης για τον προνομιακό λογαριασμό χρειάζεται μια νέα εφαρμογή, ενώ ο δοκιμασμένος κώδικας σε λογαριασμούς Ταμιευτηρίου και Τρεχούμενου Λογαριασμού παραμένει ανέπαφος. Αυτή η απομόνωση είναι το πλεονέκτημα του OOPS.
Βήμα 1) Όταν καλείται η μέθοδος ανάληψης για τον λογαριασμό ταμιευτηρίου, εκτελείται η μέθοδος που ορίζεται στην γονική κλάση Λογαριασμός.
Βήμα 2) Όταν καλείται η μέθοδος ανάληψης για τον προνομιακό λογαριασμό (διευκόλυνση υπερανάληψης), εκτελείται η μέθοδος ανάληψης που ορίζεται στην προνομιακή κλάση. Αυτή η αποστολή είναι Πολυμορφισμός σε OOPs.
Παράκαμψη μεθόδου Java
Η παράκαμψη μεθόδου είναι η διαδικασία επαναπροσδιορισμού μιας μεθόδου υπερκλάσης μέσα σε μια υποκλάση. Η υποκλάση διατηρεί την ίδια διατύπωση.tract, αλλά παρέχει μια νέα υλοποίηση που επιλέγεται κατά την εκτέλεση του προγράμματος.
Κανόνες για παράκαμψη μεθόδου
- Η υπογραφή της μεθόδου, δηλαδή το όνομα της μεθόδου, η λίστα παραμέτρων και ο τύπος επιστροφής, πρέπει να ταιριάζουν ακριβώς.
- Η μέθοδος που έχει παρακαμφθεί μπορεί να διευρύνει την προσβασιμότητα, αλλά δεν μπορεί να την περιορίσει. Εάν η μέθοδος είναι ιδιωτική στη βασική κλάση, η θυγατρική κλάση μπορεί να την κάνει δημόσια, αλλά όχι το αντίστροφο.
Παράδειγμα
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) Σφάλμα = ? Αυτό συμβαίνει επειδή η υποκλάση δεν έχει πρόσβαση σε ιδιωτικά μέλη της υπερκλάσης.





