Κληρονομιά σε Java (με παράδειγμα)

⚡ Έξυπνη Σύνοψη

Κληρονομιά σε Java είναι ένας μηχανισμός στον οποίο μια κλάση αποκτά τα πεδία και τις μεθόδους μιας άλλης κλάσης μέσω της λέξης-κλειδιού extends. Προωθεί την επαναχρησιμοποίηση κώδικα και μοντελοποιεί μια σχέση Is-A μεταξύ μιας υπερκλάσης και των υποκλάσεών της.

  • 🧬 Ορισμός Κληρονομικότητας: Μία κλάση αποκτά τα πεδία και τις μεθόδους μιας άλλης χρησιμοποιώντας την extends.
  • 👨👩👧 Σχέση Είναι-Ένα: Μοντελοποιεί μια ιεραρχία γονικής (υπερ) κλάσης και θυγατρικής (υπο) κλάσης.
  • 🗂️ Πέντε τύποι: Μονή, πολλαπλή, πολυεπίπεδη, ιεραρχική και υβριδική κληρονομικότητα.
  • 🚫 Java Περιορισμός: Java δεν υποστηρίζει πολλαπλή ή υβριδική κληρονομικότητα μέσω κλάσεων.
  • 🔑 Υπερ-λέξη-κλειδί: Προσπελαύνει μεταβλητές, μεθόδους και κατασκευαστές γονικής κλάσης από μια υποκλάση.
  • Όφελος: Επαναχρησιμοποιεί δοκιμασμένο κώδικα και προσθέτει χαρακτηριστικά μέσω νέων κλάσεων χωρίς να τροποποιεί τις υπάρχουσες.

Κληρονομιά σε Java

Τι είναι η κληρονομικότητα;

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

Τι είναι η κληρονομικότητα Java?

Java Κληρονομία είναι ένας μηχανισμός στον οποίο μια κλάση αποκτά την ιδιότητα μιας άλλης κλάσης. Σε Java, όταν υπάρχει μια σχέση "Is-A" μεταξύ δύο κλάσεων, χρησιμοποιούμε το Inheritance. Η γονική κλάση ονομάζεται υπερκλάση και η κληρονομούμενη κλάση ονομάζεται υποκλάση. Η λέξη κλειδί extends χρησιμοποιείται από την υποκλάση για να κληρονομήσει τα χαρακτηριστικά της super class. Η κληρονομικότητα είναι σημαντική αφού οδηγεί στην επαναχρησιμοποίηση του κώδικα.

Java Σύνταξη κληρονομικότητας:

class subClass extends superClass
{
   //methods and fields
}

Τύποι κληρονομιάς σε Java

Εδώ είναι οι διαφορετικοί τύποι κληρονομιάς Java:

  1. Ενιαία κληρονομικότητα
  2. Πολλαπλή κληρονομικότητα
  3. Πολυεπίπεδη κληρονομικότητα
  4. Ιεραρχική κληρονομικότητα
  5. Υβριδική κληρονομικότητα

1. Ενιαία κληρονομιά:

Στο Single Inheritance μια κλάση επεκτείνει μια άλλη κλάση (μόνο μια κλάση).

Ενιαία κληρονομιά σε Java
Ενιαία κληρονομικότητα

Στο παραπάνω διάγραμμα, η Κλάση Β επεκτείνεται μόνο την Κλάση Α. Η Κατηγορία Α είναι μια υπερκλάση και η Κλάση Β είναι μια Υποκλάση.

2. Πολλαπλή κληρονομιά:

Η πολλαπλή κληρονομιά είναι μία από τις κληρονομιές Java τύπους όπου μία κλάση εκτείνεται σε περισσότερες από μία κλάσεις. Java δεν υποστηρίζει πολλαπλή κληρονομικότητα.

Πολλαπλή κληρονομιά σε Java

Java Πολλαπλή κληρονομικότητα

Σύμφωνα με το παραπάνω διάγραμμα, η Κατηγορία C επεκτείνει την Κλάση Α και την Κατηγορία Β αμφότερες.

3. Πολυεπίπεδη κληρονομιά:

Στο Multilevel Inheritance, μια κλάση μπορεί να κληρονομήσει από μια παράγωγη κλάση. Επομένως, η παραγόμενη κλάση γίνεται η βασική κλάση για τη νέα κλάση.

Πολυεπίπεδη κληρονομιά σε Java

Πολυεπίπεδη κληρονομικότητα

Όπως φαίνεται στο διάγραμμα, η κλάση C είναι η υποκατηγορία Β και η Β είναι μια υποκατηγορία Α.

4. Ιεραρχική κληρονομιά:

