Như bạn đã biết, mọi thứ trong Java đều bao gồm các đối tượng và các đối tượng đều có trạng thái (trường) và hành vi (được xác định bởi các phương thức). Hành vi của một lớp là thứ có thể liên kết nó với các lớp khác. Hành vi có thể có những đặc điểm khác nhau và đôi khi sẽ thuận tiện hơn nếu chuyển nó ra ngoài lớp học, đặc biệt là khi tương tác với thế giới bên ngoài. Cũng giống như chiếc điều khiển từ xa của TV nằm ngoài "chiếc hộp". Điều khiển từ xa là giao diện để người dùng tương tác với các chức năng của TV. Ví dụ: bạn có thể tưởng tượng một lớp thực hiện một chiếc máy bay hoặc trực thăng trừu tượng. Các đối tượng của cả hai lớp như hầu hết các loài chim đều có thể bay và chúng đều thực hiện điều đó một cách khác nhau. Có lẽ nên chuyển tính năng này thành một thực thể riêng biệt và tất cả những “người bay” tiềm năng sẽ được kế thừa từ thực thể này? Nếu bạn đã quen thuộc với các lớp trừu tượng, bạn có thể chỉ cần tạo một lớp trừu tượng Flyable và “kế thừa” các lớp Copter và Plane từ nó. Tuy nhiên, nếu có một số thuộc tính như vậy thì sao? Ví dụ, máy bay và trực thăng có thể bay nhưng cũng có thể di chuyển trên mặt đất. Ngay cả khi chúng ta tạo lớp Ride, chúng ta không thể gán Copter và Plane cho nó nữa. Xét cho cùng, mỗi lớp Java chỉ có một lớp cha. Giao diện trong Java - 1Việc sử dụng các giao diện bằng ngôn ngữ Java phần nào giải quyết được vấn đề này. Các giao diện trong Java xác định một số chức năng không có cách triển khai cụ thể, sau đó được các lớp sử dụng các giao diện này triển khai. Và một lớp có thể thực hiện nhiều giao diện. Trên thực tế, bằng cách triển khai một giao diện trong Java, chúng ta tuyên bố rằng lớp của chúng ta có thể làm điều gì đó, chúng ta báo cáo hành vi của nó. Chúng tôi đã thực hiện việc thực hiện hành vi cụ thể trong lớp. Vì thế. máy bay và trực thăng cất cánh khác nhau: máy bay cần có đường băng, trong khi trực thăng thường cất cánh thẳng đứng. Những chi tiết như vậy được thực hiện tốt nhất trong lớp.

Giao diện trong Java

Để xác định giao diện bằng ngôn ngữ Java, từ khóa giao diện được sử dụng. Ví dụ:

interface Voice {
 
    void talk();
}
Giao diện trên có tên là Voice . Một giao diện trong Java có thể xác định các hằng số và các phương thức, có thể có hoặc không có phần triển khai. Thông thường, các phương thức giao diện không có phần triển khai, giống như trong ví dụ này. Các phương thức trong giao diện không được triển khai cũng giống như các phương thức trừu tượng của các lớp trừu tượng. Các phương thức giao diện thường không có công cụ sửa đổi quyền truy cập. Tuy nhiên, quyền truy cập thực sự được công khai theo mặc định vì mục đích của giao diện là xác định chức năng cho việc triển khai lớp. Vì vậy, tất cả các chức năng nên được mở để triển khai. Để triển khai một giao diện, hãy sử dụng từ khóa Thực hiện trong khi khai báo lớp của bạn. Hơn nữa, nếu một giao diện chứa một phương thức không được triển khai thì phương thức đó phải được triển khai trong lớp triển khai.

public class Duck implements Voice {


@Override
public void voice() {
   System.out.println("Quack");
}


    }

Ví dụ về mã giao diện

Hãy lấy một ví dụ đầy đủ hơn. Mọi (à, hầu hết mọi) động vật đều có khả năng tạo ra âm thanh. Hãy tạo một giao diện Java Voice cho trường hợp này. Nó có một phương thức talk() mà không cần triển khai.

public interface Voice {
   void talk();
}
Bây giờ tất cả các lớp hỗ trợ giao diện Voice đều phải triển khai phương thức talk() . Hãy tạo hai lớp - CatDog và cho biết rằng chúng triển khai giao diện Voice . Trong trường hợp này, nếu bạn không triển khai một lớp trong đó thì chương trình sẽ không hoạt động. Phương pháp thực hiện rất đơn giản. Khi gọi phương thức talk() của một đối tượng thuộc lớp Cat , văn bản tương đương với tiếng meo meo sẽ được hiển thị trên màn hình, trong trường hợp của lớp Dog là tiếng sủa. Chúng ta cũng sẽ thêm getters, setters và constructor vào các lớp.

public class Cat implements Voice {
   String name;
   String breed;
   int year;

   public Cat(String name, String breed, int year) {
       this.name = name;
       this.breed = breed;
       this.year = year;
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public String getBreed() {
       return breed;
   }

   public void setBreed(String breed) {
       this.breed = breed;
   }

   public int getYear() {
       return year;
   }

   public void setYear(int year) {
       this.year = year;
   }

   @Override
   public void talk() {
       System.out.println("meow...");
   }
}
public class Dog implements Voice {
   String name;
   String color;
   int year;

