Когато някои говорят за Java OOP парадигмата на наследяването, те обикновено имат предвид разширяване на родителски клас с наследник, дъщерен клас. Когато обаче срещнете ключовата дума Java implements, това означава, че преминаваме към друго ниво на абстракция и започваме да работим с интерфейси в Java. Ще говорим Howво представляват интерфейсите, за Howво служат, How се осъществява внедряването.

Какво е интерфейс и реализация

Вероятно сте чували думата „интерфейс“ много пъти. Например, компютърът има интерфейс за въвеждане (мишка и клавиатура), много програми имат потребителски интерфейси. В най-широк смисъл интерфейсът е връзка между две взаимодействащи страни. Например същата клавиатура or дистанционно управление на телевизора. В програмирането, и в частност в Java, интерфейсът е специфичен договор, който казва Howво ще прави класът, който го внедрява. Интерфейсът определя само поведението. Не казва нищо за обекта, който ще го реализира. Можете да декларирате интерфейс в Java по следния начин:

public interface MyInterface  {

     // constants declaration 
     // methods without implementation
     // static methods
     // default methods (default)
     // private methods
}
Ето синтаксис на Implements в Java:

public class MyClass implements MyInterface{
//implementing the methods of MyInterface 
//Other code
} 
Интерфейсът описва поведението, без да го уточнява. Например, поведение като „движение“ може да се приложи към различни видове обекти: велосипед, човек, кола, вода в река и т.н. Поведението на плуване може да бъде поведението на патица, кораб or риба. Тези обекти нямат нищо общо, освен че могат да се движат or плуват. Да, и самото движение с плуване те са много различни. В Java обаче можете да създадете класове Duck , Boat , Fish и да им позволите да реализират способността да плуват. Тук се използва ключовата дума Java Implements .

Пример за прилагане на ключова дума


public interface Swimmable {
  
   void moveForward();
   void TurnRight();
   void TurnLeft();
  
}
Както можете да видите, самите методи не са внедрени. Но ние декларирахме, че класовете, които прилагат този интерфейс, трябва да могат да плуват по права линия, Howто и да завиват надясно и наляво. Нека създадем класове, които ще имплементират този интерфейс.

public class Duck implements Swimmable {
//implementing the methods
   public void moveForward() {
       System.out.println(" Quack, I am moving forward...");
   }

   public void TurnRight(){
       System.out.println("I am turning right...");
   }
   public void TurnLeft(){
       System.out.println("I am turning left...");

   }

   public void Stop() {
       System.out.println("Quack. I am relaxing on the surface of the water...");
   }

}

public class Fish implements Swimmable {

   public void moveForward() {
       System.out.println("I am moving forward...");
   }

   public void TurnRight(){
       System.out.println("I am turning right...");
   }
   public void TurnLeft() {
       System.out.println("I am turning left...");
   }

   public void turnUp(){
       System.out.println("I am turning up...");
   }

   public void turnDown(){
       System.out.println("I am turning down...");
   }

   public void Stop() {
       System.out.println("I am relaxing somewhere under the water surface...");
   }
}
Всички класове, които прилагат интерфейса Swimmable , според договора трябва да могат да плуват напред (имплементират метода moveForward() ), Howто и да завиват надясно и наляво. Прилагането на тези методи е необходимо. Патицата и рибата плуват по различен начин. Да кажем, че една риба има два допълнителни метода, които прилагат способността й да плува нагоре и надолу. Интерфейсът Swimmable няма това. Ако обаче създадем дъщерно дете от клас риба, например риба тон or сьомга, те, като всяка „риба“, ще могат да плуват нагоре и надолу.

Множество интерфейси в Java

Както вероятно вече знаете, Java не поддържа множествено наследяване. Това означава, че един клас може да бъде наследен само от един суперклас. Въпреки това по няHowъв начин все още можете да използвате „множествено наследяване“ в Java, защото един клас може да реализира множество интерфейси.

To implement multiple interfaces, use the next syntax: 
interface MyFirstInterface {
   public void myMethod();
}
interface MySecondInterface {
   public void myOtherMethod();
}

// MyClass implements both MyFirstInterface and MySecondInterface
class MyClass implements MyFirstInterface, MySecondInterface {
   public void myMethod() {
      //method implementation
   }
   public void myOtherMethod() {
     //method implementation
   }
}

Пример за множество интерфейси

Не забравяйте, че патицата може не само да плува, но и да лети. Нека да напишем интерфейса за полети и да го внедрим в нашата патица.

public interface Flyable {
   double startAge = 0.1;
   void fly();
}

public class Duck implements Swimmable, Flyable {

   public void moveForward() {
       System.out.println(" Quack, I am moving forward...");
   }

   public void TurnRight(){
       System.out.println("I am turning right...");
   }
   public void TurnLeft(){
       System.out.println("I am turning left...");

   }

   public void Stop() {
       System.out.println("Quack. I am relaxing on the surface of the water...");
   }

   public void fly(){
       System.out.println("I am flying!!!");
   }

}
И отново, важно е да запомним защо пишем интерфейса. Да кажем, че ако се изпълнява от птица, самолет, парашутист и глухарче, техните полети ще бъдат напълно различни.