Lập Trình Hướng Đối Tượng Trong Java Bài 12: Abstract Class Và Interface Trong Java
1. Abstract class (Lớp trừu tượng):
Một lớp trừu tượng thì không có thể hiện nghĩa là ta không thể khởi tạo nó bằng toán tử new, và một phương thức trong nó là abstract thì chỉ được đưa ra định nghĩa (khai báo) mà không được thực thi và nó sẽ được override lại trong các lớp con kế thừa. Và trong lớp mà tồn tại phương thức abstract thì lớp đó cũng được định nghĩa abstract.- Lớp trừu tượng là lớp không có khai báo các thuộc tính thành phần và các phương thức.
- Bất cứ class nào kết thừa abstract class nào đó phải định nghĩa lại các abstract mothods của lớp mà nó thừa kế hoặc không định nghĩa lại nhưng phải ghi lại abstract mothods đó.
- Abstract class là class có chứa các abstract mothods
- Các methods trong abstract class phải khai báo với từ khóa abstract (không giống như interface vì interface mặc định gán abstract cho các mothods)
- Một abstract class có thể chứa cả abstract mothods và các mothods thường.
- Khi một class có chứa abstract mothod thì bắt buộc phải có từ khóa abstract đằng trước tên class đó.
Ví dụ:
abstract class A{ abstract void method_1(); } public class B extends A{ @Override public void method_1(){ // cài đặt chi tiết cho phương thức method_1 // trong lớp con B. // … } } public class C extends A{ @Override public void method_1(){ // cài đặt chi tiết cho phương thức method_1 // trong lớp con C. // … } }Lưu ý:
* Các phương thức được khai báo dùng các tiền tố private và static thì không được khai báo là trừu tượng abstract. Tiền tố private thì không thể truy xuất từ các lớp dẫn xuất, còn tiền tố static thì chỉ dùng riêng cho lớp khai báo mà thôi.
* Phương thức trong abstract class có 2 cách để khai báo:
- Khai báo bình thường như class
- Khai báo giống như interface nhưng phải có thêm từ khóa abstract
Ví dụ hoàn chỉnh:
// lop truu tuong Shape abstract class Shape{ abstract void draw(); } class Rectangle extends Shape{ void draw(){ System.out.println("Ve hinh chu nhat"); } } class Circle1 extends Shape{ void draw(){ System.out.println("Ve hinh tron"); } } //Trong tinh huong nay, phuong thuc duoc goi boi lap trinh vien hoac nguoi dung class TestAbstraction1{ public static void main(String args[]){ Shape s=new Circle1(); s.draw(); } }
2. Interface
- Như chúng ta đã biết một lớp trong java chỉ có một siêu lớp (super class) trực tiếp hay một cha duy nhất (đơn thừa kế). Để tránh đi tính phức tạp của đa thừa kế (multi-inheritance) trong lập trình hướng đối tượng, Java thay thế bằng interface. Một lớp có thể kế thừa từ nhiều interface với các lớp khác để thừa hưởng thêm vùng dữ liệu và phương thức của các interface này.- Interface được khai báo như một lớp. Nhưng các thuộc tính của interface là các hằng (khai báo dùng từ khóa final) và các phương thức của interface là trừu tượng (mặc dù không có từ khóa abstract).
- Mothods trừu tượng là các mothods chỉ có phần header, không có phần body.(Xem ví dụ phía dưới)
- Trong các lớp có cài đặt các interface ta phải tiến hành cài đặt cụ thể các phương thức này.
- Interface được định nghĩa nhằm làm cho code rành mạch hơn vì các class có thể implements các interface.
Ví dụ:
interface printable{ void print(); } class A6 implements printable{ public void print(){System.out.println("Hello");} public static void main(String args[]){ A6 obj = new A6(); obj.print(); } }
Lưu ý: Một Interface có thể kế thừa từ nhiều Interface. Ví dụ:
interface Printable{ void print(); } interface Showable{ void show(); } class A7 implements Printable,Showable{ public void print(){System.out.println("Hello");} public void show(){System.out.println("Welcome");} public static void main(String args[]){ A7 obj = new A7(); obj.print(); obj.show(); } }
3. So sánh abstract class và interface:
- Một class chỉ có thể kế thừa từ một abstract class, nhưng có thể kế thừa nhiều interface.- Trong Interface chỉ có thể khai báo các fields, methods, mà không được hiện thực nó. Còn đối với abstract thì dùng các biến, hiện thực cách methods.
- Các fields, methods trong interace đều là public và bắt buộc các class kế thừa phải cài đặt nó (abstract). Trong abstract class thì có các fields, methods có thể là private, internal, public, protected và có thể là abstract hoặc non-abstract.
- Interface dùng để gom các hành động cần được hiện thực, các khả năng của một đối tượng, còn abstract class cho các lớp thừa kế cùng 1 loại, tính chất hay trạng thái.
- Abstract class có tốc độ thực thi nhanh hơn interface.
- Thêm 1 tính năng mới vào interface sẽ phá vỡ toàn bộ các lớp hiện thực, còn abstract thì không.
- Ví dụ về interface, các thành viên của interface phải được thực thi trong các lớp mà kế thừa từ nó.
* Nhìn một cách nào đó, bạn có thể thấy rằng, Interface giống như những câu lạc bộ, và Abstract class là một ông bố trong gia đình.
Một câu lạc bộ luôn luôn có một bộ quy tắc hay nôi qui mà mọi thành viên luôn phải tuân theo.
Một ông bố trong gia đình thì khác, ông có tài sản mà con cháu có thể kế thừa, ông cũng có những qui định trong di chúc – ai là người được kế thừa tài sản của ông! Bạn có thể tham gia cùng lúc nhiều câu lạc bộ như việc một Class "kế thừa" (Implement) nhiều Interface.
Một khi đã tham gia vào CLB nào, bạn phải tuân thủ tất cả các qui tắc của CLB đó, không quan tâm bạn là thành viên của bao nhiêu CLB. Đó là việc tại sao phải Implement đầy đủ các Interface member.
CLB không để lại tài sản cho các bạn, nhưng bố của bạn thì có, ông ấy cho bạn tài sản (không nếu ông ấy không thích Laughing) và cũng bắt bạn tuân theo các qui tắc – gia qui. Và một khi đã là con của người này thì bạn không thể nào là con của người khác giống như không thể kế thừa từ nhiều Abstract Class!
Post a Comment