Και οι δύο επαναχρησιμοποιούν ένα όνομα μεθόδου , αλλά είναι ουσιαστικά διαφορετικές. = ίδιο όνομα, , στην ίδια κλάση, επιλύεται κατά την . = μια υποκλάση μια μέθοδο γονέα με την , επιλύεται κατά .
Και οι δύο επαναχρησιμοποιούν ένα όνομα μεθόδου , αλλά είναι ουσιαστικά διαφορετικές. = ίδιο όνομα, , στην ίδια κλάση, επιλύεται κατά την . = μια υποκλάση μια μέθοδο γονέα με την , επιλύεται κατά .
| Υπερφόρτωση | Παράκαμψη | |
|---|---|---|
| Υπογραφή | Πρέπει να διαφέρει (παράμετροι) | Πρέπει να είναι ίδια |
| Σχέση | Ίδια κλάση | Γονική ↔ υποκλάση |
| Επιλύεται | Χρόνος μεταγλώττισης (static) | Χρόνος εκτέλεσης (dynamic) |
| Σκοπός | Ευκολία / παραλλαγές | Πολυμορφισμός |
class Printer {
void print(String s) { System.out.println(s); }
void print(int n) { System.out.println(n); } // same name, diff param
void print(String s, int times) { /* ... */ }
}
Ο μεταγλωττιστής επιλέγει ποια print με βάση τους τύπους ορισμάτων — κανένα κληρονομικό εμπλεκόμενο.
class Animal { String speak() { return "..."; } }
class Dog extends Animal {
@Override
String speak() { return "Woof"; } // replaces Animal.speak()
}
Animal a = new Dog();
a.speak(); // "Woof" — runtime picks Dog's version (dynamic dispatch)
Ένα συχνό λάθος είναι η τυχαία υπερφόρτωση όταν ήθελες να παρακάμψεις (π.χ. ένα τυπογραφικό λάθος στην υπογραφή). Χρησιμοποιείτε πάντα @Override (Java) ή override (C#) ώστε ο μεταγλωττιστής να το ανιχνεύσει.
Η παράκαμψη είναι ο κινητήρας του πολυμορφισμού — ο μηχανισμός χρόνου εκτέλεσης που κάνει το "ένα διασύνδεση, πολλές υλοποιήσεις" να λειτουργεί.
Η γνώση της διαφοράς αποτρέπει ένα κλασικό σφάλμα: η νομίζοντας ότι αντικατέστησες τη συμπεριφορά όταν στην πραγματικότητα δημιούργησες μια δεύτερη μέθοδο που ποτέ δεν καλείται.
Μια βιβλιοθήκη ερωτήσεων συνέντευξης IT με αναλυτικές απαντήσεις — από Junior έως Senior.
Δωρεά