Đặc điểm của một class trừu tượng là:
- Nó được khai báo abstract.
- Nó có thể khai báo 0, 1 hoặc nhiều method trừu tượng bên trong.
- Không thể khởi tạo 1 đối tượng trực tiếp từ một class trừu tượng.
Các đặc điểm của interface
- Interface luôn luôn có modifier là: public interface, cho dù bạn có khai báo rõ hay không.
- Nếu có các trường (field) thì chúng đều là: public static final, cho dù bạn có khai báo rõ hay không.
- Các method của nó đều là method trừu tượng, nghĩa là không có thân hàm, và đều có modifier là: public abstract, cho dù bạn có khai báo hay không.
- Interface không có Constructor (cấu tử)
Interface không phải là một bản thiết kế, nó là một giao ước hay một hợp đồng, yêu cầu các lớp implement nó phải có những chức năng này.
Abstract classlà một lớp trừu tượng, trừu tượng nghĩa là... không có thực, hay object của nó không có ý nghĩa. Lớp abstract hoàn toàn có thể không có bất cứ một phương thức abstract nào nha bạn.
Nó liên quan đến tư tưởng thiết kế hơn là về mặt chức năng. Tên những interface thường là tính từ, Runnable, Throwable hoặc một "giao diện", một từ đặc tả một nhóm chức năng nào đó... Còn tên của abstact class là các danh từ, nhưng những danh từ này ko có object có ý nghĩa trên thực tế, như Animal.
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.
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.
Từ JDK 8 trở đi, bạn có thể có nhiều implement phương thức trong nhiều interface. Tức là bạn có thể tạo ra mặc định như những static phương thức trong những interface và cung cấp implementation cho chúng. Điều này sẽ thu hẹp khoảng cách giữa interface và abstract class, và bây giờ, interface là cách thực hiện tốt nhất. Để biết thêm chi tiết về điểm thay đổi này trên JDK 8, bạn vui lòng đọc tài liệu JDK 8
What exactly is the difference between an interface and abstract class?
An interface is a contract: The guy writing the interface says, "hey, I accept things looking that way", and the guy using the interface says "OK, the class I write looks that way".
An interface is an empty shell. There are only the signatures of the methods, which implies that the methods do not have a body. The interface can't do anything. It's just a pattern.
Implementing an interface consumes very little CPU, because it's not a class, just a bunch of names, and therefore there isn't any expensive look-up to do. It's great when it matters, such as in embedded devices.
Abstract classes
Abstract classes, unlike interfaces, are classes. They are more expensive to use, because there is a look-up to do when you inherit from them.
Abstract classes look a lot like interfaces, but they have something more: You can define a behavior for them. It's more about a guy saying, "these classes should look like that, and they have that in common, so fill in the blanks!".
Implementation
While abstract classes and interfaces are supposed to be different concepts, the implementations make that statement sometimes untrue. Sometimes, they are not even what you think they are.
In Java, this rule is strongly enforced, while in PHP, interfaces are abstract classes with no method declared.
In Python, abstract classes are more a programming trick you can get from the ABC module and is actually using metaclasses, and therefore classes. And interfaces are more related to duck typing in this language and it's a mix between conventions and special methods that call descriptors (the __method__ methods).
As usual with programming, there is theory, practice, and practice in another language :-)
*******************
660
down vote
The key technical differences between an abstract class and an interface are:
Abstract classes can have constants, members, method stubs (methods without a body) and defined methods, whereas interfaces can only have constants and methods stubs.
Methods and members of an abstract class can be defined with any visibility, whereas all methods of an interface must be defined as public (they are defined public by default).
When inheriting an abstract class, a concrete child class must define the abstract methods, whereas an abstract class can extend another abstract class and abstract methods from the parent class don't have to be defined.
Similarly, an interface extending another interface is not responsible for implementing methods from the parent interface. This is because interfaces cannot define any implementation.
A child class can only extend a single class (abstract or concrete), whereas an interface can extend or a class can implement multiple other interfaces.
A child class can define abstract methods with the same or less restrictive visibility, whereas a class implementing an interface must define the methods with the exact same visibility (public).
Nhận xét
Đăng nhận xét