Interface trong Java – Bạn đã hiểu đúng? Nếu chưa, mời đọc ngay

Bài viết được sự cho phép của tác giả Sơn Dương

Trong một lần tình cờ vào VOZ forums, có một bạn hỏi về Interface trong Java là gì?  Nó khác với Abstract Class chỗ nào? Tại sao phải dùng Interface, mặc dù nó chẳng rút gọn code đi tý nào, thậm chí còn dài hơn. Mặc dù có nhiều bạn trả lời cho chủ topic đó nhưng hầu hết là hiểu sai, hoặc chưa hiểu rõ bản chất của Interface trong Java.

Để các bạn có cái nhìn thấu đáo, hiểu rõ bản chất của Interface. Từ đó có thể ứng dụng Interface một cách chuẩn chỉ cho dự án của mình. Mình đã cho ra đời bài viết này.

Java Interface là gì? Có phải “bộ mặt” của Java?

Để hiểu một cách chính xác thì phải đọc khái niệm Interface của chính chủ Oracle:

In its most common form, an interface is a group of related methods with empty bodies.
 – Oracle –

Đến Oracle cũng không thể định nghĩa Interface một cách khoa học kiểu: Interface là xyz, bla bla. Nhưng chúng ta có thể hiểu một cách nôm na và chính xác như sau: Trong thế giới thực, chúng ta có vật (đồ vật, con vật…) và các hành vi của nó. Interface được sinh là để định nghĩa các hành vi của một nhóm vật.

Mình lấy ví dụ như sau: Một con mèo (đây là con vật) thì có các hành vi như: chạy, bắt chuột, ngủ…

Ta sẽ định nghĩa một Interface Cat như sau:

interface CatBehaviors {

    // Cách con mèo chạy với tốc độ 
    void run(int speed);

    // Cách con mèo bắt chuột
    void catchMouse(int mouse);

    // Định nghĩa cách con mèo ngủ.
    void sleep();

}

Sau này chúng ta định nghĩa một con mèo thì tất nhiên nó sẽ phải các hành vi của con mèo, dù nó là mèo tam thể hay mèo vàng…

class Cat implements CatBehaviors {
    private String màu_lông;
    //Cách con mèo chạy với tốc độ 
    void run(int speed){
    ...
    }
    //Cách con mèo bắt chuột
    void catchMouse(int mouse){
    ...
    }
    // Định nghĩa cách con mèo ngủ.
    void sleep(){
    ...
   }
}

Về học thuật thì Interface chính là khái niệm để hiện thực hóa triết lý đa hình trong lập trình hướng đối tượng. Cụ thể hơn thì mình sẽ giải thích ở phần sau của bài viết.

Interface Java cũng là một Abstract Class bao gồm các method được định nghĩa (nhưng nội dung của method thì không được viết cụ thể, người ta gọi là abstract method). Một Class sau này sẽ implements một Interface, đến lúc đó class mới viết cụ thể nội dung của các method được định nghĩa trong interface.

Trong Interface, ngoài abstract method, bạn hoàn toàn có thể thêm constants, static methods, nested interfaces (interface trong một interface) và default methods.

  Functional Interface là gì? Functional Interface API trong Java 8

  Giới thiệu Java Service Provider Interface (SPI) – Tạo các ứng dụng Java dễ mở rộng

Điểm giống – khác nhau giữa Interface và Abstract class:

Một interface về cơ bản hoàn toàn giống với abstract class. Một interface cũng có các abstract method và các method được thiết kế để implement ở các class khác. Việc implement này hoàn toàn giống với việc extend và override method trong Abstract class.

