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:55]
gthanos
java:polymorphism [2017/02/16 14:20] (current)
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 52: Line 62:
 </​code>​ </​code>​
  
-Παρατηρούμε ότι η κλήση της μεθόδου ''​signature''​ από δύο μεταλητές τύπου ''​Animal''​ που η πρώτη (''​a''​) δείχνει σε αντικείμενο της γονικής κλάσης και η δεύτερη (''​b''​) σε αντικείμενο της υποκλάσης έχει ως αποτέλεσμα την κλήση διαφορετικών μεθόδων. Η απόφαση για το ποια μέθοδος θα κληθεί επαφίεται στο JVM και ορίζεται ​σαφώς στο πρότυπο της Java. Η παραπάνω διάκριση ​είναι γνωστή και ως δυναμικός πολυμορφισμός (//dynamic polymorphism//​).+Παρατηρούμε ότι η κλήση της μεθόδου ''​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.1423839321.txt.gz · Last modified: 2016/02/26 11:15 (external edit)