Στην Ιεραρχική Κληρονομικότητα, μια κλάση κληρονομείται από πολλές υποκλάσεις.


Ιεραρχική Κληρονομιά σε Java

Ιεραρχική κληρονομικότητα

Σύμφωνα με το παραπάνω παράδειγμα, οι κλάσεις B, C και D κληρονομούν την ίδια κατηγορία A.

5. Υβριδική κληρονομικότητα:

Η υβριδική κληρονομικότητα είναι ένας από τους τύπους κληρονομικότητας Java που είναι ένας συνδυασμός Απλής και Πολλαπλής κληρονομιάς.


Υβριδική κληρονομικότητα

Υβριδική κληρονομικότητα

Σύμφωνα με το παραπάνω παράδειγμα, όλα τα δημόσια και προστατευόμενα μέλη της Κλάσης Α κληρονομούνται στην Τάξη Δ, πρώτα μέσω της Τάξης Β και, δεύτερον, μέσω της Τάξης Γ.

Σημείωση: Java δεν υποστηρίζει υβριδική/Πολλαπλή κληρονομικότητα

Κληρονομιά σε Java Παράδειγμα

Εδώ είναι ένα παράδειγμα κληρονομικότητας σε Java:


Παράδειγμα Java Κληρονομία

Java Παράδειγμα κληρονομικότητας

class Doctor {
 void Doctor_Details() {
  System.out.println("Doctor Details...");
 }
}

class Surgeon extends Doctor {
 void Surgeon_Details() {
  System.out.println("Surgen Detail...");
 }
}

public class Hospital {
 public static void main(String args[]) {
  Surgeon s = new Surgeon();
  s.Doctor_Details();
  s.Surgeon_Details();
 }
}

Super Λέξη-κλειδί

Η λέξη-κλειδί σούπερ είναι παρόμοια με τη λέξη-κλειδί "αυτή". Η λέξη-κλειδί super μπορεί να χρησιμοποιηθεί για πρόσβαση σε οποιοδήποτε μέλος δεδομένων ή μεθόδους της γονικής κλάσης. Σούπερ λέξη-κλειδί μπορεί να χρησιμοποιηθεί στο μεταβλητή, μέθοδος και επίπεδο κατασκευαστή.

Σύνταξη:

super.<method-name>();

Ελέγξτε επίσης: - αυτή η λέξη-κλειδί σε Java: Τι είναι και πώς να το χρησιμοποιήσετε με το Παράδειγμα

Μάθετε την κληρονομικότητα στα OOP με Παράδειγμα

Σκεφτείτε την ίδια τραπεζική εφαρμογή από το προηγούμενο παράδειγμα.

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

Κληρονομιά σε ΟΟΠ

Ας συγκρίνουμε και ας μελετήσουμε πώς μπορούμε να προσεγγίσουμε την κωδικοποίηση από α δομημένη και αντικειμενοστραφή προοπτική προγραμματισμού.

Δομική προσέγγιση: Στον δομημένο προγραμματισμό, θα δημιουργήσουμε δύο συναρτήσεις –

  1. Ένας να αποσυρθεί
  2. Και το άλλο για ενέργεια κατάθεσης.

Δεδομένου ότι η λειτουργία αυτών των λειτουργιών παραμένει ίδια σε όλους τους λογαριασμούς.

Κληρονομιά σε ΟΟΠ

Η προσέγγιση του OOP: Κατά τη χρήση του OOPs προγραμματιστική προσέγγιση. Θα δημιουργήσαμε δύο τάξεις.

  • Καθένα έχει την υλοποίηση των λειτουργιών κατάθεσης και ανάληψης.
  • Αυτό θα περιττή επιπλέον εργασία.

Κληρονομιά σε ΟΟΠ

Αίτημα αλλαγής στο λογισμικό

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

Αίτημα αλλαγής στο λογισμικό

Δομική προσέγγιση: Χρησιμοποιώντας τη λειτουργική προσέγγιση, πρέπει να τροποποιήσω τη συνάρτηση απόσυρσής μου, η οποία είναι ήδη δοκιμασμένη και βασισμένη. Και προσθέστε μια μέθοδο όπως παρακάτω θα καλύψει τις νέες απαιτήσεις.

Αίτημα αλλαγής στο λογισμικό

Η προσέγγιση του OOP: Χρησιμοποιώντας την προσέγγιση του OOP, χρειάζεται απλώς να γράψετε μια νέα κλάση με μοναδική εφαρμογή της συνάρτησης απόσυρσης. Δεν αγγίξαμε ποτέ το δοκιμασμένο κομμάτι κώδικα.

Αίτημα αλλαγής στο λογισμικό

