Η κληρονομικότητα στην Java εξηγείται

Κληρονομία

Η κληρονομιά Java αναφέρεται στην ικανότητα μιας κλάσης Java στις inheritιδιότητες από κάποια άλλη κλάση. Σκεφτείτε το σαν ένα παιδί που κληρονομεί ιδιότητες από τους γονείς του, η ιδέα είναι πολύ παρόμοια με αυτήν. Στο Java lingo, ονομάζεται επίσης επέκταση -τάξη.

Μερικά απλά πράγματα που πρέπει να θυμάστε:

  • Η κλάση που επεκτείνεται ή κληρονομείται ονομάζεται υποκατηγορία
  • Η τάξη που επεκτείνεται ή κληρονομείται ονομάζεται superclass

Έτσι, η κληρονομιά δίνει στην Java τη δροσερή δυνατότητα επαναχρησιμοποίησης κώδικα ή κοινής χρήσης κώδικα μεταξύ τάξεων!

Ας το περιγράψουμε με το κλασικό παράδειγμα μιας Vehicleτάξης και μιας Carτάξης:

public class Vehicle { public void start() { // starting the engine } public void stop() { // stopping the engine } } public class Car extends Vehicle { int numberOfSeats = 4; public int getNumberOfSeats() { return numberOfSeats; } }

Εδώ, μπορούμε να δούμε την Carτάξη να κληρονομεί τις ιδιότητες της Vehicleτάξης. Επομένως, δεν χρειάζεται να γράψουμε τον ίδιο κώδικα για τις μεθόδους start()και stop()για το Carίδιο, καθώς αυτές οι ιδιότητες είναι διαθέσιμες από τη μητρική ή την superclass της. Επομένως, αντικείμενα που δημιουργούνται από την Carτάξη θα έχουν επίσης αυτές τις ιδιότητες!

Car tesla = new Car(); tesla.start(); tesla.stop();

Εκτέλεση κώδικα

Αλλά, έχει η γονική τάξη τις μεθόδους του παιδιού; Όχι, δεν είναι.

Επομένως, όποτε θέλετε να μοιραστείτε κάποιο κοινό κομμάτι κώδικα μεταξύ πολλών τάξεων, είναι πάντα καλό να έχετε μια τάξη γονέα και, στη συνέχεια, να επεκτείνετε αυτήν την τάξη όποτε χρειάζεται! Μειώνει τον αριθμό γραμμών κώδικα, καθιστά τον κώδικα αρθρωτό και απλοποιεί τον έλεγχο.

Τι μπορεί να κληρονομηθεί;

  • Όλα protectedκαι publicπεδία και μέθοδοι από τον γονέα

Τι δεν μπορεί να κληρονομηθεί;

  • private πεδία και μέθοδοι
  • Κατασκευαστές. Παρόλο που, ο κατασκευαστής της υποκατηγορίας πρέπει να καλέσει τον κατασκευαστή του superclass εάν έχει οριστεί (Περισσότερα για αυτό αργότερα!)
  • Πολλαπλές τάξεις. Η Java υποστηρίζει μόνο μία κληρονομιά , δηλαδή μπορείτε να κληρονομήσετε μόνο μία τάξη τη φορά.
  • Πεδία. Τα μεμονωμένα πεδία μιας τάξης δεν μπορούν να παρακαμφθούν από την υποκατηγορία.

Τύπος Casting & Reference

Στην Java, είναι δυνατή η αναφορά μιας υποκατηγορίας ως παρουσία του superclass της. Ονομάζεται Polymorphism in Object Oriented Programming (OOP), η ικανότητα ενός αντικειμένου να λαμβάνει πολλές μορφές. Για παράδειγμα, το Carαντικείμενο κλάσης μπορεί να αναφέρεται ως παρουσία Vehicleκλάσης ως εξής:

Vehicle car = new Car();

Αν και το αντίθετο δεν είναι δυνατό:

Car car = new Vehicle(); // ERROR

Εκτέλεση κώδικα

Δεδομένου ότι μπορείτε να αναφέρετε μια υποκατηγορία Java ως παρουσία superclass, μπορείτε εύκολα να μεταδώσετε μια παρουσία ενός αντικειμένου δευτερεύουσας κλάσης σε μια παρουσία superclass. Είναι δυνατό να ρίξετε ένα αντικείμενο superclass σε έναν τύπο υποκατηγορίας, αλλά μόνο εάν το αντικείμενο είναι πραγματικά μια παρουσία της υποκατηγορίας . Λάβετε λοιπόν υπόψη αυτό:

Car car = new Car(); Vehicle vehicle = car; // upcasting Car car2 = (Car)vechile; //downcasting Bike bike = new Bike(); // say Bike is also a subclass of Vehicle Vehicle v = bike; // upcasting, no problem here. Car car3 = (Car)bike; // Compilation Error : as bike is NOT a instance of Car

Εκτέλεση κώδικα

Τώρα ξέρετε πώς να μοιράζεστε κώδικα μέσω σχέσης γονέα-παιδιού. Τι γίνεται όμως, αν δεν σας αρέσει η εφαρμογή μιας συγκεκριμένης μεθόδου στην παιδική τάξη και θέλετε να γράψετε μια νέα για αυτήν; Τί κάνεις λοιπόν?

Παράκαμψή του!

Η Java σάς επιτρέπει να παρακάμψετε ή να επαναπροσδιορίσετε τις μεθόδους που ορίζονται στο superclass. Για παράδειγμα, η Carτάξη σας έχει διαφορετική εφαρμογή start()από αυτήν του γονέα Vehicle, οπότε το κάνετε αυτό:

public class Vehicle { public void start() { System.out.println("Vehicle start code"); } } public class Car extends Vehicle { public void start() { System.out.println("Car start code"); } } Car car = new Car(); car.start(); // "Car start code"

Εκτέλεση κώδικα

Έτσι, είναι πολύ απλό να παρακάμψετε μεθόδους στην υποκατηγορία. Ωστόσο, υπάρχει μια παγίδα . Θα αντικατασταθεί μόνο αυτή η μέθοδος superclass με την ίδια ακριβώς υπογραφή μεθόδου με τη μέθοδο subclass. Αυτό σημαίνει ότι ο ορισμός της μεθόδου της υποκατηγορίας πρέπει να έχει το ίδιο ακριβώς όνομα, τον ίδιο αριθμό και τον τύπο παραμέτρων και με την ίδια ακριβώς ακολουθία. Έτσι, public void start(String key)δεν θα παρακάμψαμε public void start().

Σημειώσεις :

