Một lớp được khai báo với từ khóa abstract (trừu tượng) được gọi là một lớp trừu tượng trong Java (abstract class).
Lớp trừu tượng trong Java có thể có các phương thức trừu tượng và không trừu tượng (phương thức với phần thân).
Trước khi tìm hiểu về lớp trừu tượng 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ì?
Nói ngắn gọn, Trừu tượng trong Java là một 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ói theo cách khác, nó chỉ hiển thị những thứ cần thiết cho người dùng và ẩn các chi tiết nội bộ.
Ví dụ: Gửi SMS khi bạn nhập văn bản và gửi tin nhắn. Bạn không biết cần quy trình xử lý nội bộ về việc gửi tin nhắn.
Tính trừu tượng cho phép bạn tập trung vào những gì đối tượng làm thay vì cách nó thực hiện.
Các cách để đạt được tính trừu tượng trong JAVA
Có hai cách để đạt được tính trừu tượng trong java, sử dụng:
- Abstract class (0 đến 100%)
- Interface (100%)
Lớp trừu tượng (Abstract class) trong JAVA
Một lớp được khai báo là abstract được gọi là một lớp trừu tượng. Nó có thể có các phương thức trừu tượng và không trừu tượng. Nó cần được extend và khai triển phương thức của nó.
Lớp trừu tượng thì không thể được khởi tạo.
Quy tắc của lớp trừu tượng trong JAVA:
- Một lớp trừu tượng phải được khai báo bằng một 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ể có 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
Ví dụ class trừu tượng trong Java:
abstract class A{}
Phương thức trừu tượng trong JAVA
Một phương thức được khai báo là abstract và không có triển khai được gọi là một phương thức trừu tượng.
Ví dụ phương thức trừu tượng trong Java:
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, XeDien là một lớp trừu tượng chỉ chứa một phương thức trừu tượng chạy. Việc thực hiện nó được cung cấp bởi lớp Vinfast.
// Khai báo class trừu tượng
abstract class XeDien{
// Khai báo phương thức trừu tượng
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 bên 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 HinhChuNhat và HinhTron.
Hầu hết, chúng ta không biết về lớp thực thi (được ẩn đối với người dùng cuối) và một đối tượng của lớp thực hiện được cung cấp bởi phương thức gốc.
Phương thức gốc là một phương thức trả về thể hiện của lớp. Chúng ta sẽ tìm hiểu về phương thức factory ở phần sau.
Trong ví dụ này, nếu bạn tạo thể hiện của lớp HinhChuNhat, phương thức ve() của lớp HinhChuNhat sẽ được gọi.
File: TestTruuTuong.java
// 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
Tiếp tục một ví dụ khác về lớp trừu tượng
File: NganHangDemo.java
abstract class NganHang{
abstract int layLaiSuat();
}
class Agri extends NganHang{
int layLaiSuat(){
return 7;
}
}
class VCB extends NganHang{
int layLaiSuat(){
return 9;
}
}
class NganHangDemo{
public static void main(String args[]){
NganHang nganHang;
nganHang = new Agri();
System.out.println("Lãi suất: "+nganHang.layLaiSuat()+" %");
nganHang = new VCB();
System.out.println("Lãi suất: "+nganHang.layLaiSuat()+" %");
}
}
Kết quả nhận được:
Lãi suất: 7 %
Lãi suất: 9 %
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().
File: TestLopTruuTuong.java
// 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 có thể 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.
File: Test.java
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 mình đã giới thiệu cho bạn về Abstract class trong Java và cũng đã có một vài ví dụ để bạn hiểu các tạo Abtract class để sử dụng.
Chúc bạn học Java tốt.