logo

Interfejs w Javie

  1. Interfejs
  2. Przykład interfejsu
  3. Dziedziczenie wielokrotne przez interfejs
  4. Dlaczego wielokrotne dziedziczenie jest obsługiwane w interfejsie, podczas gdy nie jest obsługiwane w przypadku klasy.
  5. Interfejs znacznika
  6. 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.
Dlaczego warto używać interfejsu Java

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.

interfejs w Javie

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 .

Relacja pomiędzy klasą i interfejsem

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.

wielokrotne dziedziczenie w Javie
 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