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(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); } </code> Η παραπάνω διαδικασία αναφέρεται συχνά και ως στατικός πολυμορφισμός (static polymorphism) σε αντιδιαστολή με τον δυναμικό πολυμορφισμό που θα δούμε στη συνέχεια. ===== Δυναμικός Πολυμορφισμός ===== Ας υποθέσουμε δύο κλάσεις που η μία κληρονομεί από την άλλη και οι δύο έχουν δύο διακριτές μεθόδους με το ίδιο όνομα και τυπικές παραμέτρους, δηλαδή το ίδιο 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'') έχει ως αποτέλεσμα την κλήση διαφορετικών μεθόδων. Η απόφαση για το ποια μέθοδος θα κληθεί επαφίεται στο JVM κατά την εκτέλεση του προγράμματος. Το JVM αντιλαμβάνεται το είδος του αντικειμένου στο οποίο δείχνει η μεταβλητή ''b'', ανεξάρτητα εάν η reference μεταβλητή είναι του τύπου της γονικής κλάσης ή της υποκλάσης αυτής. Η παραπάνω διάκριση είναι γνωστή και ως δυναμικός πολυμορφισμός (//dynamic polymorphism//). |Προηγούμενο: [[ :java:super_operator | Ο τελεστής super ]] | Επόμενο: [[ :java:hiding_static_methods | Καλώντας στατικές μεθόδους από την γονική κλάση και την υποκλάση ]]|

java/polymorphism.1425237311.txt.gz · Last modified: 2016/02/26 11:15 (external edit)