Trong Java, Interface là một khuôn mẫu (template) chứa các phương thức trừu tượng và các hằng số. Interface được sử dụng để xác định các hành vi mà các lớp phải thực hiện nhưng không cung cấp cách thực hiện chúng.
Interface giúp:
- Định nghĩa một tập hợp các quy tắc mà các lớp thực thi phải tuân theo.
- Hỗ trợ tính đa kế thừa, điều mà Java không cho phép với các lớp thường.
Video Source KeepOnCoding
Danh mục bài viết
Toggle1. Tính năng chính của Interface
- Chỉ chứa các phương thức trừu tượng (từ Java 8 có thêm các phương thức mặc định và phương thức static).
- Không thể chứa biến thông thường, chỉ chứa các hằng số (biến
static
vàfinal
). - Không thể khởi tạo trực tiếp, mà phải được thực thi (implemented) bởi một lớp hoặc mở rộng (extended) bởi một Interface khác.
- Một lớp có thể thực thi nhiều Interface (đa kế thừa).
2. Cách khai báo Interface
Cú pháp khai báo interface trong Java
interface InterfaceName {
// Các hằng số
public static final int CONSTANT = 10;
// Các phương thức trừu tượng
public void method1();
// Phương thức mặc định (từ Java 8)
default void defaultMethod() {
System.out.println("Default method in Interface");
}
// Phương thức static (từ Java 8)
static void staticMethod() {
System.out.println("Static method in Interface");
}
}
2. Cách khai báo Interface
Ví dụ về interface trong Java
interface Animal {
void eat(); // Phương thức trừu tượng
void sleep(); // Phương thức trừu tượng
}
3. So sánh Interface và Abstract Class
Tiêu chí | Interface | Abstract Class |
---|---|---|
Từ khóa | interface | abstract |
Phương thức | Chỉ chứa phương thức trừu tượng (Java 8 có thêm default và static ). | Có thể chứa cả phương thức trừu tượng và không trừu tượng. |
Biến | Chỉ chứa hằng số (static và final ). | Có thể chứa biến thông thường. |
Đa kế thừa | Một lớp có thể thực thi nhiều Interface . | Một lớp chỉ có thể kế thừa một Abstract Class . |
Mục đích | Định nghĩa hành vi (behavior). | Định nghĩa một phần triển khai sẵn (partial implementation). |
4. Ví dụ minh họa Interface
Ví dụ 1: Sử dụng Interface cơ bản
interface Animal {
void eat();
void sleep();
}
class Dog implements Animal {
public void eat() {
System.out.println("Dog eats bones");
}
public void sleep() {
System.out.println("Dog sleeps 8 hours a day");
}
public static void main(String[] args) {
Dog dog = new Dog();
dog.eat();
dog.sleep();
}
}
Ví dụ 2: Interface với nhiều lớp thực thi
interface Vehicle {
void start();
void stop();
}
class Car implements Vehicle {
public void start() {
System.out.println("Car starts with a key");
}
public void stop() {
System.out.println("Car stops with brakes");
}
}
class Bike implements Vehicle {
public void start() {
System.out.println("Bike starts with a kick");
}
public void stop() {
System.out.println("Bike stops with disc brakes");
}
}
public class TestVehicle {
public static void main(String[] args) {
Vehicle car = new Car();
Vehicle bike = new Bike();
car.start();
car.stop();
bike.start();
bike.stop();
}
}
Ví dụ 3: Interface kế thừa Interface khác
interface Animal {
void eat();
}
interface Mammal extends Animal {
void walk();
}
class Human implements Mammal {
public void eat() {
System.out.println("Human eats cooked food");
}
public void walk() {
System.out.println("Human walks on two legs");
}
}
public class TestHuman {
public static void main(String[] args) {
Human human = new Human();
human.eat();
human.walk();
}
}
5. Ưu điểm và nhược điểm của Interface
Ưu điểm:
- Đa kế thừa: Một lớp có thể thực thi nhiều Interface.
- Tính module hóa: Tách biệt rõ ràng các hành vi (behavior) cụ thể.
- Tăng tính linh hoạt: Các lớp thực thi Interface có thể triển khai theo nhiều cách khác nhau.
Nhược điểm:
- Không hỗ trợ triển khai sẵn: Toàn bộ logic phải được viết lại trong các lớp thực thi.
- Hạn chế với các tính năng phức tạp: Chỉ nên sử dụng Interface để định nghĩa hành vi đơn giản.
6. Câu hỏi thường gặp về Interface
Q: Interface có thể chứa constructor không?
A: Không, Interface không thể chứa constructor vì nó không thể khởi tạo đối tượng.
Q: Một Interface có thể kế thừa từ một Interface khác không?
A: Có, một Interface có thể kế thừa từ một hoặc nhiều Interface khác bằng từ khóa extends
.
Q: Một lớp có thể kế thừa nhiều Interface không?
A: Có, Java cho phép một lớp thực thi nhiều Interface, ví dụ:
class MyClass implements Interface1, Interface2 {
// Triển khai các phương thức của Interface1 và Interface2
}
Kết luận
Interface là một phần quan trọng trong Java, giúp định nghĩa các hành vi và hỗ trợ tính đa kế thừa. Để làm chủ lập trình Java, bạn cần nắm vững cách sử dụng Interface, cũng như cách kết hợp chúng với các tính năng khác của ngôn ngữ.
Tham khảo thêm: