Πολυμορφισμός σε Java (Στατικό και Δυναμικό)
Σε τι είναι ο Πολυμορφισμός Java?
Πολυμορφισμός in Java εμφανίζεται όταν υπάρχουν μία ή περισσότερες κλάσεις ή αντικείμενα που σχετίζονται μεταξύ τους με κληρονομικότητα. Είναι η ικανότητα ενός αντικειμένου να παίρνει πολλές μορφές. Η κληρονομικότητα επιτρέπει στους χρήστες να κληρονομούν χαρακτηριστικά και μεθόδους και ο πολυμορφισμός χρησιμοποιεί αυτές τις μεθόδους για να εκτελέσει διαφορετικές εργασίες. Άρα, ο στόχος είναι η επικοινωνία, αλλά η προσέγγιση είναι διαφορετική.
Για παράδειγμα, έχετε ένα smartphone για επικοινωνία. Ο τρόπος επικοινωνίας που θα επιλέξετε μπορεί να είναι οτιδήποτε. Μπορεί να είναι μια κλήση, ένα μήνυμα κειμένου, ένα εικονομήνυμα, ένα mail κ.λπ. Ο στόχος λοιπόν είναι κοινός που είναι η επικοινωνία, αλλά η προσέγγισή τους είναι διαφορετική. Αυτό λέγεται Πολυμορφισμός. Τώρα, θα μάθουμε τον Πολυμορφισμό στο Java με παράδειγμα.
Πατήστε εδώ εάν το βίντεο δεν είναι προσβάσιμο
Java Πολυμορφισμός σε OOPs με Παράδειγμα
Έχουμε μια γονική κατηγορία, «Λογαριασμός» με λειτουργία κατάθεσης και ανάληψης. Ο λογαριασμός έχει 2 παιδικές τάξεις. Η λειτουργία κατάθεσης και ανάληψης είναι ίδια για λογαριασμούς Αποταμίευσης και Έλεγχου. Έτσι, οι κληρονομημένες μέθοδοι από την κλάση λογαριασμού θα λειτουργήσουν.

