Bài tập

Lớp trừu tượng trong JAVA - Sự trừu tượng ẩn đối tượng

Huy Erick

Một lớp trừu tượng trong Java là một lớp được khai báo với từ khóa abstract, nghĩa là lớp này chứa các phương thức có thể là trừu tượng và không trừu tượng. Trước khi...

Một lớp trừu tượng trong Java là một lớp được khai báo với từ khóa abstract, nghĩa là lớp này chứa các phương thức có thể là trừu tượng và không trừu tượng. Trước khi tìm hiểu về lớp trừu tượng trong Java, chúng ta hãy hiểu về trừu tượng trong Java trước.

Trừu tượng trong Java là gì?

Trừu tượng trong Java là quá trình ẩn các chi tiết triển khai và chỉ hiển thị chức năng cho người dùng. Nó cho phép tập trung vào những gì đối tượng làm thay vì cách nó thực hiện. Ví dụ, khi bạn gửi một tin nhắn SMS, bạn không cần biết quy trình xử lý nội bộ về việc gửi tin nhắn.

Có hai cách để đạt được tính trừu tượng trong Java: sử dụng lớp trừu tượng (0-100%) và interface (100%).

Lớp trừu tượng (Abstract class) trong JAVA

Hình ảnh được thể hiện ở trên minh họa lớp trừu tượng trong Java

Lớp trừu tượng trong Java được khai báo với từ khóa abstract và có thể chứa các phương thức trừu tượng và không trừu tượng. Nó cần được mở rộng và triển khai phương thức của riêng nó.

Quy tắc của lớp trừu tượng trong Java bao gồm:

  • Một lớp trừu tượng phải được khai báo bằng từ khóa abstract.
  • Nó có thể có các phương thức trừu tượng và không trừu tượng.
  • Nó không thể được khởi tạo.
  • Nó cũng có thể chứa các hàm tạo (constructor) và các phương thức static.
  • Nó có thể có các phương thức cuối cùng sẽ buộc lớp con không thay đổi phần thân của phương thức.

Phương thức trừu tượng trong JAVA

Một phương thức được khai báo là trừu tượng và không có triển khai được gọi là phương thức trừu tượng. Ví dụ, phương thức trừu tượng printStatus() không có phần thân được khai báo như sau:

abstract void printStatus(); // Không có phần thân

Ví dụ về lớp trừu tượng có một phương thức trừu tượng:

Trong ví dụ này, lớp XeDien là một lớp trừu tượng chỉ chứa một phương thức trừu tượng chay(). Việc triển khai phương thức này được cung cấp bởi lớp Vinfast.

abstract class XeDien {
    abstract void chay(); // Không có phần thân
}

class Vinfast extends XeDien {
    void chay() {
        System.out.println("Chạy ngon...");
    }

    public static void main(String args[]) {
        XeDien xeDien = new Vinfast();
        xeDien.chay();
    }
}

Kết quả khi chạy chương trình: Chạy ngon...

Hiểu kịch bản thực tế của lớp Trừu tượng

Trong ví dụ dưới đây, Hinh là lớp trừu tượng và việc triển khai nó được cung cấp bởi các lớp HinhChuNhatHinhTron. Phương thức ve() của lớp thực hiện được gọi bởi phương thức gốc.

Trong ví dụ này, khi bạn tạo một thể hiện của lớp HinhChuNhat, phương thức ve() của lớp HinhChuNhat sẽ được gọi.

Ví dụ về lớp trừu tượng:

// Khai báo lớp trừu tượng Hinh
abstract class Hinh {
    abstract void ve();
}

// Trong trường hợp thực, việc triển khai được cung cấp bởi những người khác, tức là người dùng cuối không biết
class HinhChuNhat extends Hinh {
    void ve() {
        System.out.println("Vẽ hình chữ nhật");
    }
}

class HinhTron extends Hinh {
    void ve() {
        System.out.println("Vẽ hình tròn");
    }
}

// Trong thực tế, phương thức được gọi bởi lập trình viên hoặc người dùng
class TestTruuTuong {
    public static void main(String args[]) {
        Hinh hinhTron = new HinhTron();
        hinhTron.ve();
    }
}

Kết quả nhận được: Vẽ hình tròn

Ví dụ Lớp trừu tượng có constructor, data member và các method

Một lớp trừu tượng có thể có data member, phương thức trừu tượng, thân phương thức (phương thức không trừu tượng), phương thức khởi tạo và thậm chí cả phương thức main().

Ví dụ về lớp trừu tượng có các phương thức trừu tượng và không trừu tượng:

// Ví dụ về một lớp trừu tượng có các phương thức trừu tượng và không trừu tượng
abstract class XeDien {
    // Hàm khởi tạo
    XeDien() {
        System.out.println("Xe điện được tạo");
    }

    // Phương thức trừu tượng
    abstract void chay();

    // Phương thức không trừu tượng
    void thayPin() {
        System.out.println("Đã thay pin");
    }
}

// Creating a Child class which inherits Abstract class
class Vinfast extends XeDien {
    void chay() {
        System.out.println("Đang chạy...");
    }
}

// Tạo class để gọi thử 2 loại phương thức
class TestLopTruuTuong {
    public static void main(String args[]) {
        XeDien xeDien = new Vinfast();
        xeDien.chay();
        xeDien.thayPin();
    }
}

Kết quả nhận được:

Xe điện được tạo
Đang chạy...
Đã thay pin

Lưu ý #1: Nếu có một phương thức trừu tượng trong một lớp, thì lớp đó phải trừu tượng.

class XeDien {
    abstract void chay();
}

Class này khi biên dịch sẽ lỗi: compile time error

Lưu ý #2: Nếu bạn đang extends một lớp trừu tượng có một phương thức trừu tượng, bạn phải triển khai cụ thể phương thức trừu tượng đó hoặc làm cho lớp mới này cũng là trừu tượng.

Ví dụ một lớp trừu tượng thực tế khác khi lập trình Java

Lớp trừu tượng cũng có thể được sử dụng để cung cấp khai triển một phần của interface. Trong trường hợp đó, người dùng cuối không bị buộc ghi đè tất cả các phương thức của interface.

Lưu ý: Nếu bạn là người mới bắt đầu học lập trình Java, hãy tìm hiểu interface trước và bỏ qua ví dụ này.

interface IA {
    void a();
    void b();
    void c();
    void d();
}

abstract class B implements IA {
    public void c() {
        System.out.println("Tôi là c");
    }
}

class M extends B {
    public void a() {
        System.out.println("Tôi là a");
    }
    public void b() {
        System.out.println("Tôi là b");
    }
    public void d() {
        System.out.println("Tôi là d");
    }
}

class Test {
    public static void main(String args[]) {
        IA a = new M();
        a.a();
        a.b();
        a.c();
        a.d();
    }
}

Kết quả:

Tôi là a
Tôi là b
Tôi là c
Tôi là d

Như bạn thấy đó, khi class trừu tượng B khai triển interface IA thì không bắt buộc phải ghi đè phương thức a(), b(), d().

Như vậy, trong bài tự học Java này, chúng ta đã tìm hiểu về Abstract class trong Java và cũng đã có một vài ví dụ để bạn hiểu cách sử dụng Abstract class.

Chúc bạn học Java tốt!

1