Giao diện Java

Trong hướng dẫn này, chúng ta sẽ tìm hiểu về các giao diện Java. Chúng ta sẽ tìm hiểu cách triển khai các giao diện và thời điểm sử dụng chúng một cách chi tiết với sự trợ giúp của các ví dụ.

Giao diện là một lớp trừu tượng hoàn toàn. Nó bao gồm một nhóm các phương thức trừu tượng (các phương thức không có phần thân).

Chúng tôi sử dụng interfacetừ khóa để tạo giao diện trong Java. Ví dụ,

interface Language {
  public void getType();

  public void getVersion();
}

Đây,

  • Language is an interface.
  • It includes abstract methods: getType() and getVersion().

Triển khai một giao diện

Giống như các lớp trừu tượng, chúng ta không thể tạo các đối tượng của giao diện.

Để sử dụng một giao diện, các lớp khác phải triển khai nó. Chúng tôi sử dụng implementstừ khóa để triển khai một giao diện.

Ví dụ 1: Giao diện Java

interface Polygon {
  void getArea(int length, int breadth);
}

// implement the Polygon interface
class Rectangle implements Polygon {

  // implementation of abstract method
  public void getArea(int length, int breadth) {
    System.out.println("The area of the rectangle is " + (length * breadth));
  }
}

class Main {
  public static void main(String[] args) {
    Rectangle r1 = new Rectangle();
    r1.getArea(5, 6);
  }
}

Đầu ra

The area of the rectangle is 30

Trong ví dụ trên, chúng ta đã tạo một giao diện có tên Polygon . Giao diện chứa một phương thức trừu tượng getArea().

Ở đây, lớp Rectangle thực hiện Polygon . Và, cung cấp việc triển khai getArea()phương pháp.

Ví dụ 2: Giao diện Java

// create an interface
interface Language {
  void getName(String name);
}

// class implements interface
class ProgrammingLanguage implements Language {

  // implementation of abstract method
  public void getName(String name) {
    System.out.println("Programming Language: " + name);
  }
}

class Main {
  public static void main(String[] args) {
    ProgrammingLanguage language = new ProgrammingLanguage();
    language.getName("Java");
  }
}

Đầu ra

Programming Language: Java

Trong ví dụ trên, chúng ta đã tạo một giao diện có tên là Ngôn ngữ . Giao diện bao gồm một phương thức trừu tượng getName().

Ở đây, lớp ProgrammingLanguage triển khai giao diện và cung cấp việc triển khai cho phương thức.

Triển khai nhiều giao diện

Trong Java, một lớp cũng có thể triển khai nhiều giao diện. Ví dụ,

interface A {
  // members of A
}

interface B {
  // members of B
}

class C implements A, B {
  // abstract members of A
  // abstract members of B
}

Mở rộng giao diện

Tương tự như các lớp, giao diện có thể mở rộng các giao diện khác. Các extendstừ khóa được sử dụng để mở rộng giao diện. Ví dụ,

interface Line {
  // members of Line interface
}

// extending interface
interface Polygon extends Line {
  // members of Polygon interface
  // members of Line interface
}

Ở đây, giao diện Polygon mở rộng giao diện Line . Bây giờ, nếu bất kỳ lớp nào triển khai Polygon , nó sẽ cung cấp các triển khai cho tất cả các phương thức trừu tượng của cả Line và Polygon .

Mở rộng nhiều giao diện

Một giao diện có thể mở rộng nhiều giao diện. Ví dụ,

interface A {
   ...
}
interface B {
   ... 
}

interface C extends A, B {
   ...
}

Ưu điểm của giao diện trong Java

Bây giờ chúng ta đã biết giao diện là gì, chúng ta hãy tìm hiểu về lý do tại sao giao diện được sử dụng trong Java.

  • Similar to abstract classes, interfaces help us to achieve abstraction in Java.

    Here, we know getArea() calculates the area of polygons but the way area is calculated is different for different polygons. Hence, the implementation of getArea() is independent of one another.
  • Interfaces provide specifications that a class (which implements it) must follow.

    In our previous example, we have used getArea() as a specification inside the interface Polygon. This is like setting a rule that we should be able to get the area of every polygon.

    Now any class that implements the Polygon interface must provide an implementation for the getArea() method.
  • Interfaces are also used to achieve multiple inheritance in Java. For example,
     interface Line { … } interface Polygon { … } class Rectangle implements Line, Polygon { … }

    Here, the class Rectangle is implementing two different interfaces. This is how we achieve multiple inheritance in Java.

Lưu ý : Tất cả các phương thức bên trong giao diện là ngầm định publicvà tất cả các trường là ngầm định public static final. Ví dụ,

interface Language {
  
  // by default public static final
  String type = "programming language";

  // by default public
  void getName();
}

các phương thức mặc định trong Java Interfaces

Với việc phát hành Java 8, bây giờ chúng ta có thể thêm các phương thức với việc triển khai bên trong một giao diện. Các phương thức này được gọi là phương thức mặc định.

Để khai báo các phương thức mặc định bên trong giao diện, chúng ta sử dụng defaulttừ khóa. Ví dụ,

public default void getSides() {
   // body of getSides()
}

Tại sao các phương thức mặc định?

Hãy xem một kịch bản để hiểu tại sao các phương thức mặc định được giới thiệu trong Java.

Giả sử, chúng ta cần thêm một phương thức mới trong một giao diện.