Αλλαγή στις απαιτήσεις λογισμικού
Υπάρχει μια αλλαγή στις προδιαγραφές των απαιτήσεων, κάτι που είναι τόσο συνηθισμένο στη βιομηχανία λογισμικού. Υποτίθεται ότι θα προσθέσετε προνομιακό τραπεζικό λογαριασμό λειτουργικότητας με Διευκόλυνση Υπερανάληψης. Για ένα υπόβαθρο, η υπερανάληψη είναι μια διευκόλυνση όπου μπορείτε να κάνετε ανάληψη ποσό μεγαλύτερο από το διαθέσιμο υπόλοιπο στον λογαριασμό σας. Έτσι, η μέθοδος απόσυρσης για προνομιούχες ανάγκες να εφαρμοστεί εκ νέου. Αλλά δεν αλλάζετε το δοκιμασμένο κομμάτι κώδικα στον λογαριασμό Ταμιευτηρίου και Έλεγχου. Αυτό είναι πλεονέκτημα OOPS
Βήμα 1) Έτσι ώστε όταν καλείται η μέθοδος "απόσυρσης" για αποθήκευση λογαριασμού, εκτελείται μέθοδος από την κλάση γονικού λογαριασμού
Βήμα 2) Αλλά όταν η μέθοδος "Ανάληψη" για τον προνομιακό λογαριασμό (διευκόλυνση υπερανάληψης) ονομάζεται μέθοδος ανάληψης που ορίζεται στην προνομιακή κλάση, εκτελείται. Αυτό είναι Πολυμορφισμός σε OOPs.
Παράκαμψη μεθόδου Java
Η παράκαμψη μεθόδου είναι ο επαναπροσδιορισμός μιας μεθόδου super class σε μια υποκλάση.
Κανόνες για παράκαμψη μεθόδου
- Η υπογραφή της μεθόδου, δηλαδή το όνομα της μεθόδου, η λίστα παραμέτρων και ο τύπος επιστροφής πρέπει να ταιριάζουν ακριβώς.
- Η μέθοδος παράκαμψης μπορεί να διευρύνει την προσβασιμότητα αλλά όχι να την περιορίσει, δηλαδή εάν είναι ιδιωτική στη βασική κλάση, η θυγατρική κλάση μπορεί να την κάνει δημόσια αλλά όχι το αντίστροφο.
Παράδειγμα
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 είναι ο μηχανισμός με τον οποίο μπορούν να οριστούν πολλαπλές μέθοδοι με το ίδιο όνομα και υπογραφή στην υπερκλάση και την υποκλάση. Η κλήση σε μια μέθοδο που έχει παρακαμφθεί επιλύεται κατά το χρόνο εκτέλεσης.
Παράδειγμα δυναμικού πολυμορφισμού:
Μια μεταβλητή αναφοράς της super class μπορεί να αναφέρεται σε ένα αντικείμενο υποκλάσης
Doctor obj = new Surgeon();
Σκεφτείτε τη δήλωση
obj.treatPatient();
Εδώ η μεταβλητή αναφοράς "obj" είναι της γονικής κλάσης, αλλά το αντικείμενο στο οποίο δείχνει είναι της θυγατρικής κλάσης (όπως φαίνεται στο παρακάτω παράδειγμα διαγράμματος του Polymorphism).
Η obj.treatPatient() θα εκτελέσει τη μέθοδο treatPatient() της υποκατηγορίας – Surgeon
Εάν χρησιμοποιείται μια αναφορά κλάσης βάσης για την κλήση μιας μεθόδου, η μέθοδος που θα κληθεί αποφασίζεται από το JVM, ανάλογα με το αντικείμενο στο οποίο δείχνει η αναφορά
Για παράδειγμα, παρόλο που το obj είναι μια αναφορά στο Doctor, ονομάζει τη μέθοδο του Surgeon, καθώς δείχνει ένα αντικείμενο χειρουργού
Αυτό αποφασίζεται κατά τη διάρκεια του χρόνου εκτέλεσης και ως εκ τούτου ορίζεται δυναμικός or πολυμορφισμός χρόνου εκτέλεσης
Διαφορά Στατικού & Δυναμικού Πολυμορφισμού
Στατικός πολυμορφισμός σε Java είναι ένας τύπος πολυμορφισμού που συλλέγει τις πληροφορίες για την κλήση μιας μεθόδου κατά το χρόνο μεταγλώττισης, ενώ ο Δυναμικός Πολυμορφισμός είναι ένας τύπος πολυμορφισμού που συλλέγει τις πληροφορίες για την κλήση μιας μεθόδου κατά το χρόνο εκτέλεσης.
| Σχετίζεται με υπερφόρτωση μεθόδου. | Σχετίζεται με την παράκαμψη μεθόδου. |
| Τα σφάλματα, εάν υπάρχουν, επιλύονται κατά τη στιγμή της μεταγλώττισης. Εφόσον ο κώδικας δεν εκτελείται κατά τη μεταγλώττιση, εξ ου και το όνομα static.
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 με παραδείγματα προγραμμάτων.
Παράδειγμα:-Για να μάθετε Κληρονομικότητα, Πολυμορφισμό και σούπερ λέξη-κλειδί
Βήμα 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(){
// overriden 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) Σφάλμα = ? Αυτό συμβαίνει επειδή η υποκλάση δεν μπορεί να έχει πρόσβαση σε ιδιωτικά μέλη της super class.
Περίληψη
- Ο πολυμορφισμός στον αντικειμενοστραφή προγραμματισμό εμφανίζεται όταν υπάρχουν μία ή περισσότερες κλάσεις ή αντικείμενα που σχετίζονται μεταξύ τους με κληρονομικότητα. Είναι η ικανότητα ενός αντικειμένου να παίρνει πολλές μορφές.
- Η παράκαμψη μεθόδου είναι ο επαναπροσδιορισμός μιας μεθόδου super class σε μια υποκλάση.
- Δυναμικός πολυμορφισμός σε Java είναι ο μηχανισμός με τον οποίο μπορούν να οριστούν πολλαπλές μέθοδοι με το ίδιο όνομα και υπογραφή στην υπερκλάση και την υποκλάση.
- Στατικός πολυμορφισμός σε Java είναι ένας τύπος πολυμορφισμού που συλλέγει τις πληροφορίες για την κλήση μιας μεθόδου κατά το χρόνο μεταγλώττισης, ενώ ο Δυναμικός Πολυμορφισμός είναι ένας τύπος πολυμορφισμού που συλλέγει τις πληροφορίες για την κλήση μιας μεθόδου κατά το χρόνο εκτέλεσης.
- Η λέξη-κλειδί Super μπορεί να χρησιμοποιηθεί για πρόσβαση σε μεθόδους της γονικής κλάσης από τη θυγατρική τάξη.




