Chương trình hướng đến cài đặt (interface) chứ không hướng đến triển khai (implement)"
Một số đặc điểm tính trừu tượng (Abstraction) trong Java:
– Trong Java tính trừu tượng được thể hiện thông qua sử dụng từ khóa interface hoặc abstract để khai báo.
– Để sử dụng interface hoặc abstract ta phải kế thừa từ lớp abstract (dùng từ khóa extends) hoặc thực thi một interface (dùng từ khóa implements).
– Có hai cách để thể hiện tính trừu tượng (Abstraction) trong Java:
+ Sử dụng Abstract (0 tới 100%)
+ Sử dụng Interface (100%)
1. Sử dụng Abstract trong Java
– Để định nghĩa một lớp trừu tượng cần khai báo có từ khóa abstract
– Lớp trừu tượng có hàm tạo (Constructors), biến (Variable) và các phương thức (Methods). Lớp trừu tượng có thể có hoặc không có các phương thức trừu tượng.
– Các lớp trừu tượng không bao giờ được khởi tạo.
– Một phương thức trừu tượng không sử dụng phương thức truy cập là private, nếu để là private thì trình biên dịch sẽ báo lỗi.
– Một lớp khi kế thừa từ lớp abstract thì cần phải @Override phương thức khai báo trong lớp cha.
– Một phương thức trừu tượng không thể là phương thức tĩnh (static)
2. Sử dụng Interface trong Java
Interface trong Java là một kiểu tham chiếu, tương tự như một Class trong Java nhưng chỉ chứa các phương thức trừu tượng. Ngoài việc chứa các phương thức trừu tượng Interface cũng có thể chứa các hằng số. Các phương thức trong Interface mặc định là public và abstract và các biến là public, static, final.
Interface trong Java tương tự như Class trong Java. Nhưng Interface chỉ mô tả các hành động của đối tượng còn Class thì mô tả các thuộc tính và hành động của đối tượng. Sau đây là điểm giống và khác nhau giữa Class và Interface trong Java.
CÁC ĐẶC ĐIỂM CỦA INTERFACE
– Giống với class, interface cũng chỉ có 2 loại access modifiers là public & default
- public: truy cập tự do từ bên ngoài (every where)
- default: chỉ truy cập được trong nội bộ một package
– Interface không có constructor
– Về thuộc tính trong interface:
Các thuộc tính trong interface được gọi là hằng số (khai báo kèm theo từ khóa final) và mặc định có 3 đặc điểm là public static final (vì là hằng số nên tên thường được viết hoa)
1
| public static final int AGE = 22 ; |
Nếu ta chỉ khai báo thuộc tính trong interface là
1
| int AGE = 22 ; |
thì vẫn không sai, và Java sẽ ngầm hiểu đó là public static final int AGE = 22
– Về phương thức trong interface:
Những phương thức trong interface thì mặc định có 2 đặc điểm là public abstract. Vì là abstract nên không được có thân hàm (chứ không hỗn hợp như abstract class phương thức vừa có thân hàm, vừa không có, như Shape.java ở trên)
1
| public abstract void show(); |
Nếu ta chỉ khai báo phương thức trong interface là
1
| public void show(); |
thì vẫn không sai, và Java sẽ ngầm hiểu là public abstract void show()
– Sử dụng từ khóa extends để một interface thừa kế lại một interface
– Sử dụng từ khóa implements để một class thừa kế lại một interface
– Sau từ khóa implements được phép thừa kế nhiều Interface và cách nhau bởi dấu phẩy. Sau từ khóa extends không được thừa kế từ nhiều lớp, interface
VÍ DỤ VỚI INTERFACE

File CanMove.java

File CanDrink.java

File CanEat.java

File Animal.java

File Cat.java

File Mouse.java

File AnimalDemo.java

Kết quả

CÂU HỎI: TẠI SAO JAVA CHO PHÉP ĐA THỪA KẾ (MULTIPLE INHERITANCE) VỚI INTERFACE MÀ KHÔNG HỖ TRỢ ĐA THỪA KẾ VỚI CLASS?
Ví dụ một class A kế thừa từ class B và class C, giả sử cả B và C đều có chung một hàm giống hệt nhau đều có thân hàm ==> Vậy nếu A gọi hàm đó thì sẽ gọi hàm của B hay của C đây?
Để tránh sự nhầm lẫn này Java hỗ trợ đa thừa kế với interface.
Ví dụ class A implements interface B và interface C, giả sử cả B và C đều có chung một hàm giống hệt nhau nhưng cả 2 hàm đều không có thân hàm, lúc đó dù A thừa kế thằng nào thì đều phải viết lại thân hàm.
3. SỰ KHÁC NHAU GIỮA ABSTRACT CLASS VÀ INTERFACE TRONG JAVA

Việc lựa chọn giữa abstract class và interface là một quyết định phụ thuộc vào nhiều yếu tố. Bạn hãy xem khi nào sử dụng abstract class và khi nào sử dụng interface là giải pháp tốt nhất:
1. Java không hỗ trợ “multiple class level inheritance” tạm dịch “đa thừa kế lớp”, do đó, mọi class chỉ có thể có một super class. Nhưng một class lại có thể implement nhiều interface. Do vậy, trong hầu hết các trường hợp, interface là một sự lựa chọn đúng đắn cho việc cung cấp base contract cho class hierarchy.
2. Nếu có nhiều phương thức trong contract, thì bạn nên sử dụng abstract class vì nó cung cấp sẵn implementation cho một vài phương thức chung được áp dụng cho tất cả các lớp con(subclass).
3. Nếu contract của bạn thay đổi liên tục thì sử dụng interface có thể gặp những vấn đề bởi vì nó không thể thêm những phương thức trong interface mà không thay đổi ở phía class thực hiện implement nó. Với abstract thì bạn không cần lo lắng điều này, do đó trong tình huống này thì sử dụng abstract là một giải pháp hiệu quả.
Cách sử dụng hiệu quả nhất?
Trong thực tế, việc sử dụng cả abstract class và interface là một phương pháp tiếp cận hiệu quả cho việc thiết kế hệ thống. Ví dụ như trong JDK, List là một interface có rất nhiều phương thức, nhưng vẫn có song song một abstract class đó là AbstractList, nó cung cấp những skeletal implementation cho tất cả phương thức của List interface, do đó, mọi subclass có thể extend class này và chỉ implement những phương thức cần thiết.
Chúng ta nên luôn luôn bắt đầu bằng một interface như một base và define những phương thức mà mọi subclasses nên thực hiện và sau đó nếu có một số phương thức mà chỉ subclass nhất định phải implement, chúng ta có thể extend base interface này với các phương thức mới đó. Các subclasses sẽ có tùy chọn để lựa chọn giữa base interface hoặc child interface để thực hiện những yêu cầu của nó. Nếu số lượng phương thức phát triển nên nhiều, ý tưởng mới là sử dụng một abstract class để cung cấp ra bộ khung xương để implement các child interface và cung cấp sự linh hoạt cho các subclass lựa chọn giữa abstract class hoặc interface.
Nhận xét
Đăng nhận xét