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:49]
gthanos
java:polymorphism [2017/02/16 14:20] (current)
gthanos
Line 1: Line 1:
 ====== ​ Στατικός και Δυναμικός Πολυμορφισμός ====== ====== ​ Στατικός και Δυναμικός Πολυμορφισμός ======
  
-Σε [[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 | πηγή]])+Σε [[java:​class_methods#​Υπερφόρτωση (overloading) των μεθόδων μίας κλάσης | προηγούμενη ενότητα]] είδαμε την δυνατότητα ορισμού σε μία κλάση μεθόδων με το ίδιο όνομα αλλά με διαφορετικό αριθμό ή/και τύπους δεδομένων. Η δυνατότητα αυτή που μας δίνει η Java και ο Αντικειμενοστραφής Προγραμματισμός γενικότερα,​ ονομάζεται ​//method overloading// ​και οφείλεται στο γεγονός ότι μία μέθοδος δεν ορίζεται ​μόνο από το όνομα της αλλά και από το σύνολο των τυπικών ​παραμέτρων της. Τυπικές παράμετροι και όνομα αποτελούν την ​//υπογραφή// (signatureτης κάθε μεθόδου.
  
-<code java>+Ένα παράδειγμα //method overloading//​ δίνεται παρακάτω:​ /* ([[http://​stackoverflow.com/​questions/​20783266/​what-is-the-difference-between-dynamic-and-static-polymorphism-in-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>​ 
 + 
 +===== Δυναμικός Πολυμορφισμός =====
  
 Ας υποθέσουμε δύο κλάσεις που η μία κληρονομεί από την άλλη και οι δύο έχουν δύο διακριτές μεθόδους με το ίδιο όνομα και τυπικές παραμέτρους,​ δηλαδή το ίδιο signature. Σε αυτή την περίπτωση λέμε ότι η μέθοδος της υποκλάσης,​ επανα-ορίζει (//​overrides//​) την μέθοδο της γονικής της κλάσης. Ένα παράδειγμα είναι το παρακάτω. Ας υποθέσουμε δύο κλάσεις που η μία κληρονομεί από την άλλη και οι δύο έχουν δύο διακριτές μεθόδους με το ίδιο όνομα και τυπικές παραμέτρους,​ δηλαδή το ίδιο signature. Σε αυτή την περίπτωση λέμε ότι η μέθοδος της υποκλάσης,​ επανα-ορίζει (//​overrides//​) την μέθοδο της γονικής της κλάσης. Ένα παράδειγμα είναι το παρακάτω.
  
-<code java>+<​code ​java Animal.java>
 class Animal {    ​ class Animal {    ​
    ​public void signature(){    ​public void signature(){
Line 27: Line 37:
    }    }
 } }
 +</​code>​
  
 +<code java Dog.java>​
 class Dog extends Animal { class Dog extends Animal {
  
Line 34: Line 46:
    }    }
 } }
 +</​code>​
  
 +<code java TestDog.java>​
 public class TestDog { public class TestDog {
  
Line 48: Line 62:
 </​code>​ </​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.1423838982.txt.gz · Last modified: 2016/02/26 11:15 (external edit)