User Tools

Site Tools


java:polymorphism

Differences

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

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
java:polymorphism [2016/02/15 09:04] – [Στατικός Πολυμορφισμός] gthanosjava:polymorphism [2020/03/27 13:18] (current) – [Δυναμικός Πολυμορφισμός] gthanos
Line 1: Line 1:
 ======  Στατικός και Δυναμικός Πολυμορφισμός ====== ======  Στατικός και Δυναμικός Πολυμορφισμός ======
  
-===== Στατικός Πολυμορφισμός =====+===== Στατικός Πολυμορφισμός (a.k.a. Υπερφόρτωση Μεθόδων) =====
  
-Σε [[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 | πηγή]])*/
Line 18: Line 18:
     obj.sum(20,20);     obj.sum(20,20);
     obj.sum(12.2, 11.3);         obj.sum(12.2, 11.3);    
-  }  +  } 
 +}
 </code> </code>
  
-Η παραπάνω διαδικασία αναφέρεται συχνά και ως στατικός πολυμορφισμός (//static polymorphism//) σε αντιδιαστολή με τον δυναμικό πολυμορφισμό που θα δούμε στη συνέχεια.+Η παραπάνω δυνατότητα αναφέρεται συχνά και ως στατικός πολυμορφισμός (//static polymorphism//) σε αντιδιαστολή με τον δυναμικό πολυμορφισμό που θα δούμε στη συνέχεια.
  
 <WRAP important 80% center round> <WRAP important 80% center round>
Line 29: Line 30:
 ===== Δυναμικός Πολυμορφισμός ===== ===== Δυναμικός Πολυμορφισμός =====
  
-Ας υποθέσουμε δύο κλάσεις που η μία κληρονομεί από την άλλη και οι δύο έχουν δύο διακριτές μεθόδους με το ίδιο όνομα και τυπικές παραμέτρους, δηλαδή το ίδιο signature. Σε αυτή την περίπτωση λέμε ότι η μέθοδος της υποκλάσης, επανα-ορίζει (//overrides//) την μέθοδο της γονικής της κλάσης. Ένα παράδειγμα είναι το παρακάτω.+Ας υποθέσουμε δύο κλάσεις που η μία κληρονομεί από την άλλη και οι δύο έχουν δύο διακριτές μεθόδους με το ίδιο όνομα και τις ίδιες τυπικές παραμέτρους, δηλαδή το ίδιο //signature//. Σε αυτή την περίπτωση λέμε ότι η μέθοδος της υποκλάσης, επανα-ορίζει (//overrides//) την μέθοδο της γονικής της κλάσης. Ένα παράδειγμα είναι το παρακάτω.
  
-<code java Animal.java> +<code java Polymorphism.java> 
-class Animal {     +class Animal { 
-   public void signature(){ +  
-      System.out.println("I am an animal."); +  public void signature(){ 
-   }+    System.out.println("I am an animal."); 
 +  }
 } }
-</code> 
  
-<code java Dog.java> +class Mammal extends Animal { 
-class Dog extends Animal {+  int numberOfBabies; 
 +   
 +  public Mammal(int babies) { 
 +    numberOfBabies = babies; 
 +  } 
 +   
 +  public int getBabies() { 
 +    return numberOfBabies; 
 +  } 
 +   
 +  public void signature() { 
 +    System.out.println("I am a mammal! I birth "+numberOfBabies+" babies."); 
 +  } 
 +}
  
-   public void signature() { +class Dog extends Mammal { 
-      System.out.println("I am a Dog!"); +  private String name; 
-   }+   
 +  public Dog(int babies, String name) { 
 +    super(babies); 
 +    this.name = name; 
 +  } 
 +   
 +  public String getName() { 
 +    return name; 
 +  } 
 +   
 +  public void signature() { 
 +    System.out.println("I am a dogMy name is "+name+"."); 
 +  }
 } }
-</code> 
  
-<code java TestDog.java> +public class Polymorphism {
-public class TestDog {+
  
-   public static void main(String args[]) { +  public static void main(String args[]) { 
-      Animal = new Animal(); // Animal reference and object +    Animal animal = new Animal(); // Animal reference and object 
-      Animal = new Dog(); // Animal reference but Dog object+    Animal mammal = new Mammal(3);  // Animal reference but Mammal object 
 +    Animal dog = new Dog(4, "Azor");    // Animal reference but Dog object
  
-      a.signature(); //output: I am an animal. +    animal.signature(); //output: I am an animal. 
- +    mammal.signature(); //output: I am a mammal! 
-      b.signature(); //output: I am a Dog+    dog.signature(); //output: I am a dog
-   }+     
 +    //mammal.getBabies(); 
 +    //dog.getName(); 
 +  }
 } }
 </code> </code>
  
-Παρατηρούμε ότι η κλήση της μεθόδου ''signature'' από δύο μεταλητές τύπου ''Animal'' που η πρώτη (''a'') δείχνει σε αντικείμενο της γονικής κλάσης (''Animal'') και η δεύτερη (''b'') σε αντικείμενο της υποκλάσης (''Dog'') έχει ως αποτέλεσμα την κλήση διαφορετικών μεθόδων. Η απόφαση για το ποια μέθοδος θα κληθεί επαφίεται στο JVM κατά την εκτέλεση του προγράμματος. Το JVM αντιλαμβάνεται το είδος του αντικειμένου στο οποίο δείχνει η μεταβλητή ''b'', ανεξάρτητα εάν η reference μεταβλητή είναι του τύπου της γονικής κλάσης ή της υποκλάσης αυτής. Η παραπάνω διάκριση είναι γνωστή και ως δυναμικός πολυμορφισμός (//dynamic polymorphism//).+Παρατηρούμε ότι η κλήση της μεθόδου ''signature'' από τρεις μεταβλητές τύπου ''Animal'' που η πρώτη (''a'') δείχνει σε αντικείμενο της γονικής κλάσης (''Animal''), η δεύτερη (''b'') σε αντικείμενο της υποκλάσης (''Mammal'') και η τρίτη η δεύτερη (''b'') σε αντικείμενο της υποκλάσης (''Dog'') έχει ως αποτέλεσμα την κλήση διαφορετικών μεθόδων. Η απόφαση για το ποια μέθοδος θα κληθεί σε κάθε μία από τις τρεις περιπτώσεις δεν μπορεί να αποφασιστεί κατά την μεταγλώττιση του προγράμματος. Το JVM καλείται να αποφασίσει, με βάση τον τύπο του αντικειμένου στο οποίο δείχνει κάθε μεταβλητή κατά την εκτέλεση. 
 + 
 +Στο παραπάνω παράδειγμα, το JVM γνωρίζει το είδος του αντικειμένου στο οποίο δείχνουν οι μεταβλητές ''a'', ''b'' και ''c'' ανεξάρτητα εάν η reference μεταβλητή είναι του τύπου της γονικής κλάσης ή της υποκλάσης. Η παραπάνω διάκριση είναι γνωστή ως δυναμικός πολυμορφισμός (//dynamic polymorphism//), διότι το ποια μέθοδος θα κληθεί αποφασίζεται κατά την εκτέλεση και όχι κατά την μεταγλώττιση.
  
-|Προηγούμενο: [[ :java:super_operator | Ο τελεστής super ]] | Επόμενο: [[ :java:hiding_static_methods | Καλώντας στατικές μεθόδους από την γονική κλάση και την υποκλάση ]]|+|Προηγούμενο: [[ :java:super_operator | Ο τελεστής super ]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[ :java:abstract_classes Abstract Κλάσεις ]]|
java/polymorphism.1455527090.txt.gz · Last modified: 2016/02/15 09:04 by gthanos