Java Bài 32: Tính Trừu Tượng (Abstraction) | Hỏi gì?

Chào mừng các bạn đã đến với bài học Java số 32, bài học về tính trừu tượng (abstraction). Đây là bài học trong chuỗi bài về lập trình ngôn ngữ Java của Yellow Code Books.

Với việc đi qua bài học hôm nay thì chúng ta cũng sẽ nói đủ bốn đặc tính cốt lõi trong lập trình hướng đối tượng. Bốn đặc tính đó là:

– Tính Gói ghém dữ liệu, hay còn gọi là Encapsulation. Bạn có thể xem lại tính chất này ở các bài: khả năng truy cập, getter/setter. – Tính Kế thừa, hay còn gọi là Inheritance. Bạn có thể xem lại tính chất này ở các bài: kế thừa, overriding, overloading. – Tính Đa hình, hay còn gọi là Polymorphism. Bạn có thể xem lại tính chất này ở bài về polymorphism. – Và hôm nay. Tính Trừu tượng, hay còn gọi là Abstraction.

Nghe qua thì thấy rất trừu tượng. Liệu kiến thức này có khó hiểu không và nó giúp ích gì cho việc tổ chức code trong OOP? Chúng ta cùng đi vào bài học luôn nhé.

Tính Trừu Tượng (Abstraction) Là Gì?

Trừu tượng trong thực tế còn có thể hiểu là cái gì đó không có thực. Vậy tính Trừu tượng trong OOP ý muốn nói đến một lớp nào đó mang một đặc tính trừu tượng, không có thực. Và như vậy bạn có thể hiểu là lớp Trừu tượng sẽ là lớp không tồn tại đúng không nào?

Thực ra thì lớp Trừu tượng vẫn có tồn tại, vẫn là một lớp thôi. Nhưng nó trừu tượng ở chỗ, nó không thể được dùng để tạo ra các đối tượng như những lớp bình thường khác. Lớp Trừu tượng khi này chỉ là cái “xác không hồn”, hay bạn có thể hiểu nó chỉ là một cái sườn, để mà bạn có thể tạo ra các lớp con của nó dựa vào sự ràng buộc từ cái sườn này.

Nghe đến đây đủ thấy trừu tượng rồi ha. Chúng ta cùng xem khai báo một lớp là Trừu tượng là như thế nào, và các đặc điểm của một lớp Trừu tượng sẽ ra sao với mục kế tiếp.

Khai Báo Lớp Trừu Tượng Như Thế Nào?

Sau đây là cú pháp để bạn có thể khai báo một lớp Trừu tượng.

abstract class tên_lớp { các_thuộc_tính; các_phương_thức; }

Bạn có thể thấy, để khai báo một lớp là Trừu tượng, chỉ cần thêm vào trước từ khóa class một từ khóa abstract mà thôi.

Nhưng như vậy thì mục đích của sự Trừu tượng này là gì, chúng ta cùng đi đến mục sau đây.

Tại Sao Phải Trừu Tượng?

Lý do tiên quyết mà bạn phải biết đến Trừu tượng là vì có trên 90% khả năng bạn đi xin việc, người phỏng vấn sẽ hỏi bạn câu này: “em hãy giúp phân biệt giữa lớp abstract và interface”!!! Mình đùa thôi! Nhưng họ hỏi thật đấy!

Thực ra lý do để khai báo một lớp Trừu tượng là vì trong lớp có ít nhất một phương thức Trừu tượng. Có thể nói ngược lại cho dễ hiểu như sau, nếu mà một lớp có ít nhất một phương thức được định nghĩa là Trừu tượng, thì lớp đó phải khai báo Trừu tượng. Đến đây bạn sẽ có rất nhiều thắc mắc, mình xin giải đáp từ từ.

Phương thức Trừu tượng là gì? Chính là phương thức có định nghĩa từ khóa abstract khi khai báo. Cú pháp khai báo một phương thức Trừu tượng cũng giống như khai báo một lớp Trừu tượng thôi.

[kả_năng_truy_cập] abstract kiểu_trả_về tên_phương_thức ([ các_tham_số_truyền_vào”]);

