Sự khác nhau giữa Abstract class với Interface trong Java
Abstract Class – Interface
Bạn vẫn nghe trong Java không hỗ trợ đa thừa kế (nhằm tránh sự phức tạp, xung đột code)
và để nhằm khắc phục vấn đề đó ta dùng interface (Cho phép nhiều class implements nhiều interface).
Vậy sự khác nhau giữa abstract class với interface là gì, cách dùng chúng trong mỗi trường hợp ra sao?
1. Ý nghĩa của abstract class và interface
- abstract class:
Bạn nên nhớ Java là ngôn ngữ hướng đối tượng, dùng abstract class nó mang ý nghĩa là thừa kế bản chất của đối tượng.
Ví dụ Student extends Person
hoàn toàn hợp lý vì học sinh và người đều cùng bản chất, nhưng Student extends Car
lại không hợp lý, vì học sinh và ô tô khác hoàn toàn nhau về bản chất.
- interface:
Khi nói tới interface người ta thường dùng cho hành động nhiều hơn
Với abstract class thì người ta sẽ gộp chung các thuộc tính lại, còn với interface thì người ta sẽ gộp chung các hành động lại.
Ví dụ Student implements Run
học sinh có thể thực hiện hành động chạy, Student implements Eat
học sinh có thể thực hiện hành động ăn –> Student implements Run, Eat
học sinh có thể thực hiện cả 2 hành động là chạy và ăn –> hoàn toàn hợp lý
Túm lại:
- Abstract class thiên về bản chất của đối tượng (các thuộc tính)
- Interface thiên về các hành động của đối tượng (các method).
2. Sự khác nhau trong cài đặt abstract class và interface
Từ ý nghĩa mà abstract class với interface cũng có những khác nhau trong cài đặt:
Abstract class | Interface |
1 abstract class chỉ có thể extends 1 và chỉ một class /abstract class khác | 1 interface có thể extends nhiều interface khác; interface chỉ có thể extends interface không thể extends class |
Trong abstract class có thể có concrete method hoặc abstract method | Trong interface, mọi method đều là abstract method
(*Từ Java 8 cho phép thêm method không phải là abstract vào interface bằng từ khóa default) |
Trong abstract class khi muốn tạo abstract method bắt buộc phải có từ khóa abstract | Từ khóa abstract có thể có hoặc không. |
abstract method trong abstract class có thể là public hoặc protected | abstract method trong abstract class chỉ có thể là public
(*Từ Java 9 cho phép thêm method private và private static vào Interface) |
Trong abstract class, các thuộc tính có thể final, static, public, private, protected | Trong Interface, mọi thuộc tính đều là public static final |
Sự khác nhau giữa Abstract class với Interface trong Java.
References:
https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html