This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
java:polymorphism [2015/02/15 16:04] gthanos [Δυναμικός Πολυμορφισμός] |
java:polymorphism [2016/02/15 09:04] gthanos [Στατικός Πολυμορφισμός] |
||
---|---|---|---|
Line 3: | Line 3: | ||
===== Στατικός Πολυμορφισμός ===== | ===== Στατικός Πολυμορφισμός ===== | ||
- | Σε [[java:class_methods#Υπερφόρτωση (overloading) των μεθόδων μίας κλάσης | προηγούμενη ενότητα]] είδαμε την δυνατότητα ορισμού σε μία κλάση μεθόδων με το ίδιο όνομα αλλά με διαφορετικό αριθμό ή/και τύπους δεδομένων. Η δυνατότητα αυτή που μας δίνει η Java και ο Αντικειμενοστραφής Προγραμματισμός γενικότερα, ονομάζεται //method overloading// και οφείλεται στο γεγονός ότι μία μέθοδος δεν ορίζεται μόνο από το όνομα της αλλά και από το σύνολο των τυπικών παραμέτρων της. Τυπικές παράμετροι και όνομα αποτελούν το //signature// (υπογραφή) της κάθε μεθόδου. | + | Σε [[java:class_methods#Υπερφόρτωση (overloading) των μεθόδων μίας κλάσης | προηγούμενη ενότητα]] είδαμε την δυνατότητα ορισμού σε μία κλάση μεθόδων με το ίδιο όνομα αλλά με διαφορετικό αριθμό ή/και τύπους δεδομένων. Η δυνατότητα αυτή που μας δίνει η Java και ο Αντικειμενοστραφής Προγραμματισμός γενικότερα, ονομάζεται //method overloading// και οφείλεται στο γεγονός ότι μία μέθοδος δεν ορίζεται μόνο από το όνομα της αλλά και από το σύνολο των τυπικών παραμέτρων της. Τυπικές παράμετροι και όνομα αποτελούν την //υπογραφή// (signature) της κάθε μεθόδου. |
- | Ένα παράδειγμα //method overloading// δίνεται παρακάτω ([[http://stackoverflow.com/questions/20783266/what-is-the-difference-between-dynamic-and-static-polymorphism-in-java | πηγή]]) | + | Ένα παράδειγμα //method overloading// δίνεται παρακάτω: /* ([[http://stackoverflow.com/questions/20783266/what-is-the-difference-between-dynamic-and-static-polymorphism-in-java | πηγή]])*/ |
- | <code java> | + | <code java Calculation.java> |
class Calculation { | class Calculation { | ||
- | void sum(int a,int b){System.out.println(a+b);} | + | 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);} | + | void sum(double a, double 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[]) { | public static void main(String args[]) { | ||
Calculation obj=new Calculation(); | Calculation obj=new Calculation(); | ||
obj.sum(10,10,10); | obj.sum(10,10,10); | ||
- | obj.sum(20,20); | + | obj.sum(20,20); |
+ | obj.sum(12.2, 11.3); | ||
} | } | ||
</code> | </code> | ||
- | Η παραπάνω διαδικασία αναφέρεται συχνά και ως στατικός πολυμορφισμός (static polymorphism) σε αντιδιαστολή με τον δυναμικό πολυμορφισμό που θα δούμε στη συνέχεια. | + | Η παραπάνω διαδικασία αναφέρεται συχνά και ως στατικός πολυμορφισμός (//static polymorphism//) σε αντιδιαστολή με τον δυναμικό πολυμορφισμό που θα δούμε στη συνέχεια. |
+ | |||
+ | <WRAP important 80% center round> | ||
+ | Όπως προαναφέραμε, ο στατικός πολυμορφισμός βασίζεται στον διαφορετικό αριθμό, τον τύπο και τη σειρά ορισμάτων. Το συγκεκριμένο είδος πολυμορφισμού ονομάζεται στατικό διότι η μέθοδος που θα κληθεί αποφασίζεται από τον compiler κατά την μεταγλώττιση του προγράμματος. | ||
+ | </WRAP> | ||
===== Δυναμικός Πολυμορφισμός ===== | ===== Δυναμικός Πολυμορφισμός ===== | ||
Line 25: | Line 31: | ||
Ας υποθέσουμε δύο κλάσεις που η μία κληρονομεί από την άλλη και οι δύο έχουν δύο διακριτές μεθόδους με το ίδιο όνομα και τυπικές παραμέτρους, δηλαδή το ίδιο signature. Σε αυτή την περίπτωση λέμε ότι η μέθοδος της υποκλάσης, επανα-ορίζει (//overrides//) την μέθοδο της γονικής της κλάσης. Ένα παράδειγμα είναι το παρακάτω. | Ας υποθέσουμε δύο κλάσεις που η μία κληρονομεί από την άλλη και οι δύο έχουν δύο διακριτές μεθόδους με το ίδιο όνομα και τυπικές παραμέτρους, δηλαδή το ίδιο signature. Σε αυτή την περίπτωση λέμε ότι η μέθοδος της υποκλάσης, επανα-ορίζει (//overrides//) την μέθοδο της γονικής της κλάσης. Ένα παράδειγμα είναι το παρακάτω. | ||
- | <code java> | + | <code java Animal.java> |
class Animal { | class Animal { | ||
public void signature(){ | public void signature(){ | ||
Line 31: | Line 37: | ||
} | } | ||
} | } | ||
+ | </code> | ||
+ | <code java Dog.java> | ||
class Dog extends Animal { | class Dog extends Animal { | ||
Line 38: | Line 46: | ||
} | } | ||
} | } | ||
+ | </code> | ||
+ | <code java TestDog.java> | ||
public class TestDog { | public class TestDog { | ||
Line 54: | Line 64: | ||
Παρατηρούμε ότι η κλήση της μεθόδου ''signature'' από δύο μεταλητές τύπου ''Animal'' που η πρώτη (''a'') δείχνει σε αντικείμενο της γονικής κλάσης (''Animal'') και η δεύτερη (''b'') σε αντικείμενο της υποκλάσης (''Dog'') έχει ως αποτέλεσμα την κλήση διαφορετικών μεθόδων. Η απόφαση για το ποια μέθοδος θα κληθεί επαφίεται στο JVM κατά την εκτέλεση του προγράμματος. Το JVM αντιλαμβάνεται το είδος του αντικειμένου στο οποίο δείχνει η μεταβλητή ''b'', ανεξάρτητα εάν η reference μεταβλητή είναι του τύπου της γονικής κλάσης ή της υποκλάσης αυτής. Η παραπάνω διάκριση είναι γνωστή και ως δυναμικός πολυμορφισμός (//dynamic polymorphism//). | Παρατηρούμε ότι η κλήση της μεθόδου ''signature'' από δύο μεταλητές τύπου ''Animal'' που η πρώτη (''a'') δείχνει σε αντικείμενο της γονικής κλάσης (''Animal'') και η δεύτερη (''b'') σε αντικείμενο της υποκλάσης (''Dog'') έχει ως αποτέλεσμα την κλήση διαφορετικών μεθόδων. Η απόφαση για το ποια μέθοδος θα κληθεί επαφίεται στο JVM κατά την εκτέλεση του προγράμματος. Το JVM αντιλαμβάνεται το είδος του αντικειμένου στο οποίο δείχνει η μεταβλητή ''b'', ανεξάρτητα εάν η reference μεταβλητή είναι του τύπου της γονικής κλάσης ή της υποκλάσης αυτής. Η παραπάνω διάκριση είναι γνωστή και ως δυναμικός πολυμορφισμός (//dynamic polymorphism//). | ||
+ | |Προηγούμενο: [[ :java:super_operator | Ο τελεστής super ]] | Επόμενο: [[ :java:hiding_static_methods | Καλώντας στατικές μεθόδους από την γονική κλάση και την υποκλάση ]]| |