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/15 17:39]
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 56: Line 62:
 </​code>​ </​code>​
  
-Παρατηρούμε ότι η κλήση της μεθόδου ''​signature''​ από δύο μεταλητές τύπου ''​Animal''​ που η πρώτη (''​a''​) δείχνει σε αντικείμενο της γονικής κλάσης (''​Animal''​) και η δεύτερη (''​b''​) σε αντικείμενο της υποκλάσης (''​Dog''​) έχει ως αποτέλεσμα την κλήση διαφορετικών μεθόδων. Η απόφαση για το ποια μέθοδος θα κληθεί επαφίεται στο JVM κατά την εκτέλεση του προγράμματος. ​Το JVM αντιλαμβάνεται το είδος του αντικειμένου στο οποίο δείχνει η μεταβλητή ''​b'',​ ανεξάρτητα εάν η reference μεταβλητή είναι του τύπου της γονικής κλάσης ή της υποκλάσης αυτής. Η παραπάνω διάκριση είναι γνωστή και ως δυναμικός πολυμορφισμός (//dynamic polymorphism//​).+Παρατηρούμε ότι η κλήση της μεθόδου ''​signature''​ από δύο μεταλητές τύπου ''​Animal''​ που η πρώτη (''​a''​) δείχνει σε αντικείμενο της γονικής κλάσης (''​Animal''​) και η δεύτερη (''​b''​) σε αντικείμενο της υποκλάσης (''​Dog''​) έχει ως αποτέλεσμα την κλήση διαφορετικών μεθόδων. Η απόφαση για το ποια μέθοδος θα κληθεί ​δεν μπορεί να αποφασιστεί από ​τον compiler. Το JVM καλείται να αποφασίσει ​κατά την εκτέλεση του προγράμματος, ανάλογα με το είδος του αντικειμένου στο οποίο τελικά δείχνει κάθε μεταβλητή 
 + 
 +Στο παραπάνω παράδειγμα,​ το JVM αντιλαμβάνεται το είδος του αντικειμένου στο οποίο δείχνουν οι μεταβλητές ''​a'', ​''​b'' ​ανεξάρτητα εάν η reference μεταβλητή είναι του τύπου της γονικής κλάσης ή της υποκλάσης. Η παραπάνω διάκριση είναι γνωστή και ως δυναμικός πολυμορφισμός (//dynamic polymorphism//​), καθώς το ποια μέθοδος θα κληθεί τελικά επαφίεται στο JVM και όχι στον compiler.
  
-|Προηγούμενο:​ [[ :java:super_operator ​Ο τελεστής super ]] | Επόμενο:​ [[ :java:hiding_static_methods ​Καλώντας στατικές ​μεθόδους από την γονική κλάση και την υποκλάση ]]|+|Προηγούμενο:​ [[ :java:object_class ​Η κλάση Object ]] | [[ :toc | Περιεχόμενα ​]]  | Επόμενο:​ [[ :java:dynamic_polymorphism_example ​Παράδειγμα δυναμικού ​πολυμορφισμού ​]]|
java/polymorphism.1424021946.txt.gz · Last modified: 2016/02/26 11:15 (external edit)