   public Dog(String name, String color, int year) {
       this.name = name;
       this.color = color;
       this.year = year;
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public String getColor() {
       return color;
   }

   public void setColor(String color) {
       this.color = color;
   }

   public int getYear() {
       return year;
   }

   public void setYear(int year) {
       this.year = year;
   }

   @Override
   public void talk() {
       System.out.println("WOF WOF");
   }
}
Trên thực tế, việc triển khai các lớp và phương thức của chúng tôi rất giống nhau. Hãy tạo một lớp khác, Parrot , có hỗ trợ Giọng nói . Chỉ có phương thức talk() sẽ hoạt động khác trong đó: người dùng sẽ nhập một chuỗi vào bảng điều khiển và con vẹt sẽ “lặp lại” nó bằng phương thức talk() .

import java.util.Scanner;

public class Parrot implements Voice {
   String name;
   String color;
   int year;

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public String getColor() {
       return color;
   }

   public void setColor(String color) {
       this.color = color;
   }

   public int getYear() {
       return year;
   }

   public void setYear(int year) {
       this.year = year;
   }

   @Override
   public void talk() {
       Scanner scanner = new Scanner(System.in);
       System.out.println("WHat should I repeat after you?...");
       String s =  scanner.nextLine();
       System.out.println(s);
   }
}
Bây giờ chúng ta hãy tạo một lớp thử nghiệm và xem chương trình sẽ tạo ra kết quả gì nếu chúng ta gọi lần lượt phương thức talk() của các đối tượng của các lớp Cat , DogParrot .

public class InterfaceDemo {
   public static void main(String[] args) {
       Cat cat = new Cat ("Mewie", "Siam" ,2021);
       cat.talk();
       Dog dog = new Dog("Snoopy", "White and black", 2020);
       dog.talk();
       Parrot parrot = new Parrot();
       parrot.talk();
   }
}
Đầu ra ở bên dưới. Văn bản màu xanh lá cây là một người dùng được in trong bảng điều khiển.
meo meo... WOF WOF Tôi nên nhắc lại điều gì sau bạn?... Tôi là chú chim rất nói nhiều và thông minh Tôi là chú chim rất nói nhiều và thông minh

Phương thức mặc định

Trước khi phát hành JDK 8 khi triển khai một giao diện trong Java, chúng tôi phải triển khai tất cả các phương thức của nó trong một lớp. Đồng thời, bản thân giao diện Java chỉ có thể chứa các định nghĩa phương thức mà không có cách triển khai cụ thể. JDK 8 bổ sung thêm chức năng mới - các phương thức mặc định. Bây giờ các giao diện Java không chỉ có thể có các định nghĩa phương thức mà còn có các triển khai mặc định. Chúng được sử dụng nếu lớp triển khai giao diện nhưng không triển khai phương thức. Ví dụ: hãy thay đổi phương thức talk() trong giao diện Voice thành phương thức mặc định. Chúng tôi cũng sẽ viết một lớp Duck hỗ trợ giọng nói mới không triển khai phương thức nói chuyện .

public interface Voice {
   default void talk() {
       System.out.println("I can talk...");
   }
}

public class Duck implements Voice {

   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!!!");
   }

}
Bây giờ hãy thay đổi lớp kiểm tra của chúng ta một chút.

public class InterfaceDemo {
   public static void main(String[] args) {
       Cat cat = new Cat ("Mewie", "Siam" ,2021);
       cat.talk();
       Dog dog = new Dog("Snoopy", "White and black", 2020);
       dog.talk();
       Duck duck = new Duck();
       duck.talk();
   }
}
Đầu ra ở đây:
meo... WOF WOF tôi có thể nói chuyện...
Nhìn thấy? Trong các đối tượng của lớp DogCat , phương thức ghi đè talk() được gọi, nhưng trong đối tượng của lớp Duck , phương thức mặc định từ giao diện sẽ được gọi. Vì vậy, phương thức mặc định chỉ là một phương thức không có từ bổ nghĩa và được đánh dấu bằng từ khóa mặc định. Chúng ta không phải triển khai phương thức mặc định trong lớp triển khai giao diện nhưng chúng ta có thể ghi đè lên nó.

Phương thức tĩnh

Vì các phương thức tĩnh của JDK 8 có sẵn trong các giao diện Java - chúng tương tự như các phương thức lớp:

interface Voice {
     
    void talk();
     
    static void check(){
         
        System.out.println("checked...");
    }
}
Để tham chiếu đến một phương thức tĩnh của một giao diện, giống như trong trường hợp các lớp, hãy viết tên của giao diện và phương thức:

public static void main(String[] args) {
         
    Voice.check(); 
}

Triển khai nhiều giao diện

Nếu chúng ta cần áp dụng một số giao diện trong lớp Java thì tất cả chúng đều được liệt kê bằng dấu phẩy sau từ thực hiện :

public class Duck implements Swimmable, Flyable, Voice {

    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!!!");
    }

}