This is an old revision of the document!
Table of Contents
Στατικός και Δυναμικός Πολυμορφισμός
Στατικός Πολυμορφισμός
Σε προηγούμενη ενότητα είδαμε την δυνατότητα ορισμού σε μία κλάση μεθόδων με το ίδιο όνομα αλλά με διαφορετικό αριθμό ή/και τύπους δεδομένων. Η δυνατότητα αυτή που μας δίνει η Java και ο Αντικειμενοστραφής Προγραμματισμός γενικότερα, ονομάζεται method overloading και οφείλεται στο γεγονός ότι μία μέθοδος δεν ορίζεται μόνο από το όνομα της αλλά και από το σύνολο των τυπικών παραμέτρων της. Τυπικές παράμετροι και όνομα αποτελούν το signature (υπογραφή) της κάθε μεθόδου.
Ένα παράδειγμα method overloading δίνεται παρακάτω ( πηγή)
class Calculation { void sum(int a,int b){System.out.println(a+b);} void sum(int a,int b,int c){System.out.println(a+b+c);} public static void main(String args[]) { Calculation obj=new Calculation(); obj.sum(10,10,10); obj.sum(20,20); }
Η παραπάνω διαδικασία αναφέρεται συχνά και ως στατικός πολυμορφισμός (static polymorphism) σε αντιδιαστολή με τον δυναμικό πολυμορφισμό που θα δούμε στη συνέχεια.
Δυναμικός Πολυμορφισμός
Ας υποθέσουμε δύο κλάσεις που η μία κληρονομεί από την άλλη και οι δύο έχουν δύο διακριτές μεθόδους με το ίδιο όνομα και τυπικές παραμέτρους, δηλαδή το ίδιο signature. Σε αυτή την περίπτωση λέμε ότι η μέθοδος της υποκλάσης, επανα-ορίζει (overrides) την μέθοδο της γονικής της κλάσης. Ένα παράδειγμα είναι το παρακάτω.
- Animal.java
class Animal { public void signature(){ System.out.println("I am an animal."); } }
- Dog.java
class Dog extends Animal { public void signature() { System.out.println("I am a Dog!"); } }
- TestDog.java
public class TestDog { public static void main(String args[]) { Animal a = new Animal(); // Animal reference and object Animal b = new Dog(); // Animal reference but Dog object a.signature(); //output: I am an animal. b.signature(); //output: I am a Dog! } }
Παρατηρούμε ότι η κλήση της μεθόδου signature
από δύο μεταλητές τύπου Animal
που η πρώτη (a
) δείχνει σε αντικείμενο της γονικής κλάσης (Animal
) και η δεύτερη (b
) σε αντικείμενο της υποκλάσης (Dog
) έχει ως αποτέλεσμα την κλήση διαφορετικών μεθόδων. Η απόφαση για το ποια μέθοδος θα κληθεί επαφίεται στο JVM κατά την εκτέλεση του προγράμματος. Το JVM αντιλαμβάνεται το είδος του αντικειμένου στο οποίο δείχνει η μεταβλητή b
, ανεξάρτητα εάν η reference μεταβλητή είναι του τύπου της γονικής κλάσης ή της υποκλάσης αυτής. Η παραπάνω διάκριση είναι γνωστή και ως δυναμικός πολυμορφισμός (dynamic polymorphism).
Προηγούμενο: Ο τελεστής super | Επόμενο: Καλώντας στατικές μεθόδους από την γονική κλάση και την υποκλάση |