interface enhancements java 8 java functional interface
Αυτό το σεμινάριο εξηγεί τις προσθήκες στη διεπαφή στην Java 8 και τις διαφορές μεταξύ εννοιών Java όπως μια αφηρημένη κλάση, επεκτείνει τη λέξη-κλειδί κ.λπ. με τις διεπαφές:
Εξερευνήσαμε τα πάντα Διεπαφές σε Java στο τελευταίο μας σεμινάριο. Έχουμε εισαγάγει και καλύψει τις βασικές έννοιες των διεπαφών στην Java συμπεριλαμβανομένων των πολλαπλών διεπαφών.
Πριν από την Java 8, οι διεπαφές είχαν τη δυνατότητα να έχουν μόνο αφηρημένες μεθόδους και στατικές και τελικές μεταβλητές. Οι αφηρημένες μέθοδοι είναι από προεπιλογή δημόσιες και πρέπει να αντικατασταθούν από την κλάση που εφαρμόζει μια διεπαφή.
Έτσι η διεπαφή ήταν κυρίως ένα συμβόλαιο και ασχολήθηκε μόνο με σταθερές (στατικές και τελικές) και αφηρημένες μεθόδους.
=> Ρίξτε μια ματιά στον Οδηγό για αρχάριους Java εδώ.
Τι θα μάθετε:
- Αλλαγές διεπαφών στην Java 8
- Λειτουργικές διεπαφές Java 8
- Διεπαφή κλάσης Vs στην Java
- Η Java επεκτείνει τις εφαρμογές Vs
- Interface Vs Abstract Class In Java
- συμπέρασμα
Αλλαγές διεπαφών στην Java 8
Η έκδοση Java 8 εισάγει ή μας επιτρέπει να έχουμε στατικές και προεπιλεγμένες μεθόδους στις διεπαφές. Χρησιμοποιώντας προεπιλεγμένες μεθόδους σε μια διεπαφή, οι προγραμματιστές μπορούν να προσθέσουν περισσότερες μεθόδους στις διεπαφές. Με αυτόν τον τρόπο δεν ενοχλούν ούτε αλλάζουν τις κλάσεις που εφαρμόζουν τη διεπαφή.
Το Java 8 επιτρέπει επίσης στη διεπαφή να έχει στατική μέθοδο. Οι στατικές μέθοδοι είναι ίδιες με αυτές που ορίζουμε στις τάξεις. Σημειώστε ότι η στατική μέθοδος δεν μπορεί να παρακαμφθεί από την κλάση που εφαρμόζει τη διεπαφή.
Η εισαγωγή στατικών και προεπιλεγμένων μεθόδων στη διεπαφή διευκόλυνε την αλλαγή των διεπαφών χωρίς προβλήματα και επίσης έκανε τις διεπαφές ευκολότερες στην εφαρμογή.
Το Java 8 εισάγει επίσης το 'Lambda Expressions' μέσα σε λειτουργικές διεπαφές. Εκτός αυτού, από την Java 8 και μετά υπάρχουν περισσότερες ενσωματωμένες λειτουργικές διεπαφές που προστίθενται στην Java.
Σε αυτό το σεμινάριο, θα συζητήσουμε όλες αυτές τις προσθήκες στις διεπαφές στο Java 8 και θα συζητήσουμε επίσης μερικές από τις διαφορές μεταξύ διαφόρων εννοιών Java όπως αφηρημένες τάξεις, επεκτείνει λέξεις-κλειδιά κ.λπ. με τις διεπαφές.
Στατική μέθοδος στη διεπαφή στην Java
Οι διεπαφές μπορούν επίσης να έχουν μεθόδους που μπορούν να έχουν ορισμούς. Αυτές είναι οι στατικές μέθοδοι στη διεπαφή. Οι στατικές μέθοδοι ορίζονται μέσα στη διεπαφή και δεν μπορούν να παρακαμφθούν ή να αλλάξουν από τις κλάσεις που εφαρμόζουν αυτήν τη διεπαφή.
Μπορούμε να καλέσουμε αυτές τις στατικές μεθόδους χρησιμοποιώντας απευθείας το όνομα της διεπαφής.
Το ακόλουθο παράδειγμα δείχνει τη χρήση της στατικής μεθόδου.
//interface declaration interface TestInterface { // static method definition static void static_print() { System.out.println('TestInterface::static_print ()'); } // abstract method declaration void nonStaticMethod(String str); } // Interface implementation class TestClass implements TestInterface { // Override interface method @Override public void nonStaticMethod(String str) { System.out.println(str); } } public class Main{ public static void main(String() args) { TestClass classDemo = new TestClass(); // Call static method from interface TestInterface.static_print(); // Call overridden method using class object classDemo.nonStaticMethod('TestClass::nonStaticMethod ()'); } }
Παραγωγή:
Το παραπάνω πρόγραμμα διαθέτει TestInterface. Έχει μια στατική μέθοδο που ονομάζεται «static_print» και επίσης μια μη στατική μέθοδο που ονομάζεται nonstaticm Method.
Έχουμε εφαρμόσει το TestInterface στο TestClass και παρακάμψαμε τη μέθοδο NonStaticMethod. Στη συνέχεια, στην κύρια μέθοδο, καλούμε τη μέθοδο static_print απευθείας χρησιμοποιώντας το TestInterface και nonStaticMethod χρησιμοποιώντας το αντικείμενο του TestClass.
Προεπιλεγμένη μέθοδος διασύνδεσης
Όπως ήδη αναφέρθηκε, οι διεπαφές πριν από την Java 8 επέτρεπαν μόνο αφηρημένες μεθόδους. Τότε θα παρέχουμε αυτήν την μέθοδο εφαρμογής σε ξεχωριστή τάξη. Εάν έπρεπε να προσθέσουμε μια νέα μέθοδο στη διεπαφή, τότε πρέπει να παρέχουμε τον κώδικα εφαρμογής της στην ίδια τάξη.
Επομένως, εάν αλλάξαμε τη διεπαφή προσθέτοντας μια μέθοδο σε αυτήν, η κλάση εφαρμογής θα άλλαζε επίσης.
Αυτός ο περιορισμός ξεπεράστηκε από την έκδοση Java 8 που επέτρεψε στις διεπαφές να έχουν προεπιλεγμένες μεθόδους. Οι προεπιλεγμένες μέθοδοι παρέχουν κατά κάποιο τρόπο συμβατότητα με τις υπάρχουσες διεπαφές και δεν χρειάζεται να αλλάξουμε την κλάση εφαρμογής. Οι προεπιλεγμένες μέθοδοι είναι επίσης γνωστές ως «μέθοδος εικονικής επέκτασης» ή «μέθοδοι υπερασπιστή».
Οι προεπιλεγμένες μέθοδοι δηλώνονται χρησιμοποιώντας τη λέξη-κλειδί «προεπιλογή» στη δήλωση. Η δήλωση ακολουθείται από τον ορισμό της μεθόδου. Μπορούμε να παρακάμψουμε την προεπιλεγμένη μέθοδο καθώς είναι διαθέσιμη στην κλάση που εφαρμόζει τη διεπαφή.
Με τον ίδιο τρόπο, μπορούμε να το καλέσουμε χρησιμοποιώντας το αντικείμενο κλάσης εφαρμογής απευθείας από τη διεπαφή χωρίς να το παρακάμψουμε.
interface TestInterface { // abstract method public void cubeNumber(int num); // default method default void print() { System.out.println('TestInterface :: Default method'); } } class TestClass implements TestInterface { // override cubeNumber method public void cubeNumber(int num) { System.out.println('Cube of given number ' + num+ ':' + num*num*num); } } class Main{ public static void main(String args()) { TestClass obj = new TestClass(); obj.cubeNumber(5); // call default method print using class object obj.print(); } }
Παραγωγή:
δωρεάν λογισμικό δημιουργίας αντιγράφων ασφαλείας υπολογιστή σε εξωτερικό σκληρό δίσκο
Το παραπάνω πρόγραμμα Java δείχνει την προεπιλεγμένη μέθοδο στη διεπαφή. Στην κύρια μέθοδο, σημειώστε ότι μπορούμε να καλέσουμε την προεπιλεγμένη μέθοδο της διεπαφής χρησιμοποιώντας το αντικείμενο κλάσης. Αυτό συμβαίνει επειδή καθώς η κλάση εφαρμόζει τη διεπαφή, η προεπιλεγμένη μέθοδος είναι διαθέσιμη και για την τάξη.
Σημείωση: Θα μπορούσαμε να παρακάμψουμε τη μέθοδο εκτύπωσης () και στην κατηγορία εφαρμογής. Σημειώστε ότι εάν παρακαμφθεί, τότε ο τροποποιητής πρόσβασης της προεπιλεγμένης μεθόδου θα αλλάξει σε δημόσιο στην κλάση εφαρμογής.
Προεπιλεγμένες μέθοδοι και πολλαπλή κληρονομικότητα
Μπορεί να προκύψει μια κατάσταση σε περίπτωση πολλαπλών διεπαφών όπου κάθε διεπαφή μπορεί να έχει μια προεπιλεγμένη μέθοδο με το ίδιο πρωτότυπο. Σε μια τέτοια περίπτωση, ο μεταγλωττιστής δεν γνωρίζει ποια μέθοδο θα επικαλεσθεί.
Όταν προκύπτει αυτή η κατάσταση στην οποία η προεπιλεγμένη μέθοδος έχει το ίδιο πρωτότυπο σε όλες τις διεπαφές, τότε η λύση είναι να παρακάμψετε τη μέθοδο στην κλάση υλοποίησης, έτσι ώστε όταν το αντικείμενο κλάσης υλοποίησης καλεί την προεπιλεγμένη μέθοδο, ο μεταγλωττιστής επικαλείται τη μέθοδο που εφαρμόζεται στην κλάση .
Το ακόλουθο πρόγραμμα Java δείχνει τη χρήση της προεπιλεγμένης μεθόδου με πολλές διεπαφές.
//Interface_One interface Interface_One{ //defaultMethod default void defaultMethod(){ System.out.println('Interface_One::defaultMethod'); } } //Interface_Two interface Interface_Two{ //defaultMethod default void defaultMethod(){ System.out.println('Interface_Two::defaultMethod'); } } class TestExample implements Interface_One, Interface_Two{ public void disp(String str){ System.out.println('String is: '+str); } //override defaultMethod to take care of the ambiguity public void defaultMethod(){ System.out.println('TestExample::defaultMethod'); } } class Main{ public static void main(String() args) { TestExample obj = new TestExample(); //call the default method obj.defaultMethod(); } }
Παραγωγή:
Στο παραπάνω πρόγραμμα, έχουμε αντικαταστήσει την προεπιλεγμένη μέθοδο (η οποία έχει το ίδιο πρωτότυπο και στις δύο διεπαφές) στην κλάση υλοποίησης. Με αυτόν τον τρόπο όταν καλούμε την προεπιλεγμένη μέθοδο από την κύρια μέθοδο χρησιμοποιώντας το αντικείμενο της κλάσης υλοποίησης, γίνεται επίκληση της μεθόδου που παρακάμπτεται.
Λειτουργικές διεπαφές Java 8
Μια λειτουργική διεπαφή είναι μια διεπαφή που έχει μόνο μία αφηρημένη μέθοδο. Μπορεί να περιέχει οποιονδήποτε αριθμό προεπιλεγμένων και στατικών μεθόδων, αλλά η αφηρημένη μέθοδος που περιέχει είναι ακριβώς μία. Επιπλέον, μια λειτουργική διεπαφή μπορεί να έχει δηλώσεις μεθόδων κατηγορίας αντικειμένων.
Η λειτουργική διεπαφή είναι γνωστή ως « Διασύνδεση μεμονωμένης αφηρημένης μεθόδου ' ή ' Διεπαφή SAM '. Η διεπαφή SAM είναι μια νέα δυνατότητα στην Java.
Σε ένα πρόγραμμα Java, η παρουσία μιας λειτουργικής διεπαφής υποδεικνύεται χρησιμοποιώντας ένα @FunctionalInterface σχόλιο. Όταν ο μεταγλωττιστής συναντά αυτόν τον σχολιασμό, τότε γνωρίζει ότι η διεπαφή που ακολουθεί αυτόν τον σχολιασμό είναι λειτουργική. Επομένως, εάν περιέχει περισσότερες από μία αφηρημένες μεθόδους, τότε αναβοσβήνει ένα σφάλμα.
Ο σχολιασμός @FunctionalInterface Ωστόσο, δεν είναι υποχρεωτικό στην Java.
Το παρακάτω πρόγραμμα δείχνει τη λειτουργική διεπαφή σε Java:
//declare a functional interface @FunctionalInterface //annotation indicates it’s a functional interface interface function_Interface{ void disp_msg(String msg); // abstract method // Object class methods. int hashCode(); String toString(); boolean equals(Object obj); } //implementation of Functional Interface class FunctionalInterfaceExample implements function_Interface{ public void disp_msg(String msg){ System.out.println(msg); } } class Main{ public static void main(String() args) { //create object of implementation class and call method FunctionalInterfaceExample finte = new FunctionalInterfaceExample(); finte.disp_msg('Hello, World!!!'); } }
Παραγωγή:
Η λειτουργική διεπαφή στο παραπάνω πρόγραμμα έχει μια μοναδική αφηρημένη μέθοδο και έχει επίσης μια δήλωση μεθόδου κλάσης αντικειμένων όπως hashCode, toString και ισούται με. Στην κλάση που εφαρμόζει αυτήν τη διεπαφή, η αφηρημένη μέθοδος παρακάμπτεται. Στην κύρια μέθοδο, δημιουργούμε ένα αντικείμενο κλάσης εφαρμογής και χρησιμοποιούμε τη μέθοδο.
Διεπαφές όπως το Runnable και το Comparable είναι παραδείγματα λειτουργικών διεπαφών που παρέχονται στην Java. Η Java 8 μας επιτρέπει να αντιστοιχίσουμε εκφράσεις λάμδα στο αντικείμενο λειτουργικής διεπαφής.
Το παρακάτω παράδειγμα προγράμματος το αποδεικνύει.
class Main{ public static void main(String args()) { // use lambda expression to create the object new Thread(()-> {System.out.println('New thread created with functional interface');}).start(); } }
Παραγωγή:
Το Java 8 παρέχει επίσης πολλές ενσωματωμένες λειτουργικές διεπαφές στο πακέτο java.util.function.
Αυτές οι ενσωματωμένες διεπαφές περιγράφονται παρακάτω:
# 1) Βραβείο
Αυτή είναι μια λειτουργική διεπαφή στην Java που έχει ένα μόνο τεστ αφηρημένης μεθόδου. Η μέθοδος «test» επιστρέφει τη δυαδική τιμή αφού δοκιμάσει το καθορισμένο όρισμα.
Δίνεται παρακάτω το πρωτότυπο για τη μέθοδο δοκιμής της διεπαφής Predicate.
public interface Predicate { public boolean test(T t); }
# 2) BinaryOperator
Η διεπαφή BinaryOperator παρέχει μια αφηρημένη μέθοδο «εφαρμογή» που αποδέχεται δύο ορίσματα και επιστρέφει μια προκύπτουσα τιμή του ίδιου τύπου με τα ορίσματα.
Το πρωτότυπο για τη μέθοδο αποδοχής είναι:
public interface BinaryOperator { public T apply (T x, T y); }
# 3) Λειτουργία
Η διασύνδεση λειτουργίας είναι μια λειτουργική διεπαφή που έχει επίσης μια αφηρημένη μέθοδο που ονομάζεται «ισχύει». Αυτή η μέθοδος εφαρμογής, ωστόσο, παίρνει ένα μόνο όρισμα του τύπου Τ και επιστρέφει μια τιμή του τύπου R.
Το πρωτότυπο της μεθόδου εφαρμογής έχει ως εξής:
public interface Function { public R apply(T t); }
Το ακόλουθο πρόγραμμα Java δείχνει το παραπάνω ενσωματωμένο Predicate Functional Interface.
import java.util.*; import java.util.function.Predicate; class Main { public static void main(String args()) { // create a list of strings List names = Arrays.asList('Karen','Mia','Sydney','Lacey','Megan'); // declare string type predicate and use lambda expression to create object Predicate p = (s)->s.startsWith('M'); System.out.println('Names starting with M:'); // Iterate through the list for (String st:names) { // test each entry with predicate if (p.test(st)) System.out.println(st); } } }
Παραγωγή:
Όπως μπορούμε να δούμε στο παραπάνω πρόγραμμα έχουμε μια λίστα με χορδές. Χρησιμοποιώντας τη λειτουργική διεπαφή Predicate, δοκιμάζουμε εάν το στοιχείο στη συμβολοσειρά ξεκινά με M και αν το κάνει, τότε εκτυπώνει το όνομα.
αφαίρεση στοιχείων από έναν πίνακα java
Διεπαφή κλάσης Vs στην Java
Αν και η κλάση και η διεπαφή είναι παρόμοια καθώς έχουν παρόμοια σύνταξη, αυτές οι δύο οντότητες έχουν περισσότερες διαφορές από τις ομοιότητες.
Ας απαριθμήσουμε μερικές από τις διαφορές μεταξύ κλάσης και διεπαφής στην Java.
Τάξη | Διεπαφή |
---|---|
Μπορούμε να δημιουργήσουμε και να δημιουργήσουμε αντικείμενα από μια τάξη. | Δεν είναι δυνατή η δημιουργία διεπαφής. |
Η λέξη-κλειδί «class» χρησιμοποιείται για τη δημιουργία τάξης. | Η διεπαφή δημιουργείται χρησιμοποιώντας τη λέξη-κλειδί «διεπαφή». |
Τα μαθήματα δεν υποστηρίζουν πολλαπλή κληρονομιά στην Java. | Οι διεπαφές υποστηρίζουν πολλαπλή κληρονομιά στην Java. |
Η τάξη περιέχει τους κατασκευαστές. | Οι διεπαφές δεν περιέχουν κατασκευαστές. |
Η τάξη δεν μπορεί να περιέχει αφηρημένες μεθόδους. | Οι διεπαφές περιέχουν μόνο αφηρημένες μεθόδους. |
Η τάξη μπορεί να έχει μεταβλητές και μεθόδους που είναι προεπιλεγμένες, δημόσιες, ιδιωτικές ή προστατευμένες. | Η διεπαφή έχει μόνο δημόσιες μεταβλητές και μεθόδους από προεπιλογή. |
Δεν είναι υποχρεωτικό να συνδέσετε τροποποιητές χωρίς πρόσβαση με μεταβλητές της κλάσης. | Οι διεπαφές μπορούν να έχουν μεταβλητές που είναι είτε στατικές είτε τελικές. |
Μπορούμε να κληρονομήσουμε μια άλλη τάξη από μια τάξη. | Δεν μπορούμε να κληρονομήσουμε μια τάξη από τη διεπαφή. |
Η τάξη μπορεί να κληρονομηθεί χρησιμοποιώντας τη λέξη-κλειδί «επεκτείνεται». | Η διεπαφή μπορεί να εφαρμοστεί από άλλη τάξη χρησιμοποιώντας τη λέξη-κλειδί «υλοποιεί». Μπορεί να κληρονομηθεί από άλλη διεπαφή χρησιμοποιώντας τη λέξη-κλειδί «επεκτείνεται». |
Η Java επεκτείνει τις εφαρμογές Vs
«Επεκτείνεται» | «Εργαλεία» |
---|---|
Οι διεπαφές υποστηρίζουν μόνο στατικούς και τελικούς τροποποιητές χωρίς πρόσβαση. | Το Abstract υποστηρίζει όλους τους τροποποιητές χωρίς πρόσβαση, όπως στατικός, τελικός, μη στατικός και μη οριστικός. |
Μια τάξη χρησιμοποιεί τη λέξη-κλειδί «επεκτείνεται» για να κληρονομήσει από άλλη τάξη. | Η λέξη-κλειδί «υλοποιεί» χρησιμοποιείται από μια τάξη για την εφαρμογή μιας διεπαφής. |
Μια τάξη που κληρονομεί μια άλλη τάξη μπορεί ή όχι να παρακάμψει όλες τις μεθόδους της μητρικής τάξης. | Η τάξη που εφαρμόζει τη διεπαφή πρέπει να παρακάμψει όλες τις αφηρημένες μεθόδους της διεπαφής. |
Μπορούμε να επεκτείνουμε μόνο μία τάξη τη φορά χρησιμοποιώντας τη λέξη-κλειδί επεκτάσεων. | Μπορούμε να εφαρμόσουμε πολλές διεπαφές χρησιμοποιώντας τη λέξη-κλειδί «υλοποιεί». |
Μια διεπαφή μπορεί να επεκτείνει μια άλλη διεπαφή χρησιμοποιώντας τη λέξη-κλειδί «επεκτείνει». | Μια διεπαφή δεν μπορεί να εφαρμόσει άλλη διεπαφή χρησιμοποιώντας λέξεις-κλειδιά «υλοποιεί». |
Μπορεί αφηρημένη κλάση να εφαρμόσει διεπαφή στην Java
Ναι, μια αφηρημένη τάξη μπορεί να εφαρμόσει μια διεπαφή χρησιμοποιώντας τη λέξη-κλειδί «υλοποιεί». Η αφηρημένη τάξη δεν χρειάζεται να εφαρμόσει όλες τις αφηρημένες μεθόδους διεπαφής. Αλλά γενικά είναι μια καλή πρακτική σχεδιασμού να υπάρχει μια διεπαφή με όλες τις αφηρημένες μεθόδους, μετά μια αφηρημένη τάξη που εφαρμόζει αυτήν τη διεπαφή και μετά τις συγκεκριμένες κατηγορίες.
Δίνεται παρακάτω είναι ένα παράδειγμα μιας τέτοιας εφαρμογής στην Java.
Εδώ το java.util.List είναι μια διεπαφή. Αυτή η διεπαφή υλοποιείται από το java.util.AbstractList. Στη συνέχεια, αυτή η κλάση AbstractList επεκτείνεται με δύο συγκεκριμένες κατηγορίες, δηλαδή LinkedList και ArrayList.
Εάν οι τάξεις LinkedList και ArrayList είχαν εφαρμόσει απευθείας τη διεπαφή λίστας, τότε θα έπρεπε να εφαρμόσουν όλες τις αφηρημένες μεθόδους της διεπαφής λίστας.
Αλλά σε αυτήν την περίπτωση, η κλάση AbstractList εφαρμόζει τις μεθόδους της διασύνδεσης λίστας και τις μεταφέρει σε LinkedList και ArrayList. Εδώ λοιπόν έχουμε το πλεονέκτημα να δηλώνουμε τον τύπο από τη διεπαφή και την αφηρημένη ευελιξία της τάξης της εφαρμογής της κοινής συμπεριφοράς.
Πότε να χρησιμοποιήσετε αφηρημένη κλάση και διεπαφή στην Java
Χρησιμοποιούμε κυρίως μια αφηρημένη τάξη για να ορίσουμε μια προεπιλεγμένη ή κοινή συμπεριφορά των θυγατρικών τάξεων που θα επεκταθούν από αυτήν την αφηρημένη τάξη. Μια διεπαφή χρησιμοποιείται για τον καθορισμό μιας σύμβασης μεταξύ δύο συστημάτων που αλληλεπιδρούν σε μια εφαρμογή.
Ορισμένες συγκεκριμένες καταστάσεις είναι ιδανικές για διασυνδέσεις που θα χρησιμοποιηθούν και ορισμένα προβλήματα που μπορούν να επιλυθούν μόνο με χρήση αφηρημένων κλάσεων. Σε αυτήν την ενότητα, θα συζητήσουμε πότε μπορούμε να χρησιμοποιήσουμε τη διεπαφή και πότε μπορούμε να χρησιμοποιήσουμε αφηρημένες τάξεις.
Πότε να χρησιμοποιήσετε μια διεπαφή:
- Οι διεπαφές χρησιμοποιούνται κυρίως όταν έχουμε μια μικρή συνοπτική λειτουργικότητα για εφαρμογή.
- Όταν εφαρμόζουμε API και γνωρίζουμε ότι δεν θα αλλάξουν για λίγο, τότε εκείνη τη στιγμή πηγαίνουμε για διεπαφές.
- Οι διεπαφές μας επιτρέπουν να εφαρμόσουμε πολλαπλή κληρονομιά. Επομένως, όταν πρέπει να εφαρμόσουμε πολλαπλή κληρονομιά στην εφαρμογή μας, αναζητούμε διεπαφές.
- Όταν έχουμε ένα ευρύ φάσμα αντικειμένων, και πάλι οι διεπαφές είναι μια καλύτερη επιλογή.
- Επίσης, όταν πρέπει να παρέχουμε μια κοινή λειτουργικότητα σε πολλές άσχετες τάξεις, χρησιμοποιούνται ακόμα διεπαφές.
Πότε να χρησιμοποιήσετε μια αφηρημένη τάξη:
- Οι αφηρημένες τάξεις χρησιμοποιούνται κυρίως όταν πρέπει να χρησιμοποιήσουμε την κληρονομιά στην εφαρμογή μας.
- Καθώς οι διεπαφές ασχολούνται με δημόσιες μεθόδους και μεταβλητές, όποτε θέλουμε να χρησιμοποιήσουμε τροποποιητές πρόσβασης εκτός του κοινού στο πρόγραμμά μας, χρησιμοποιούμε αφηρημένες τάξεις.
- Εάν πρέπει να προστεθούν νέες μέθοδοι, τότε είναι καλύτερο να το κάνετε σε μια αφηρημένη τάξη παρά στη διεπαφή. Επειδή εάν προσθέσουμε μια νέα μέθοδο στη διεπαφή, ολόκληρη η εφαρμογή αλλάζει καθώς οι διεπαφές έχουν μόνο πρωτότυπα μεθόδων και η εφαρμογή κλάσης χρησιμοποιώντας τη διεπαφή θα παρέχει την υλοποίηση.
- Εάν θέλουμε να αναπτυχθούν διαφορετικές εκδόσεις των στοιχείων, τότε πηγαίνουμε για αφηρημένη τάξη. Μπορούμε να αλλάξουμε τις αφηρημένες τάξεις πιο εύκολα. Αλλά οι διεπαφές δεν μπορούν να αλλάξουν. Αν θέλουμε μια νέα έκδοση, τότε πρέπει να γράψουμε ξανά ολόκληρη τη διεπαφή.
- Όταν θέλουμε να παρέχουμε μια κοινή εφαρμογή για όλα τα στοιχεία, τότε η αφηρημένη τάξη είναι η καλύτερη επιλογή.
Interface Vs Abstract Class In Java
Παρακάτω αναφέρονται μερικές από τις διαφορές μεταξύ των κλάσεων Interfaces και Abstract στην Java.
Διεπαφή | Περίληψη τάξη |
---|---|
Μια διεπαφή δηλώνεται χρησιμοποιώντας τη λέξη-κλειδί «διεπαφή». | Μια αφηρημένη τάξη δηλώνεται χρησιμοποιώντας τη λέξη-κλειδί «αφηρημένη». |
Η διεπαφή μπορεί να εφαρμοστεί χρησιμοποιώντας τη λέξη-κλειδί «υλοποιεί». | Η περίληψη μπορεί να κληρονομηθεί χρησιμοποιώντας τη λέξη-κλειδί «επεκτείνεται». |
Μια διεπαφή δεν μπορεί να επεκτείνει μια κλάση ή να εφαρμόσει μια διεπαφή, μπορεί να επεκτείνει μόνο μια άλλη διεπαφή. | Μια αφηρημένη κλάση μπορεί να επεκτείνει μια κλάση ή να εφαρμόσει πολλαπλές διεπαφές. |
Τα μέλη διεπαφής μπορούν να είναι δημόσια μόνο. | Τα αφηρημένα μέλη της τάξης μπορούν να είναι δημόσια, ιδιωτικά ή προστατευόμενα. |
Μια διεπαφή δεν μπορεί να χρησιμοποιηθεί για την παροχή μιας εφαρμογής. Μπορεί να χρησιμοποιηθεί μόνο ως δήλωση. | Μια αφηρημένη κλάση μπορεί να χρησιμοποιηθεί για την εφαρμογή της διεπαφής. |
Πολλαπλή κληρονομιά μπορεί να επιτευχθεί χρησιμοποιώντας διεπαφές. | Η αφηρημένη τάξη δεν υποστηρίζει πολλαπλή κληρονομιά. |
Οι διεπαφές μπορούν να έχουν μόνο αφηρημένες μεθόδους. Από το Java 8, μπορεί να έχει στατικές και προεπιλεγμένες μεθόδους. | Μια αφηρημένη τάξη μπορεί να έχει μια αφηρημένη ή μη αφηρημένη μέθοδο. |
Κληρονομικότητα στην Ιάβα
Συζητήσαμε τύπους δεδομένων enum στη συζήτησή μας για τύπους δεδομένων στην Java. Όλα τα ποσά εκτείνονται από την κλάση java.lang.Enum. Αυτή η τάξη java.lang.Enum είναι μια αφηρημένη τάξη.
Επίσης, όλες οι τάξεις enum στην Java είναι «τελικές» από προεπιλογή. Επομένως, μια προσπάθεια κληρονομιάς μιας κλάσης από οποιεσδήποτε κλάσεις enum οδηγεί σε σφάλμα μεταγλωττιστή.
Καθώς η Java δεν επιτρέπει πολλαπλή κληρονομιά, δεν μπορούμε να κληρονομήσουμε την κλάση enum από οποιαδήποτε άλλη τάξη, καθώς η κλάση enum ήδη κληρονομεί από το java.lang.Enum Ωστόσο, οι κλάσεις enum μπορούν να εφαρμόσουν διεπαφές στην Java και αυτό ονομάζεται κληρονομιά Enum στην Java.
Δίνεται παρακάτω ένα παράδειγμα Enum Inheritance στην Java.
//WeekDays interface declaration interface WeekDays { public void displaydays(); } //enum class implementing WeekDays interface enum Days implements WeekDays { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY,FRIDAY, SATURDAY; public void displaydays() { //Override displaydays method System.out.println('The day of the week: ' + this); } } class Main { public static void main(String() args) { Days.MONDAY.displaydays(); //access enum value } }
Παραγωγή:
Εδώ έχουμε μια διεπαφή WeekDays με μια πρωτότυπη μέθοδο πρωτότυπου displaydays (). Στη συνέχεια, ορίζουμε ένα enum class Days που εφαρμόζει τη διεπαφή WeekDays. Εδώ καθορίζουμε τις τιμές enum από ΚΥΡΙΑΚΗ έως ΣΑΒΒΑΤΟ και επίσης παρακάμπτουμε τη μέθοδο εμφάνισης.
Τέλος, στην κύρια μέθοδο, έχουμε πρόσβαση στην τιμή enum και την εμφανίζουμε.
Συχνές Ερωτήσεις
Ε # 1) Τι θα συμβεί εάν δώσετε ένα σώμα μεθόδου στη διεπαφή;
Απάντηση: Για εκδόσεις Java πριν από το Java 8, το σώμα της μεθόδου δεν επιτρέπεται στη διεπαφή. Αλλά από το Java 8, μπορούμε είτε να ορίσουμε μια προεπιλεγμένη είτε στατική μεθόδους μέσα στη διεπαφή.
Ε # 2) Μπορεί μια διεπαφή να έχει μεταβλητές στο Java 8;
Απάντηση: Μπορούμε να έχουμε σταθερές μεταβλητές στο Java 8 χρησιμοποιώντας στατικούς και τελικούς τροποποιητές. Αλλά δεν μπορούμε να έχουμε μεταβλητές παρουσίας σε διεπαφές Java. Οποιαδήποτε προσπάθεια δήλωσης μεταβλητών παρουσίας σε διεπαφή θα έχει ως αποτέλεσμα σφάλμα μεταγλωττιστή.
Q # 3) Ποιες είναι οι βελτιώσεις στις διεπαφές στο Java 8;
Απάντηση: Η πιο σημαντική βελτίωση για διεπαφές στο Java 8 είναι ότι επιτρέπονται στατικές και προεπιλεγμένες μέθοδοι στις διεπαφές. Μπορούμε να έχουμε μεθόδους που δηλώνονται ως στατικές ή προεπιλεγμένες και να τις ορίσουμε μέσα στη διεπαφή.
Q # 4) Μπορούμε να παρακάμψουμε την προεπιλεγμένη μέθοδο στη διεπαφή Java;
Απάντηση: Όχι. Δεν είναι υποχρεωτικό να παρακάμψετε την προεπιλεγμένη μέθοδο στη διεπαφή. Αυτό συμβαίνει επειδή όταν εφαρμόζουμε μια διεπαφή σε μια κλάση, τότε η προεπιλεγμένη μέθοδος της κλάσης είναι προσβάσιμη στην κλάση υλοποίησης. Ως εκ τούτου, χρησιμοποιώντας το αντικείμενο της κλάσης εφαρμογής, μπορούμε να έχουμε πρόσβαση στην προεπιλεγμένη μέθοδο της διεπαφής.
Ε # 5) Μπορούν οι διεπαφές να έχουν πεδία στην Java;
δοκιμή μονάδας έναντι δοκιμής ολοκλήρωσης έναντι δοκιμής λειτουργίας
Απάντηση: Ναι, μπορούμε να έχουμε πεδία ή μεταβλητές σε διεπαφές στην Java, αλλά από προεπιλογή, όλα αυτά τα πεδία είναι στατικά, τελικά και δημόσια.
συμπέρασμα
Σε αυτό το σεμινάριο, έχουμε συζητήσει τις αλλαγές που έγιναν στις διεπαφές στο Java 8. Η Java 8 εισήγαγε στατικές και προεπιλεγμένες μεθόδους στις διεπαφές. Νωρίτερα θα μπορούσαμε να έχουμε μόνο αφηρημένες μεθόδους στη διεπαφή. Αλλά από την Java 8 και μετά, μπορούμε να ορίσουμε προεπιλεγμένες και στατικές μεθόδους στην Java.
Επίσης, το Java 8 επιτρέπει τη χρήση εκφράσεων λάμδα με τις λειτουργικές διεπαφές στην Java. Στη συνέχεια, συζητήσαμε επίσης αφηρημένες τάξεις και διεπαφές και είδαμε πότε να χρησιμοποιήσουμε καθεμία από αυτές στην Java. Έχουμε επίσης δει την κληρονομιά enum στην Ιάβα.
Συζητήσαμε επίσης μερικές από τις διαφορές μεταξύ επεκτάσεων και εφαρμογών, κλάσης και διεπαφής, αφηρημένης κλάσης και διεπαφής κ.λπ.
=> Ελέγξτε ΟΛΑ τα Εκπαιδευτικά Java εδώ.
Συνιστώμενη ανάγνωση
- Java Interface και Abstract Class Tutorial με παραδείγματα
- Συγκρίσιμες και συγκριτικές διεπαφές στην Java
- Διασύνδεση ListIterator σε Java με παραδείγματα
- Ορισμός διεπαφής σε Java: Java Set Tutorial με παραδείγματα
- Διασύνδεση σήμανσης σε Java: Σειριακό και κλωνοποιήσιμο
- Java String length () Μέθοδος με παραδείγματα
- Ανάπτυξη Java: Δημιουργία και εκτέλεση αρχείου Java JAR
- Πώς να χρησιμοποιήσετε τη μέθοδο Java toString;