Về điểm khác nhau, thì mình thấy có 2 điểm chính:

  1. Về cách viết code: các method trong interface phải là empty method, tức là method không có nội dung, chỉ có tên hàm, tham số và kiểu dữ liệu trả về. Trong khi với abstract class thì bạn hoàn toàn có thể thêm abstract method hoặc method bình thường (là method có nội dung, logic bên trong body).
  2. Về mục đích sử dụng:
  • Interface là một chức năng mà bạn có thể thêm và bất kì class nào. Từ chức năng ở đây không đồng nghĩa với method (hay còn gọi là hàm).
  • Abstract class là một class cha cho tất cả các class có cùng bản chất. Bản chất ở đây được hiểu là kiểu, loại, nhiệm vụ của class.

Tại sao chúng ta cần Interface

Lý do chính là Java không hỗ trợ đa kế thừa. Do đó, bạn không thể kế thừa cùng một lúc nhiều class. Các class con không thể kế thừa các thuộc tính của nhiều class cha, vì nó dẫn đến bài toán Kim Cương (các bạn search Google để biết cái này nhé).

Để giải quyết vấn đề này, người ta mới cho ra đời Interface.  Để hiểu rõ hơn, chúng ta sẽ cùng nhau xem ví dụ dưới đây.

Bạn muốn thiết kế một Sở thú, gồm rất nhiều các con vật. Về cơ bản thì các con vật đều có các đặc điểm chung như: Có tên, có tiếng kêu, có chân (2 chân, 4 chân, hoặc 0 có chân nào…). Từ những đặc điểm chung đó bạn tạo một abstract class là: abstract class Animal

Interface trong Java

Tuy nhiên lại có một số loài lại biết bay, một số loài thì biết bơi. Và cái “dở” là loài biết bay lại không biết bơi. Do vậy, ta không thể để đặc điểm biết bay hay biết bơi trong class Animal được.

Đó là lý do chúng ta cần tạo 2 Interface khác nhau là Can_Fly và Can_Swim rồi xem class nào có thể implements từng cái thích hợp.

Interface trong Java

Tham khảo việc làm Java mới nhất trên TopDev

Đặc điểm chính của Java Interface

Bạn đọc đến chắc cũng đã hiểu phần nào về Interface trong Java rồi đúng không? Khi nào thì cần phải sử dụng Interface, và nó khác với Class thường chỗ nào.

Giờ mình sẽ tổng kết lại những đặc điểm chính mà bạn cần phải nhớ về Interface:

  • Các method được khai báo trong Interface phải là method rỗng.
  • Không thể tạo đối tượng từ Interface.
  • Một Class có thể implement một hoặc nhiều Interface.

Mình viết một đoạn code mình họa cho đỡ nhàm chán nhé.

public interface extInterface {
        public void method1();
        public void method2();
}
import java.util.Scanner;
class Edureka implements extInterface{
    public void method1(){
         System.out.println("implementation of method1");
         Scanner scanner = new Scanner(System.in);
         System.out.println("Enter number to find square root in Java : ");
         double square = scanner.nextDouble();
         double squareRoot = Math.sqrt(square);
         System.out.printf("Square root of number: %f is : %f %n" , square, squareRoot);
    }
    public void method2(){
         System.out.println("implementation of method2");
      }
public static void main(String arg[]){
         extInterface obj = new Edureka();
         obj.method1();
      }
}

Chạy đoạn code sẽ thu được kết quả:

implementation of method1
Enter number to find square root in Java :
16
Square root of number: 16.0 is : 4.0

Tổng kết

Như vậy là mình đã hoàn thành bài viết về Interface trong Java. Đọc đến đây, bạn đã “vỡ” ra được nhiều điều không? Nếu không thì… buồn ghê.

Các bạn nên nhớ, Interface chỉ là một công cụ, nó không phải là triết lý lập trình. Do vậy, khi ai đó nói tới lập trình hướng đối tượng, tới đa hình mà nói: Tính đa hình là interface. Thì không hẳn là đúng nhé. Nhớ này: Interface chỉ là một công cụ để thực hiện tính đa hình.

Bài viết gốc được đăng tải tại vntalking.com

Có thể bạn quan tâm:

Xem thêm công việc CNTT hấp dẫn trên TopDev