Nội dung chính
Sự khác nhau giữa Abstract class và Interface
Abstract class và interface đều được sử dụng để có được sự trừu tượng mà ở đó chúng ta có thể khai báo các phương thức trừu tượng. Nhưng có một vài sự khác nhau giữa abstract class và interface được liệt kê trong bảng sau:
| Abstract class | Interface |
|---|---|
| 1) Abstract class có phương thức abstract (không có thân hàm) và phương thức non-abstract (có thân hàm). | Interface chỉ có phương thức abstract. Từ java 8, nó có thêm các phương thức default và static. |
| 2) Abstract class không hỗ trợ đa kế thừa. | Interface có hỗ trợ đa kế thừa |
| 3) Abstract class có các biến final, non-final, static and non-static. | Interface chỉ có các biến static và final. |
| 4) Abstract class có thể cung cấp nội dung cài đặt cho phương thức của interface. | Interface không thể cung cấp nội dung cài đặt cho phương thức của abstract class. |
| 5) Từ khóa abstract được sử dụng để khai báo abstract class. | Từ khóa interface được sử dụng để khai báo interface. |
| 6) Ví dụ: public abstract class Shape { public abstract void draw(); } |
Ví dụ: public interface Drawable { void draw(); } |
Đơn giản để hiểu, đó là abstract class có được trừu tượng 1 phần (0 tới 100%), còn interface có được trừu tường toàn phần (100%).
Ví dụ về abstract class và interface trong java
Ví dụ sau là sự kết hợp giữa abstract class và interface.
//tạo interface có 4 phương thức
interface A {
void a();
abstract void b();
public void c();
public abstract void d();
}
// tạo abstract class cung cấp cài đặt cho một phương thức của interface A
abstract class B implements A {
public void c() {
System.out.println("I am C");
}
}
// tạo subclass của abstract class B, cung cấp cài đặt cho các phương thức còn lại
class M extends B {
public void a() {
System.out.println("I am a");
}
public void b() {
System.out.println("I am b");
}
public void d() {
System.out.println("I am d");
}
}
// tạo lớp Test5 để gọi các phương thức của interface A
public class Test5 {
public static void main(String args[]) {
A a = new M();
a.a();
a.b();
a.c();
a.d();
}
}
Output:
I am a I am b I am C I am d