java:polymorphism

This is an old revision of the document!


A PCRE internal error occured. This might be caused by a faulty plugin

====== Στατικός και Δυναμικός Πολυμορφισμός ====== ===== Στατικός Πολυμορφισμός ===== Σε [[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:hiding_static_methods | Καλώντας στατικές μεθόδους από την γονική κλάση και την υποκλάση ]]|

java/polymorphism.1459413857.txt.gz · Last modified: 2016/03/31 08:44 by doufexi