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
Next revision Both sides next revision
java:polymorphism [2017/01/31 13:24]
gthanos
java:polymorphism [2017/03/03 13:51]
gthanos [Δυναμικός Πολυμορφισμός]
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 40: Line 41:
 class Mammal extends Animal { class Mammal extends Animal {
    public void signature() {    public void signature() {
-      System.out.println("I am a Mammal!");+      System.out.println("I am a mammal!");
    }    }
 } }
Line 47: Line 48:
  
    public void signature() {    public void signature() {
-      System.out.println("I am a Dog!");+      System.out.println("I am a dog!");
    }    }
 } }
Line 55: Line 56:
    public static void main(String args[]) {    public static void main(String args[]) {
       Animal a = new Animal(); // Animal reference and object       Animal a = new Animal(); // Animal reference and object
-      Animal b = new Mammal()  // Animal reference but Mammal object+      Animal b = new Mammal() // Animal reference but Mammal object
       Animal c = new Dog();    // Animal reference but Dog object       Animal c = new Dog();    // Animal reference but Dog object
  
       a.signature(); //output: I am an animal.       a.signature(); //output: I am an animal.
-      b.signature(); //output: I am a Mammal+      b.signature(); //output: I am a mammal
-      c.signature(); //output: I am a Dog!+      c.signature(); //output: I am a dog!
    }    }
 } }
Line 67: Line 68:
 Παρατηρούμε ότι η κλήση της μεθόδου ''signature'' από τρεις μεταβλητές τύπου ''Animal'' που η πρώτη (''a'') δείχνει σε αντικείμενο της γονικής κλάσης (''Animal''), η δεύτερη (''b'') σε αντικείμενο της υποκλάσης (''Mammal'') και η τρίτη η δεύτερη (''b'') σε αντικείμενο της υποκλάσης (''Dog'') έχει ως αποτέλεσμα την κλήση διαφορετικών μεθόδων. Η απόφαση για το ποια μέθοδος θα κληθεί σε κάθε μία από τις τρεις περιπτώσεις δεν μπορεί να αποφασιστεί κατά την μεταγλώττιση του προγράμματος. Το JVM καλείται να αποφασίσει, με βάση τον τύπο του αντικειμένου στο οποίο δείχνει κάθε μεταβλητή κατά την εκτέλεση. Παρατηρούμε ότι η κλήση της μεθόδου ''signature'' από τρεις μεταβλητές τύπου ''Animal'' που η πρώτη (''a'') δείχνει σε αντικείμενο της γονικής κλάσης (''Animal''), η δεύτερη (''b'') σε αντικείμενο της υποκλάσης (''Mammal'') και η τρίτη η δεύτερη (''b'') σε αντικείμενο της υποκλάσης (''Dog'') έχει ως αποτέλεσμα την κλήση διαφορετικών μεθόδων. Η απόφαση για το ποια μέθοδος θα κληθεί σε κάθε μία από τις τρεις περιπτώσεις δεν μπορεί να αποφασιστεί κατά την μεταγλώττιση του προγράμματος. Το JVM καλείται να αποφασίσει, με βάση τον τύπο του αντικειμένου στο οποίο δείχνει κάθε μεταβλητή κατά την εκτέλεση.
  
-Στο παραπάνω παράδειγμα, το JVM γνωρίζει το είδος του αντικειμένου στο οποίο δείχνουν οι μεταβλητές ''a'', ''b'' και ''c'' ανεξάρτητα εάν η reference μεταβλητή είναι του τύπου της γονικής κλάσης ή της υποκλάσης. Η παραπάνω διάκριση είναι γνωστή και ως δυναμικός πολυμορφισμός (//dynamic polymorphism//), καθώς το ποια μέθοδος θα κληθεί τελικά επαφίεται στο JVM και όχι στον compiler.+Στο παραπάνω παράδειγμα, το JVM γνωρίζει το είδος του αντικειμένου στο οποίο δείχνουν οι μεταβλητές ''a'', ''b'' και ''c'' ανεξάρτητα εάν η reference μεταβλητή είναι του τύπου της γονικής κλάσης ή της υποκλάσης. Η παραπάνω διάκριση είναι γνωστή ως δυναμικός πολυμορφισμός (//dynamic polymorphism//), διότι το ποια μέθοδος θα κληθεί αποφασίζεται κατά την εκτέλεση και όχι κατά την μεταγλώττιση.
  
-|Προηγούμενο: [[ :java:super_operator | Ο τελεστής super ]] | Επόμενο: [[ :java:hiding_static_methods | Καλώντας στατικές μεθόδους από την γονική κλάση και την υποκλάση ]]|+|Προηγούμενο: [[ :java:super_operator | Ο τελεστής super ]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[ :java:hiding_static_methods | Καλώντας στατικές μεθόδους από την γονική κλάση και την υποκλάση ]]|
java/polymorphism.txt · Last modified: 2020/03/27 13:18 by gthanos