Ο πολυμορφισμός στην Java αναφέρεται στην ικανότητα ενός αντικειμένου να παρουσιάζει διαφορετικές μορφές, με βάση την κλάση στην οποία ανήκει και τις σχέσεις κληρονομικότητας που έχει με άλλες κλάσεις. Αυτό σημαίνει ότι ένα αντικείμενο μπορεί να αντιμετωπίζεται ως αντικείμενο της ίδιας κλάσης ή των υποκλάσεών της.
Ο πολυμορφισμός επιτρέπει την εκτέλεση διαφορετικών συμπεριφορών για το ίδιο μήνυμα, ανάλογα με τον τύπο του αντικειμένου που το λαμβάνει. Αυτό επιτρέπει την ευελιξία και την ανακατανομή κωδικού, καθώς ο κώδικας μπορεί να γραφεί γενικά για μια κλάση ή διεπαφή, ενώ μπορεί να χρησιμοποιηθεί με αντικείμενα διαφορετικών κλάσεων που υλοποιούν αυτήν την κλάση ή διεπαφή.
Ο πολυμορφισμός παρέχει ευελιξία στον σχεδιασμό και την υλοποίηση των κλάσεων, καθώς επιτρέπει την αντικατάσταση αντικειμένων χωρίς να απαιτείται αλλαγή στον κώδικα που τα χρησιμοποιεί.
Για παράδειγμα, ας υποθέσουμε μια γονική κλάση με το όνομα “Animal”, η οποία περιλαμβάνει μια μέθοδο με το όνομα “animalSound()”. Οι υποκλάσεις του “Animal” θα μπορούσαν να είναι “Χοίροι”, “Γάτες”, “Σκύλοι”, “Πουλιά” και κάθε μία από αυτές τις υποκλάσεις θα θα μπορούσε να υλοποιήσει τη δική της έκδοση του ήχου του ζώου (όπως το χοίρος θριέι, η γάτα νιαουρίζει, κλπ.).:
// Αυτή είναι μια κλάση Animal class Animal { public void animalSound() { System.out.println("The animal makes a sound"); // Εμφανίζει μήνυμα στα αγγλικά για τον ήχο που κάνει το ζώο } } // Αυτή είναι μια υποκλάση της κλάσης Animal, ένα γουρούνι class Pig extends Animal { public void animalSound() { System.out.println("The pig says: Oink oink"); // Εμφανίζει μήνυμα στα αγγλικά για τον ήχο που κάνει το γουρούνι } } // Αυτή είναι μια υποκλάση της κλάσης Animal, μια γάτα class Cat extends Animal { public void animalSound() { System.out.println("The cat says: Meow"); // Εμφανίζει μήνυμα στα αγγλικά για τον ήχο που κάνει η γάτα } } // Αυτή είναι η κλάση Main που περιέχει τη μέθοδο main() public class Main { public static void main(String[] args) { Animal myAnimal = new Animal(); // Δημιουργία αντικειμένου Animal Animal myPig = new Pig(); // Δημιουργία αντικειμένου Pig Animal myCat = new Cat(); // Δημιουργία αντικειμένου Cat myAnimal.animalSound(); // Κλήση της μεθόδου animalSound() για το αντικείμενο Animal myPig.animalSound(); // Κλήση της μεθόδου animalSound() για το αντικείμενο Pig myCat.animalSound(); // Κλήση της μεθόδου animalSound() για το αντικείμενο Cat } }
Ο παραπάνω κώδικας περιλαμβάνει μια ιεραρχία κλάσεων που αντιπροσωπεύουν ζώα.
Η βασική κλάση είναι η Animal
, η οποία έχει μια μέθοδο animalSound()
που εμφανίζει ένα μήνυμα για τον ήχο που κάνει το ζώο.
Υπάρχουν δύο υποκλάσεις που κληρονομούν από την κλάση Animal
: το Pig
και η Cat
. Και οι δύο υποκλάσεις έχουν τη δική τους υλοποίηση της μεθόδου animalSound()
, η οποία εμφανίζει ένα συγκεκριμένο μήνυμα για τον ήχο που κάνει το κάθε ζώο.
Στην κλάση Main
, στην μέθοδο main()
, δημιουργούνται αντικείμενα των κλάσεων Animal
, Pig
και Cat
. Καλούνται οι μέθοδοι animalSound()
για κάθε αντικείμενο, που εμφανίζουν τα αντίστοιχα μηνύματα για τον ήχο που κάνει το κάθε ζώο.
Έτσι, ο κώδικας εμφανίζει τα ακόλουθα μηνύματα στην έξοδο:
The animal makes a sound The pig says: Oink oink The cat says: Meow
Κάθε μήνυμα περιγράφει τον ήχο που κάνει το αντίστοιχο ζώο.
Παρακάτω υπάρχει ένα παράδειγμα πολυμορφισμού και δύο αντικείμενα Pig
και Dog
:
// Αυτή είναι μια κλάση Animal class Animal { public void animalSound() { System.out.println("The animal makes a sound"); // Εκτύπωση μηνύματος για τον ήχο που κάνει το ζώο } } // Αυτή είναι μια υποκλάση της κλάσης Animal, ένα γουρούνι class Pig extends Animal { public void animalSound() { System.out.println("The pig says: Oink oink"); // Εκτύπωση μηνύματος για τον ήχο που κάνει το γουρούνι } } // Αυτή είναι μια υποκλάση της κλάσης Animal, ένα σκυλί class Dog extends Animal { public void animalSound() { System.out.println("The dog says: Bark bark"); // Εκτύπωση μηνύματος για τον ήχο που κάνει το σκυλί } } // Αυτή είναι η κλάση Main που περιέχει τη μέθοδο main() public class Main { public static void main(String[] args) { Animal myAnimal = new Animal(); // Δημιουργία αντικειμένου Animal Animal myPig = new Pig(); // Δημιουργία αντικειμένου Pig Animal myDog = new Dog(); // Δημιουργία αντικειμένου Dog System.out.println("Animals and their sounds:"); // Εμφάνιση μηνύματος στα αγγλικά myAnimal.animalSound(); // Κλήση της μεθόδου animalSound() για το αντικείμενο Animal myPig.animalSound(); // Κλήση της μεθόδου animalSound() για το αντικείμενο Pig myDog.animalSound(); // Κλήση της μεθόδου animalSound() για το αντικείμενο Dog } }
Ο παραπάνω κώδικας περιέχει τρεις κλάσεις: Animal
, Pig
και Dog
. Η κλάση Animal
είναι η γονική κλάση και περιέχει μια μέθοδο με το όνομα animalSound()
, η οποία εκτυπώνει το μήνυμα “The animal makes a sound”.
Οι κλάσεις Pig
και Dog
είναι υποκλάσεις της κλάσης Animal
και κληρονομούν τη μέθοδο animalSound()
. Ωστόσο, καθεμία από αυτές τις κλάσεις έχει υλοποιήσει τη μέθοδο animalSound()
με δικό της τρόπο. Η κλάση Pig
εκτυπώνει το μήνυμα “The pig says: Oink oink”, ενώ η κλάση Dog
εκτυπώνει το μήνυμα “The dog says: Bark bark”.
Στην κλάση Main
, η μέθοδος main()
δημιουργεί αντικείμενα τύπου Animal
, Pig
και Dog
. Στη συνέχεια, εμφανίζει το μήνυμα “Animals and their sounds:”, και καλεί τη μέθοδο animalSound()
για κάθε αντικείμενο, προκαλώντας την εμφάνιση του αντίστοιχου ήχου που κάνει το ζώο.