  • Δεν μπορείτε να παρακάμψετε τις ιδιωτικές μεθόδους του superclass. (Αρκετά προφανές, έτσι δεν είναι;)
  • Τι γίνεται αν η μέθοδος του superclass που παρακάμπτετε στην υποκατηγορία ξαφνικά καταργηθεί ή αλλάξουν οι μέθοδοι; Θα αποτύχει στο χρόνο εκτέλεσης! Έτσι, η Java σάς παρέχει έναν καλό σχολιασμό τον @Overrideοποίο μπορείτε να τοποθετήσετε στη μέθοδο της υποκατηγορίας, η οποία θα προειδοποιήσει τον μεταγλωττιστή για αυτά τα συμβάντα!

Οι σχολιασμοί στην Java είναι μια καλή πρακτική κωδικοποίησης, αλλά δεν είναι απαραίτητη. Ωστόσο, ο μεταγλωττιστής είναι αρκετά έξυπνος για να καταλάβει ότι υπερισχύει από μόνος του. Σε αντίθεση με άλλες γλώσσες OOP, οι σχολιασμοί στην Java δεν τροποποιούν απαραίτητα τη μέθοδο ή προσθέτουν επιπλέον λειτουργικότητα.

Πώς να καλέσετε μεθόδους σούπερ κατηγορίας;

Αστείο ρωτάτε για αυτό! Απλώς χρησιμοποιήστε τη λέξη-κλειδί super:

public class Vehicle() { public void start() { System.out.println("Vehicle start code"); } } public class Car extends Vehicle { public void run() { super.start(); } } Car car = new Car(); car.run(); // "Vehicle start code"

Εκτέλεση κώδικα

Σημείωση : Παρόλο που μπορείτε να καλέσετε τη γονική μέθοδο χρησιμοποιώντας μιαsuperκλήση, δεν μπορείτε να ανεβείτε την ιεραρχία κληρονομιάς με αλυσοδεμένεςsuperκλήσεις.

Πώς να μάθετε τον τύπο μιας τάξης;

Using the instanceof keyword. Having lots of classes and subclasses it would be a little confusing to know which class is a subclass of which one in runtime. So, we can use instanceof to determine whether an object is an instance of a class, an instance of a subclass, or an instance of an interface.

Car car = new Car(); boolean flag = car instanceof Vehicle; // true in this case!

Constructors & Inheritance

As mentioned earlier, constructors cannot be directly inherited by a subclass. Although, a subclass is required to call its parent’s constructor as the first operation in its own constructor. How? You guessed it, using super :

public class Vehicle { public Vehicle() { // constructor } public void start() { System.out.println("Vehicle start code"); } } public class Car extends Vehicle { public Car() { super(); } public void run() { super.start(); } }

Run Code

Θυμηθείτε, εάν το superclass δεν έχει οριστεί κατασκευαστές, δεν χρειάζεται να το ονομάσετε ρητά στην υποκατηγορία. Η Java το χειρίζεται εσωτερικά για εσάς! Η επίκληση στον superκατασκευαστή γίνεται στην περίπτωση που η υπερκατηγορία πρόκειται να κληθεί με οποιονδήποτε άλλο κατασκευαστή εκτός από τον προεπιλεγμένο κατασκευαστή .

Εάν δεν έχουν οριστεί άλλοι κατασκευαστές, τότε η Java επικαλείται τον προεπιλεγμένο κατασκευαστή σούπερ κλάσης ( ακόμη και αν δεν ορίζεται ρητά ).

Συγχαρητήρια, τώρα γνωρίζετε τα πάντα για το Κληρονομικό! Διαβάστε περισσότερα σχετικά με προχωρημένους τρόπους κληρονομιάς πραγμάτων σε αφηρημένες τάξεις και διεπαφές