Sử dụng interface trong Java

Đây là bài 32/62 bài của series môn học Ngôn ngữ lập trình Java

1. Interface trong Java là gì?

Một interface là một lớp trừu tượng hoàn toàn (completely abstract class).

Các phương thức trong interface

Các phương thức trong một interface đều là các phương thức trừu tượng (những phương thức mà không có thân hàm).

Lưu ý: Trong lớp abstract thì một phương thức trừu tượng thì cần phải được khai báo với từ khóa abstract. Còn trong interface thì phương thức không có thân phương thức là phương thức trừu tượng.

Các biến trong interface

Các biến trong interface mặc định được khai báo là public, static, final.

Nếu bất kỳ biến nào được khai báo không có public, static và final thì trình biên dịch cũng sẽ tự động xác định biến đó được khai báo với public, static, final.

Biến trong interface chỉ cho phép access modifierpublic.

Mọi biến trong interface phải được khởi tạo trong interface.

Những lớp con kế thừa interface không thể thay đổi giá trị của biến trong interface nhưng có thể sử dụng nó để tính toán.

Khai báo một interface trong Java

Chúng ta sử dụng từ khóa interface để tạo một interface trong Java.

interface Language {
    public static final double PI = 3.14;
    public void getType();
    public void getVersion();
}

Trong ví dụ trên, Language là một interface, biến double PI là một biến hằng và khai báo với public, static, final, các phương thức trừu tượng là getType()getVersion().

2. Lớp con kế thừa interface

Chúng ta không thể tạo các đối tượng của interface. Những lớp khác sẽ kế thừa interface với từ khóa implements.

interface Polygon {
    void getArea(int length, int breadth);
}
//lớp Rectangle kế thừa interface Polygon
class Rectangle implements Polygon {
    //định nghĩa lại hàm abstract
    @Override
    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);
    }
}
Kết quả
The area of the rectangle is 30

3. Đa kế thừa với interface trong Java

Trong Java, một lớp có thể kế thừa từ nhiều interface. 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
}

4. Interface kế thừa interface trong Java

Interface có thể kế thừa những interface khác với từ khóa extends (chứ không phải implements). Ví dụ:

interface Line {
  // members of Line interface
}

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

Trong ví dụ trên, interface Polygon kế thừa interface Line. Nếu bất kỳ một lớp nào kế thừa interface Polygon thì nó phải định nghĩa lại các phương thức abstract của cả interface LinePolygon.

Interface kế thừa nhiều interface khác

Một interface có thể kế thừa từ nhiều interface khác với từ khóa extends. Ví dụ:

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

interface C extends A, B {
   ...
}

5. Phương thức default trong interface

Trong Java 8, chúng ta có thể thêm những phương thức được định nghĩa trong interface. Những phương thức này gọi là phương thức mặc định (default method). Để khai báo default method trong interface, chúng ta sử dụng từ khóa default. Ví dụ:

interface TuGiac {
    //hàm abstract
    void tinhDientich();
    //hàm default
    default void xuat(){
        System.out.println("Day la mot tu giac.");
    }
}
class HinhVuong implements TuGiac{
    int canh = 5;
    @Override
    public void tinhDientich() {
        int dientich = canh*canh;
        System.out.println("Dien tich hinh vuong = " + dientich);
    }

    @Override
    public void xuat() {
        System.out.println("Day la hinh vuong.");
    }
}
class HinhChuNhat implements TuGiac{
    int dai = 7;
    int rong = 5;
    @Override
    public void tinhDientich() {
        int dientich = dai*rong;
        System.out.println("Dien tich hinh chu nhat = " + dientich);
    }
}
class Main {
  public static void main(String[] args) {
      HinhVuong hv1 = new HinhVuong();
      hv1.tinhDientich();
      hv1.xuat();
      HinhChuNhat hcn1 = new HinhChuNhat();
      hcn1.tinhDientich();
      hcn1.xuat();
    }
}
Kết quả
Dien tich hinh vuong = 25
Day la hinh vuong.
Dien tich hinh chu nhat = 35
Day la mot tu giac.

Interface Hinh có 1 hàm abstracttinhDientich(), 1 hàm defaultxuat(). Lớp HinhVuong kế thừa các hàm của interface Hinh và định nghĩa là các hàm này. Lớp HinhChuNhat kế thừa các hàm của interface Hinh và chỉ định nghĩa lại hàm abstract.

Khi đối tượng hv1 của lớp HinhVuong gọi hàm xuat() thì là gọi hàm xuat() được định nghĩa lại trong lớp HinhVuong. Khi đối tượng hcn1 của lớp HinhChuNhat gọi hàm xuat() thì là gọi hàm default xuat() của lớp interface Hinh.

Tại sao sử dụng hàm default trong interface

Giả sử, chúng ta cần thêm một hàm mới ham1() vào một interface. Nếu có nhiều lớp kế thừa interface này thì chúng ta phải định nghĩa lại hàm ham1() ở tất cả các lớp kế thừa. Trong khi thực tế, chỉ một số lớp kế thừa cần định nghĩa lại ham1(). Để giải quyết vấn đề này, Java 8 sử dụng phương thức default và phương thức này được kế thừa giống như một phương thức bình thường.

6. Sự khác nhau giữa lớp abstract và interface

Abstract classinterface đều được sử dụng để có được sự trừu tượng mà ở đó chúng ta có thể khai báo các phương thức trừu tượng. Nhưng có một vài sự khác nhau giữa abstract classinterface:

Abstract classInterface
Abstract class có phương thức abstract (không có thân hàm) và phương thức non-abstract (có thân hàm).Interface chỉ có phương thức abstract. Từ java 8, nó có thêm các phương thức default static.
Abstract class không hỗ trợ đa kế thừa.Interface có hỗ trợ đa kế thừa.
Abstract class có các biến final, non-final, staticnon-static.Interface chỉ có các biến static final.
Abstract class có thể cung cấp nội dung cài đặt cho phương thức của interface.Interface không thể cung cấp nội dung cài đặt cho phương thức của abstract class.
Từ khóa abstract được sử dụng để khai báo abstract class.Từ khóa interface được sử dụng để khai báo interface.
Ví dụ: public abstract class Shape {
public abstract void draw();
}
Ví dụ: public interface Drawable {
void draw();
}

Lưu ý: Một lớp abstract có thể implements một interface.

Mời bạn đánh giá bài viết
Bài trước và bài sau trong môn học<< Lớp trừu tượng (abstract class) trong JavaTính đa hình (polymorphism) trong Java >>
Chia sẻ trên mạng xã hội:

Tác giả Vinh Lê

Vinh Lê hiện đang là biên tập viên tại Góc Học IT.

Bài viết của Vinh Lê

Trả lời

Lưu ý:

1) Vui lòng bình luận bằng tiếng Việt có dấu.

2) Khuyến khích sử dụng tên thật và địa chỉ email chính xác.

3) Mọi bình luận trái quy định sẽ bị xóa bỏ.