Giao diện Java (Có ví dụ)

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 bao gồm một nhóm các phương thức không có phần thân.

Trong Java, một giao diện xác định một tập hợp các đặc tả mà các lớp khác phải thực hiện. Ví dụ,

 interface Language ( public void getName(); )

Ở đây, chúng ta đã sử dụng interfacetừ khóa để tạo giao diện có tên là Ngôn ngữ. Giao diện Ngôn ngữ xác định một đặc tả getName().

Bây giờ, mọi lớp sử dụng giao diện này nên triển khai getName()đặc tả.

Ví dụ: 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

 Ngôn ngữ lập trình: 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.

Không bắt buộc phải sử dụng abstracttừ khóa trong khi khai báo các phương thức trừu tượng bên trong giao diện. Nó bởi vì một giao diện chỉ bao gồm các phương thức trừu tượng không phải các phương thức thông thường.

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(); )

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 một giao diện. Tuy nhiên, chúng ta có thể triển khai một giao diện.

Chúng tôi sử dụng implementstừ khóa để triển khai một giao diện. Ví dụ,

 // create an interface 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) ( // create an object Rectangle r1 = new Rectangle(); r1.getArea(5, 6); ) )

Đầu ra

 Diện tích của hình chữ nhật là 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.

Lưu ý : Một lớp 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.

Lưu ý : 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.

  • Các giao diện cung cấp các thông số kỹ thuật mà một lớp (mà thực thi nó) phải tuân theo.
    Trong ví dụ trước của chúng tôi, chúng tôi đã sử dụng getArea()làm đặc tả bên trong Đa giác giao diện. Điều này giống như thiết lập một quy tắc, chúng ta có thể có được diện tích của mọi đa giác.
    Bây giờ bất kỳ lớp nào triển khai giao diện Đa giác phải cung cấp một triển khai cho getArea()phương thức.
  • Tương tự như các lớp trừu tượng, các giao diện giúp chúng ta đạt được sự trừu tượng trong Java .
    Ở đây, chúng ta biết getArea()tính diện tích của đa giác nhưng cách tính diện tích là khác nhau đối với các đa giác khác nhau. Do đó, việc thực hiện getArea()là độc lập với nhau.
  • Các giao diện cũng được sử dụng để đạt được đa kế thừa trong Java. Ví dụ,
     interface Line (… ) interface Polygon (… ) class Rectangle implements Line, Polygon (… )

    Ở đây, lớp Rectangle đang triển khai hai giao diện khác nhau. Đây là cách chúng tôi đạt được đa kế thừa trong Java.

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 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 các 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 vào 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 trong 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

Diện tích hình chữ nhật là 30 Ta có 4 cạnh. Diện tích của hình vuông là 25 Tôi có thể nhận được các cạnh của một đa giác.

In the above example, we have created an interface named Polygon. It has a default method getSides() and an abstract method getArea().

Here, we have created two classes Rectangle and Square that implement Polygon.

The Rectangle class provides the implementation of the getArea() method and overrides the getSides() method. However, the Square class only provides the implementation of the getArea() method.

Now, while calling the getSides() method using the Rectangle object, the overridden method is called. However, in the case of the Square object, the default method is called.

private and static Methods in Interface

The Java 8 also added another feature to include static methods inside an interface.

Similar to a class, we can access static methods of an interface using its references. For example,

 // create an interface interface Polygon ( staticMethod()(… ) ) // access static method Polygon.staticMethod();

Note: With the release of Java 9, private methods are also supported in interfaces.

We cannot create objects of an interface. Hence, private methods are used as helper methods that provide support to other methods in interfaces.

Practical Example of Interface

Let's see a more practical example of Java Interface.

 // 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); ) )

Output

 Area: 2.9047375096555625 Perimeter: 9

In the above program, we have created an interface named Polygon. It includes a default method getPerimeter() and an abstract method getArea().

We can calculate the perimeter of all polygons in the same manner so we implemented the body of getPerimeter() in Polygon.

Now, all polygons that implement Polygon can use getPerimeter() to calculate perimeter.

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 getArea().

thú vị bài viết...