java:polymorphism

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
java:polymorphism [2015/02/13 14:39]
gthanos
java:polymorphism [2017/02/16 14:20] (current)
gthanos
Line 1: Line 1:
 ====== ​ Στατικός και Δυναμικός Πολυμορφισμός ====== ====== ​ Στατικός και Δυναμικός Πολυμορφισμός ======
  
-Σε [[java:​class_methods#​Υπερφόρτωση (overloading) των μεθόδων μίας κλάσης | προηγούμενη ενότητα]] αναφέραμε την δυνατότητα ορισμού μεθόδων με το ίδιο όνομα αλλά ​+===== Στατικός Πολυμορφισμός ===== 
 + 
 +Σε [[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 | πηγή]])*/​ 
 + 
 +<code java Calculation.java>​ 
 +class Calculation {   
 +  void sum(int a,int b){ System.out.println(a+b);​ } 
 +  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[]) {   
 +    Calculation obj=new Calculation(); ​  
 +    obj.sum(10,​10,​10); ​  
 +    obj.sum(20,​20);​ 
 +    obj.sum(12.2,​ 11.3); ​    
 +  }   
 +</​code>​ 
 + 
 +Η παραπάνω διαδικασία αναφέρεται συχνά και ως στατικός πολυμορφισμός (//static polymorphism//​) σε αντιδιαστολή με τον δυναμικό πολυμορφισμό που θα δούμε στη συνέχεια. 
 + 
 +<WRAP important 80% center round> 
 +Όπως προαναφέραμε,​ ο στατικός πολυμορφισμός βασίζεται στον διαφορετικό αριθμό,​ τον τύπο και τη σειρά ορισμάτων. Το συγκεκριμένο είδος πολυμορφισμού ονομάζεται στατικό διότι η μέθοδος που θα κληθεί αποφασίζεται από τον compiler κατά την μεταγλώττιση του προγράμματος. 
 +</​WRAP>​ 
 + 
 +===== Δυναμικός Πολυμορφισμός ===== 
 + 
 +Ας υποθέσουμε ​δύο κλάσεις που η μία κληρονομεί από την άλλη και οι δύο έχουν δύο διακριτές μεθόδους με το ίδιο όνομα και τυπικές παραμέτρους,​ δηλαδή το ίδιο signature. Σε αυτή την περίπτωση λέμε ότι η μέθοδος της υποκλάσης,​ επανα-ορίζει (//​overrides//​) την μέθοδο της γονικής της κλάσης. Ένα παράδειγμα είναι ​το παρακάτω. 
 + 
 +<code java Animal.java>​ 
 +class Animal {     
 +   ​public void signature(){ 
 +      System.out.println("​I am an animal."​);​ 
 +   } 
 +
 +</​code>​ 
 + 
 +<code java Dog.java>​ 
 +class Dog extends Animal { 
 + 
 +   ​public void signature() { 
 +      System.out.println("​I am a Dog!"​);​ 
 +   } 
 +
 +</​code>​ 
 + 
 +<code java 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! 
 +   } 
 +
 +</​code>​ 
 + 
 +Παρατηρούμε ότι η κλήση της μεθόδου ''​signature''​ από δύο μεταλητές τύπου ''​Animal''​ που η πρώτη (''​a''​) δείχνει σε αντικείμενο της γονικής κλάσης (''​Animal''​) και η δεύτερη (''​b''​) σε αντικείμενο της υποκλάσης (''​Dog''​) έχει ως αποτέλεσμα την κλήση διαφορετικών μεθόδων. Η απόφαση για το ποια ​μέθοδος θα κληθεί δεν μπορεί να αποφασιστεί από τον compiler. Το JVM καλείται να αποφασίσει κατά την εκτέλεση του προγράμματος,​ ανάλογα με το είδος του αντικειμένου στο οποίο τελικά δείχνει κάθε μεταβλητή.  
 + 
 +Στο παραπάνω παράδειγμα,​ το JVM αντιλαμβάνεται το είδος του αντικειμένου στο οποίο δείχνουν οι μεταβλητές ''​a'',​ ''​b''​ ανεξάρτητα εάν η reference μεταβλητή είναι του τύπου της γονικής κλάσης ή της υποκλάσης. Η παραπάνω διάκριση είναι γνωστή και ως δυναμικός πολυμορφισμός (//dynamic polymorphism//​),​ καθώς το ποια μέθοδος θα κληθεί τελικά επαφίεται στο JVM και όχι στον compiler. 
 + 
 +|Προηγούμενο:​ [[ :​java:​object_class | Η κλάση Object ]] | [[ :toc | Περιεχόμενα ]]  | Επόμενο:​ [[ :​java:​dynamic_polymorphism_example | Παράδειγμα δυναμικού πολυμορφισμού ]]|
java/polymorphism.1423838345.txt.gz · Last modified: 2016/02/26 11:15 (external edit)