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

10
Dịch vụ dạy kèm gia sư lập trình

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.

Tìm hiểu Interface trong Java

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.

>> Đọc thêm: Học java ở đâu tốt nhất? Có cần phải đến trung tâm học lập trình?

Đ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_FlyCan_Swim rồi xem class nào có thể implements từng cái thích hợp.

interface java

Đặ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.

Các bạn có suy nghĩ thế nào về Interface? Hãy để lại bình luận ở bên dưới nhé.

Dịch vụ phát triển ứng dụng mobile giá rẻ - chất lượng
Bài trướcCách chụp ảnh màn hình máy tính Window, Ubuntu siêu tiện
Bài tiếp theoMẹo chặn quảng cáo Youtube trên PC, mobile và TV
Sơn Dương
Tên đầy đủ là Dương Anh Sơn. Tốt nghiệp ĐH Bách Khoa Hà Nội. Mình bắt đầu nghiệp coder khi mà ra trường chẳng xin được việc đúng chuyên ngành. Mình tin rằng chỉ có chia sẻ kiến thức mới là cách học tập nhanh nhất. Các bạn góp ý bài viết của mình bằng cách comment bên dưới nhé !

10
Bình luận. Cùng nhau thảo luận nhé!

avatar
  Theo dõi bình luận  
Mới nhất Cũ nhất Nhiều voted nhất
Thông báo
trung
Guest
trung

Cảm ơn tác giả bài viết nhiều ạ

namseox
Guest
namseox

Bạn cho mình hỏi là theo mình thấy thay vì kế thừa lại interface thì chúng ta có thể xây dựng mỗi class một hàm riêng cũng đc mà đâu nhất thiết kế thừa interface nhỉ?? mình nghĩ thằng interface này phải làm được gì đó nhiều hơn là chỉ thay vì viết tên một hàm mới thì chúng ta có thể tạo ra nhiều hàm khác… nên mình vẫn chưa thực sự hiểu về nó

sky
Guest
sky

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).
Điều này không đúng với Java 8 trở đi nhỉ? Bạn chưa cập nhật công nghệ mới ạ. Java 8 ra mắt lâu lắm r mà

VD_123
Guest
VD_123

Mình thấy vẫn chưa giải thích được câu này “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”

Tài
Guest
Tài

Trước giờ Mình dùng interface chỉ để truyền dữ liệu. Không biết như vậy coa dị quá không nữa 🙂