Chúng ta có thể thêm phương thức trong giao diện của mình một cách dễ dàng mà không cần thực hiện. Tuy nhiên, đó không phải là kết thúc của câu chuyện. Tất cả các lớp của chúng tôi triển khai giao diện đó phải cung cấp một triển khai cho phương thức.

Nếu một số lượng lớn các lớp đang triển khai giao diện này, chúng ta cần theo dõi tất cả các lớp này và thực hiện các thay đổi đối với chúng. Điều này không chỉ tẻ nhạt mà còn dễ xảy ra lỗi.

Để giải quyết vấn đề này, Java đã giới thiệu các phương pháp mặc định. Các phương thức mặc định được kế thừa giống như các phương thức thông thường.

Hãy lấy một ví dụ để hiểu rõ hơn về các phương thức mặc định.

Ví dụ: Phương thức mặc định trong giao diện Java

interface Polygon {
  void getArea();

  // default method 
  default void getSides() {
    System.out.println("I can get sides of a polygon.");
  }
}

// implements the interface
class Rectangle implements Polygon {
  public void getArea() {
    int length = 6;
    int breadth = 5;
    int area = length * breadth;
    System.out.println("The area of the rectangle is " + area);
  }

  // overrides the getSides()
  public void getSides() {
    System.out.println("I have 4 sides.");
  }
}

// implements the interface
class Square implements Polygon {
  public void getArea() {
    int length = 5;
    int area = length * length;
    System.out.println("The area of the square is " + area);
  }
}

class Main {
  public static void main(String[] args) {

    // create an object of Rectangle
    Rectangle r1 = new Rectangle();
    r1.getArea();
    r1.getSides();

    // create an object of Square
    Square s1 = new Square();
    s1.getArea();
    s1.getSides();
  }
}

Đầu ra

The area of the rectangle is 30
I have 4 sides.
The area of the square is 25
I can get sides of a polygon.

Trong ví dụ trên, chúng ta đã tạo một giao diện có tên Polygon . Nó có một phương thức mặc định getSides()và một phương thức trừu tượng getArea().

Ở đây, chúng ta đã tạo ra hai lớp Rectangle và Square thực hiện Polygon .

Lớp Rectangle cung cấp việc triển khai getArea()phương thức và ghi đè getSides()phương thức. Tuy nhiên, lớp Square chỉ cung cấp việc triển khai getArea()phương thức.

Bây giờ, trong khi gọi getSides()phương thức bằng đối tượng Rectangle , phương thức được ghi đè sẽ được gọi. Tuy nhiên, trong trường hợp của đối tượng Square , phương thức mặc định được gọi.

Các phương thức riêng và tĩnh trong giao diện

Java 8 cũng đã thêm một tính năng khác để bao gồm các phương thức tĩnh bên trong một giao diện.

Tương tự như một lớp, chúng ta có thể truy cập các phương thức tĩnh của một giao diện bằng cách sử dụng các tham chiếu của nó. Ví dụ,

// create an interface
interface Polygon {
  staticMethod(){..}
}

// access static method
Polygon.staticMethod();

Lưu ý : Với việc phát hành Java 9, các phương thức riêng tư cũng được hỗ trợ trong các giao diện.

Chúng ta không thể tạo các đối tượng của một giao diện. Do đó, các phương thức private được sử dụng như các phương thức trợ giúp cung cấp hỗ trợ cho các phương thức khác trong giao diện.

Ví dụ thực tế về giao diện

Hãy xem một ví dụ thực tế hơn về Giao diện Java.

// To use the sqrt function
import java.lang.Math;

interface  Polygon {
   void getArea();
  
 // calculate the perimeter of a Polygon
   default void getPerimeter(int... sides) {
      int perimeter = 0;
      for (int side: sides) {
         perimeter += side;
      }

   System.out.println("Perimeter: " + perimeter);
   }
}

class Triangle implements Polygon {
   private int a, b, c;
   private double s, area;

// initializing sides of a triangle
   Triangle(int a, int b, int c) {
      this.a = a;
      this.b = b;
      this.c = c;
      s = 0;
   }

// calculate the area of a triangle
   public void getArea() {
      s = (double) (a + b + c)/2;
      area = Math.sqrt(s*(s-a)*(s-b)*(s-c));
      System.out.println("Area: " + area);
   }
}

class Main {
   public static void main(String[] args) {
      Triangle t1 = new Triangle(2, 3, 4);

// calls the method of the Triangle class
      t1.getArea();

// calls the method of Polygon
      t1.getPerimeter(2, 3, 4);
   }
}

Đầu ra

Area: 2.9047375096555625
Perimeter: 9

Trong chương trình trên, chúng ta đã tạo một giao diện có tên là Polygon . Nó bao gồm một phương thức mặc định getPerimeter()và một phương thức trừu tượng getArea().

Chúng tôi có thể tính toán chu vi của tất cả các đa giác theo cùng một cách để chúng tôi thực hiện phần thân của getPerimeter()trong Đa giác .

Bây giờ, tất cả các đa giác thực hiện Đa giác đều có thể sử dụng getPerimeter()để tính chu vi.

Tuy nhiên, quy tắc tính diện tích là khác nhau đối với các đa giác khác nhau. Do đó, getArea()được bao gồm mà không cần thực hiện.

Bất kỳ lớp nào triển khai Polygon phải cung cấp một triển khai của getArea().









Gõ tìm kiếm nhanh...