Phương thức Trừu tượng có tác dụng gì? Phương thức có khai báo abstract sẽ buộc phải không có thân hàm. Như bạn xem cú pháp ở trên, sẽ không có thông tin về khối lệnh của phương thức dạng này. Bạn có thể so sánh với cú pháp của phương thức bình thường ở đây. Bạn chỉ có thể khai báo tên, các tham số truyền vào (nếu có), kiểu trả về, và rồi kết thúc khai báo bằng (;) cho các phương thức Trừu tượng. Có thể thấy rõ sự ràng buộc của tính Trừu tượng bắt đầu ở ngay đây. Sở dĩ các phương thức Trừu tượng không có thân hàm, vì chúng không cần phải làm vậy. Một khi có một lớp nào đó kế thừa từ lớp Trừu tượng này, thì lớp kế thừa đó buộc phải hiện thực (tiếng Anh gọi là implement) nội dung cho tất cả các phương thức Trừu tượng này, bằng cách override lại chúng.

Đến đây bạn có thể thấy lớp Trừu tượng thực sự không quá cao siêu. Nó chỉ là một lớp không có thể hiện (không thể khởi tạo đối tượng từ nó). Nhưng nó lại ràng buộc các lớp con của nó buộc phải hiện thực nội dung cho các phương thức Trừu tượng bên trong nó. Thế thôi.

Bạn có thể bắt gặp tính Trừu tượng này ở đâu đó khi sử dụng các gói thư viện từ hệ thống (thỉnh thoảng có nơi gọi là Java platform) hoặc từ các nhà phân phối khác. Khi bạn kế thừa các lớp của họ, bỗng dưng hệ thống báo lỗi và bắt bạn phải override ngay phương thức nào đó của lớp đó, thì chắc chắn bạn sẽ hiểu ngay lớp đó chính là lớp Trừu tượng. Một lát nữa chúng ta cùng khảo sát xem trong hệ thống thì lớp nào là lớp Trừu tượng nhé, sau khi đi qua bài thực hành bên dưới.

Qua bài thực hành này thì bạn đã hiểu được mục đính và cách thức ràng buộc của một lớp Trừu tượng rồi đúng không nào. Mục cuối cùng này mình sẽ dẫn chứng cho bạn xem một số lớp Trừu tượng được xây dựng sẵn trong thư viện của Java, để bạn có một sự hiểu biết rộng hơn về kiến thức này.

Trải Nghiệm Một Vài Lớp Trừu Tượng Của Java Platform

Việc trải nghiệm này chỉ để kiểm chứng một số lớp Trừu tượng có sẵn từ hệ thống. Chúng ta không hoàn toàn lúc nào cũng phải kế thừa từ các lớp này, trừ khi bạn muốn override một số phương thức của nó để mở rộng hơn khả năng của lớp gốc, người ta gọi hành động này là custom lại một đối tượng. Bạn sẽ bắt gặp nhiều hơn đến việc custom cho các lớp Trừu tượng của hệ thống này khi xây dựng ứng dụng Android.

Trải nghiệm đầu tiên. Nếu bạn thử xây dựng một lớp, rồi kế thừa từ lớp Graphics của hệ thống, bạn sẽ nhận được sự “mời gọi” phải hiện thực hàng tá phương thức Trừu tượng từ lớp này.

Tính trừu tượng - Kế thừa từ lớp trừu tượng Graphics

Điều này tương tự nếu bạn kế thừa từ lớp Number.

Tính trừu tượng - Kế th
ừa từ lớp trừu tượng Number

Hoặc với lớp DateFormat và với nhiều lớp khác trong Java platform.

Tính trừu tượng - Kế thừa từ lớp trừu tượng DateFormat

Vậy thôi, đủ để bạn thấy là Java platform đã xây dựng sẵn rất nhiều lớp Trừu tượng. Sau này nếu có gặp phải bất kỳ một đòi hỏi phải implement các phương thức khi bạn kế thừa một lớp lạ hoắc nào đó, thì bạn đã biết lớp đó chính là lớp Trừu tượng. Với việc khảo sát một số lớp Trừu tượng từ hệ thống như vậy thì chúng ta cũng đã kết thúc bài học hôm nay.

Bài Kế Tiếp

Chúng ta sẽ nói đến một anh em gần gũi với sự Trừu tượng, người ta thường mang hai anh em ra so sánh với nhau, đó là kiến thức về Interface.