Άλλο ένα αίτημα αλλαγής

Τι γίνεται αν η απαίτηση αλλάξει περαιτέρω; Θέλετε να προσθέσετε λογαριασμό πιστωτικής κάρτας με τη δική του μοναδική απαίτηση καταθέσεων.

Απαιτήσεις πολλαπλών αλλαγών σε λογισμικό

Δομική προσέγγιση: Χρησιμοποιώντας δομική προσέγγιση, πρέπει να αλλάξετε ξανά το δοκιμασμένο κομμάτι του κωδικού κατάθεσης.

Δομική προσέγγιση στο αίτημα πολλαπλών αλλαγών στο λογισμικό

Η προσέγγιση του OOP: Αλλά χρησιμοποιώντας αντικειμενοστρεφή προσέγγιση, θα δημιουργήσετε απλώς μια νέα κλάση με τη μοναδική της εφαρμογή της μεθόδου κατάθεσης (επισημασμένη με κόκκινο στην παρακάτω εικόνα). Έτσι, παρόλο που ο δομικός προγραμματισμός φαίνεται αρχικά σαν μια εύκολη προσέγγιση, τα OOP κερδίζουν μακροπρόθεσμα.

Η προσέγγιση του OOP στο αίτημα πολλαπλών αλλαγών

Πλεονεκτήματα της κληρονομικότητας στα OOP

Αλλά κάποιος μπορεί να υποστηρίξει ότι σε όλες τις κατηγορίες, έχετε επαναλαμβανόμενα κομμάτια κώδικα.

Για να το ξεπεράσετε, δημιουργείτε μια γονική τάξη, λέτε "λογαριασμός" και εφαρμόζετε την ίδια λειτουργία κατάθεσης και ανάληψης. Και κάντε τις θυγατρικές τάξεις κληρονομημένη κατηγορία "λογαριασμού". Έτσι ώστε να έχουν πρόσβαση σε λειτουργίες ανάληψης και κατάθεσης στην κατηγορία λογαριασμού. Οι λειτουργίες δεν απαιτείται να υλοποιηθούν μεμονωμένα. Αυτό είναι Κληρονομικότητα στη java. .

Πλεονεκτήματα της κληρονομικότητας στα OOP

Πλεονεκτήματα της κληρονομικότητας στα OOP

Συχνές Ερωτήσεις

Java αποφεύγει την πολλαπλή κληρονομικότητα κλάσεων για να αποτρέψει το «πρόβλημα διαμαντιού», όπου ο μεταγλωττιστής δεν μπορεί να αποφασίσει ποια κληρονομική μέθοδο θα χρησιμοποιήσει. Αντ' αυτού, Java επιτρέπει σε μια κλάση να υλοποιήσει πολλαπλές διεπαφές για να επιτύχει παρόμοια ευελιξία με ασφάλεια.

Η λέξη-κλειδί this αναφέρεται στο τρέχον αντικείμενο και τα μέλη του, ενώ η super αναφέρεται στην άμεση γονική κλάση. Χρησιμοποιήστε τη λέξη-κλειδί super για να καλέσετε τις μεταβλητές, τις μεθόδους ή τον κατασκευαστή ενός γονέα από μια υποκλάση.

Η κληρονομικότητα μοντελοποιεί μια σχέση «Είναι-Α» όπου μια υποκλάση επεκτείνει έναν γονέα. Η σύνθεση μοντελοποιεί μια σχέση «Έχει-Α» όπου μια κλάση περιέχει άλλα αντικείμενα. Η σύνθεση είναι συχνά πιο ευέλικτη και προτιμάται για χαλαρά συνδεδεμένα σχέδια.

Η Τεχνητή Νοημοσύνη μπορεί να αναλύσει τις ευθύνες των κλάσεων, να προτείνει κοινές βασικές κλάσεις, να προτείνει διεπαφές μέσω βαθιάς κληρονομικότητας και να επισημάνει διπλότυπο κώδικα, helping Οι προγραμματιστές δημιουργούν καθαρές, επαναχρησιμοποιήσιμες ιεραρχίες που ακολουθούν τις αρχές αντικειμενοστρεφούς σχεδιασμού.

Ναι. Η στατική ανάλυση με τη βοήθεια της τεχνητής νοημοσύνης μπορεί να μετρήσει το βάθος κληρονομικότητας, να επισημάνει εύθραυστες ή υπερβολικά ένθετες ιεραρχίες και να προτείνει αναδιάρθρωση προς τη σύνθεση ή τις διεπαφές για τη βελτίωση της συντηρησιμότητας και τη μείωση της στενής σύζευξης.

Συνοψίστε αυτήν την ανάρτηση με: