Chuyển đến nội dung chính

Abstract class và Interface trong Java

Đặc điểm của một class trừu tượng là:
  1. Nó được khai báo abstract.
  2. Nó có thể khai báo 0, 1 hoặc nhiều method trừu tượng bên trong.
  3. 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

  1. Interface luôn luôn có modifier là: public interface, cho dù bạn có khai báo rõ hay không.
  2. 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.
  3. 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.
  4. 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

so_sanh_abstract_class_interface
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

Bài đăng phổ biến từ blog này

Entry Test của FPT

IQ - Kiểm tra tư duy logic (8/20) - GMAT- Kiểm tra khả năng tính toán trong thời gian ngắn (8/20) - Tiếng Anh (18-> 25/50) - Các bài thi chuyên môn - FE (8/20) IQ: lên mạng tìm "IQ test" là ra đầy. + GMAT: Những câu trắc nghiệm tính toán đơn giản kiểu như sau:  1 . Một shop thời trang sale off quần jeans 15 %, quần jeans giá 450 $, người mua đưa 500 $, hỏi cashier trả lại bao nhiêu $ tiền thừa.? 2 . 100 % là 180 , vậy 150 là bao nhiêu %? Tiếng anh: Cỡ như thi TOEIC thôi. Chuyên môn: Mobile thì trắc nghiệm Java. Qúa trình tuyển như sau :v Lần 1: Test IQ, Tiếng Anh( mình làm í ẹ khoảng 50% mà vẫn được) , Java Lân 2: được gọi điện lên :)) + Gioi thiệu bản thân + Họ chỉ hỏi các câu căn bản như: -. OOP: là gì, 4 tính chất, ví dụ, khác nhau giữa interface và abstract - CODE: hầu toàn các bài toán vòng for :)) , cẩn thận mấy câu kế thừa. SQL (distinct, view, function, cursor, store procedure, ...v.v.), nhớ có câu cộng 2 số int không dùng biến đệm hơi khoai haha + Nói ch...

Java: Java Package-Thư viện trong Java

Giới thiệu về Package Các bạn mới học lập trình Java thường không dể ý tới package vì các bạn toàn tạo file .java vào cùng 1 chỗ, không cần sắp xếp, không cần quản lý truy nhập. Nhưng để tăng kỹ năng lập trình với Java, các bạn cần phải tìm hiểu về package trong Java. Các bạn có thể tham khảo định nghĩa sau: Package được dùng để đóng gói các lớp trong chương trình lại với nhau thành một khối. Đây là cách tốt nhất để lưu trữ các lớp gần giống nhau hoặc có cùng một module thành một khối thống nhất – để đáp ứng 1 khối chức năng. Từ đây mình sẽ giới thiệu thêm với các bạn các câu lệnh nhâp khẩu,nó có định dạng như sau : Định dạng :  import javaPackageNameImport;    Nó giống như khai báo thư viện ở các ngôn ngữ lập trình khác.Như vậy,chỉ khi các bạn nhập khẩu chúng,các bạn mới có thể sử dụng thư viện mà chúng cung cấp cho ta. VD :    import java.util.Date;   import java.text.SimpleDateFormat; Lưu ý : -Các câu lệnh nhập khẩu rất nhiều và...

Khác nhau giữa Array và ArrayList và HashMap

Collection bản chất là tập các lớp dùng để lưu trữ danh sách và có khả năng tự co giãn khi danh sách thay đổi : Thêm , sửa , xóa , chèn … Hai lớp Collection thường được sử dụng nhiều nhất là ArrayList và Hashmap Giới thiệu về ArrayList ArrayList sử dụng cấu trúc mảng để lưu trữ phần tử , tuy nhiên có hai đặc điểm khác mảng : Không cần khai báo trước kiểu phần tử . Không cần xác định trước số lượng phần tử ( kích thước mảng ). N ó có kh ả năng truy c ậ p ph ầ n t ử ng ẫ u nhiên (Do th ừ a k ế t ừ interface RandomAccess ). P hương thức khởi tạo ● ArrayList () ● ArrayList (Collection c) ● ArrayList ( int initialCapactity ) Các phương thức chính ● add(Object o) ● remove(Object o) ● get( int index) ● size() ● isEmpty () ● contains(Object o) ● clear() Giới thiệu về HashMap ● Là ki ể u t ậ p h ợ p t ừ đ i ể n, HashMap cho phép truy xu ấ t tr ự c ti ế p t ớ i m ộ ...