- Interfejs
- Przykład interfejsu
- Dziedziczenie wielokrotne przez interfejs
- Dlaczego wielokrotne dziedziczenie jest obsługiwane w interfejsie, podczas gdy nie jest obsługiwane w przypadku klasy.
- Interfejs znacznika
- Zagnieżdżony interfejs
Jakiś interfejs w Javie jest planem klasy. Ma stałe statyczne i metody abstrakcyjne.
Interfejs w Javie jest mechanizm do osiągnięcia abstrakcja . W interfejsie Java mogą znajdować się tylko metody abstrakcyjne, a nie treść metody. Służy do osiągnięcia abstrakcji i wielokrotności dziedziczenie w Javie .
Innymi słowy, można powiedzieć, że interfejsy mogą mieć abstrakcyjne metody i zmienne. Nie może mieć treści metody.
Interfejs Java również reprezentuje relację IS-A .
Nie można jej utworzyć instancji tak jak klasy abstrakcyjnej.
Od wersji Java 8 możemy mieć metody domyślne i statyczne w interfejsie.
Od wersji Java 9 możemy mieć metody prywatne w interfejsie.
Dlaczego warto używać interfejsu Java?
Istnieją trzy główne powody, dla których warto używać interfejsu. Poniżej podano je.
- Służy do osiągnięcia abstrakcji.
- Dzięki interfejsowi możemy wspierać funkcjonalność wielokrotnego dziedziczenia.
- Można go zastosować w celu uzyskania luźnego połączenia.
Jak zadeklarować interfejs?
Interfejs jest deklarowany przy użyciu słowa kluczowego interfejs. Zapewnia całkowitą abstrakcję; oznacza, że wszystkie metody w interfejsie są zadeklarowane z pustą treścią, a wszystkie pola są domyślnie publiczne, statyczne i końcowe. Klasa implementująca interfejs musi implementować wszystkie metody zadeklarowane w interfejsie.
Składnia:
interface { // declare constant fields // declare methods that abstract // by default. }
Ulepszenie interfejsu Java 8
Od Java 8 , interfejs może mieć metody domyślne i statyczne, co zostanie omówione później.
jak przekonwertować z string na int
Wewnętrzne dodanie przez kompilator
Kompilator Java dodaje publiczne i abstrakcyjne słowa kluczowe przed metodą interfejsu. Co więcej, przed elementami danych dodaje publiczne, statyczne i końcowe słowa kluczowe.
Innymi słowy, pola interfejsu są domyślnie publiczne, statyczne i ostateczne, a metody są publiczne i abstrakcyjne.
Relacje pomiędzy klasami i interfejsami
Jak pokazano na poniższym rysunku, klasa rozszerza inną klasę, interfejs rozszerza inny interfejs, ale a klasa implementuje interfejs .
Przykład interfejsu Java
W tym przykładzie interfejs Printable posiada tylko jedną metodę, a jej implementacja jest zapewniona w klasie A6.
interface printable{ void print(); } class A6 implements printable{ public void print(){System.out.println('Hello');} public static void main(String args[]){ A6 obj = new A6(); obj.print(); } }Przetestuj teraz
Wyjście:
Hello
Przykład interfejsu Java: Możliwość rysowania
W tym przykładzie interfejs Drawable ma tylko jedną metodę. Jego implementację zapewniają klasy Rectangle i Circle. W rzeczywistym scenariuszu interfejs jest definiowany przez kogoś innego, ale jego implementację zapewniają różni dostawcy wdrożeń. Co więcej, jest używany przez kogoś innego. Część implementacyjna jest ukryta przez użytkownika korzystającego z interfejsu.
Plik: TestInterface1.java
//Interface declaration: by first user interface Drawable{ void draw(); } //Implementation: by second user class Rectangle implements Drawable{ public void draw(){System.out.println('drawing rectangle');} } class Circle implements Drawable{ public void draw(){System.out.println('drawing circle');} } //Using interface: by third user class TestInterface1{ public static void main(String args[]){ Drawable d=new Circle();//In real scenario, object is provided by method e.g. getDrawable() d.draw(); }}Przetestuj teraz
Wyjście:
drawing circle
Przykład interfejsu Java: Bank
Zobaczmy kolejny przykład interfejsu Java, który zapewnia implementację interfejsu Banku.
Plik: TestInterface2.java
interface Bank{ float rateOfInterest(); } class SBI implements Bank{ public float rateOfInterest(){return 9.15f;} } class PNB implements Bank{ public float rateOfInterest(){return 9.7f;} } class TestInterface2{ public static void main(String[] args){ Bank b=new SBI(); System.out.println('ROI: '+b.rateOfInterest()); }}Przetestuj teraz
Wyjście:
ROI: 9.15
Dziedziczenie wielokrotne w Javie według interfejsu
Jeśli klasa implementuje wiele interfejsów lub interfejs rozszerza wiele interfejsów, nazywa się to dziedziczeniem wielokrotnym.
interface Printable{ void print(); } interface Showable{ void show(); } class A7 implements Printable,Showable{ public void print(){System.out.println('Hello');} public void show(){System.out.println('Welcome');} public static void main(String args[]){ A7 obj = new A7(); obj.print(); obj.show(); } }Przetestuj teraz
Output:Hello Welcome
P) Dziedziczenie wielokrotne nie jest obsługiwane przez klasę w Javie, ale jest możliwe przez interfejs, dlaczego?
Jak wyjaśniliśmy w rozdziale dotyczącym dziedziczenia, dziedziczenie wielokrotne nie jest obsługiwane w przypadku klasa z powodu niejasności. Jest to jednak obsługiwane w przypadku interfejsu, ponieważ nie ma tu dwuznaczności. Dzieje się tak, ponieważ jego implementacja jest zapewniana przez klasę implementacji. Na przykład:
interface Printable{ void print(); } interface Showable{ void print(); } class TestInterface3 implements Printable, Showable{ public void print(){System.out.println('Hello');} public static void main(String args[]){ TestInterface3 obj = new TestInterface3(); obj.print(); } }Przetestuj teraz
Wyjście:
Hello
Jak widać na powyższym przykładzie, interfejs Printable i Showable mają te same metody, ale ich implementację zapewnia klasa TestTnterface1, więc nie ma tu żadnych dwuznaczności.
Dziedziczenie interfejsu
Klasa implementuje interfejs, ale jeden interfejs rozszerza inny interfejs.
interface Printable{ void print(); } interface Showable extends Printable{ void show(); } class TestInterface4 implements Showable{ public void print(){System.out.println('Hello');} public void show(){System.out.println('Welcome');} public static void main(String args[]){ TestInterface4 obj = new TestInterface4(); obj.print(); obj.show(); } }Przetestuj teraz
Wyjście:
Hello Welcome
Domyślna metoda Java 8 w interfejsie
Od wersji Java 8 możemy mieć treść metody w interfejsie. Ale musimy ustawić tę metodę domyślną. Zobaczmy przykład:
Plik: TestInterfaceDefault.java
interface Drawable{ void draw(); default void msg(){System.out.println('default method');} } class Rectangle implements Drawable{ public void draw(){System.out.println('drawing rectangle');} } class TestInterfaceDefault{ public static void main(String args[]){ Drawable d=new Rectangle(); d.draw(); d.msg(); }}Przetestuj teraz
Wyjście:
drawing rectangle default method
Metoda statyczna Java 8 w interfejsie
Od wersji Java 8 możemy mieć w interfejsie metodę statyczną. Zobaczmy przykład:
Plik: TestInterfaceStatic.java
interface Drawable{ void draw(); static int cube(int x){return x*x*x;} } class Rectangle implements Drawable{ public void draw(){System.out.println('drawing rectangle');} } class TestInterfaceStatic{ public static void main(String args[]){ Drawable d=new Rectangle(); d.draw(); System.out.println(Drawable.cube(3)); }}Przetestuj teraz
Wyjście:
drawing rectangle 27
P) Co to jest znacznik lub interfejs z tagami?
Interfejs, który nie ma elementu członkowskiego, nazywany jest na przykład znacznikiem lub interfejsem oznakowanym. Możliwość serializacji , Cloneable, Remote, itp. Służą do dostarczania pewnych niezbędnych informacji do JVM, dzięki czemu JVM może wykonać jakąś użyteczną operację.
//How Serializable interface is written? public interface Serializable{ }
Zagnieżdżony interfejs w Javie
Uwaga: Interfejs może mieć inny interfejs, zwany interfejsem zagnieżdżonym. Dowiemy się tego szczegółowo w zagnieżdżone klasy rozdział. Na przykład:
interface printable{ void print(); interface MessagePrintable{ void msg(); } }Więcej o interfejsie zagnieżdżonym