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

Java: Abstract class và Interface trong Java

Chương trình hướng đến cài đặt (interface) chứ không hướng đến triển khai (implement)"

Một số đặc điểm tính trừu tượng (Abstraction) trong Java:

– Trong Java tính trừu tượng được thể hiện thông qua sử dụng từ khóa interface hoặc abstract để khai báo.
– Để sử dụng interface hoặc abstract ta phải kế thừa từ lớp abstract (dùng từ khóa extends) hoặc thực thi một interface (dùng từ khóa implements).
– Có hai cách để thể hiện tính trừu tượng (Abstraction) trong Java:
+ Sử dụng Abstract (0 tới 100%)
+ Sử dụng Interface (100%)

1. Sử dụng Abstract trong Java

– Để định nghĩa một lớp trừu tượng cần khai báo có từ khóa  abstract
– Lớp trừu tượng có hàm tạo (Constructors), biến (Variable) và các phương thức (Methods). Lớp trừu tượng có thể có hoặc không có các phương thức trừu tượng.
tinh-truu-tuong-abstraction-trong-java-h2
– Các lớp trừu tượng không bao giờ được khởi tạo.
– Một phương thức trừu tượng không sử dụng phương thức truy cập là private, nếu để là private thì trình biên dịch sẽ báo lỗi.
tinh-truu-tuong-abstraction-trong-java-h1
– Một lớp khi kế thừa từ lớp abstract thì cần phải  @Override phương thức khai báo trong lớp cha.
tinh-truu-tuong-abstraction-trong-java-h3
– Một phương thức trừu tượng không thể là phương thức tĩnh (static)
tinh-truu-tuong-abstraction-trong-java-h4

2. Sử dụng Interface trong Java

Interface trong Java là một kiểu tham chiếu, tương tự như một Class trong Java nhưng chỉ chứa các phương thức trừu tượng. Ngoài việc chứa các phương thức trừu tượng Interface cũng có thể chứa các hằng số. Các phương thức trong Interface mặc định là public và abstract  và các biến là publicstaticfinal.
Interface trong Java tương tự như Class trong Java. Nhưng Interface chỉ mô tả các hành động của đối tượng còn Class thì mô tả các thuộc tính và hành động của đối tượng. Sau đây là điểm giống và khác nhau giữa Class và Interface trong Java.

CÁC ĐẶC ĐIỂM CỦA INTERFACE

– Giống với class, interface cũng chỉ có 2 loại access modifiers là  public  &  default
  • public: truy cập tự do từ bên ngoài (every where)
  • default: chỉ truy cập được trong nội bộ một package
– Interface không có constructor
– Về thuộc tính trong interface:
Các thuộc tính trong interface được gọi là hằng số (khai báo kèm theo từ khóa final) và mặc định có 3 đặc điểm là public static final (vì là hằng số nên tên thường được viết hoa)
1
public static final int AGE = 22;
Nếu ta chỉ khai báo thuộc tính trong interface là
1
int AGE = 22;
thì vẫn không sai, và Java sẽ ngầm hiểu đó là public static final int AGE = 22
– Về phương thức trong interface:
Những phương thức trong interface thì mặc định có 2 đặc điểm là public abstract. Vì là abstract nên không được có thân hàm (chứ không hỗn hợp như abstract class phương thức vừa có thân hàm, vừa không có, như Shape.java ở trên)
1
public abstract void show();
Nếu ta chỉ khai báo phương thức trong interface là
1
public void show();
thì vẫn không sai, và Java sẽ ngầm hiểu là public abstract void show()
– Sử dụng từ khóa extends để một interface thừa kế lại một interface
– Sử dụng từ khóa implements để một class thừa kế lại một interface
– Sau từ khóa implements được phép thừa kế nhiều Interface và cách nhau bởi dấu phẩy. Sau từ khóa extends không được thừa kế từ nhiều lớp, interface

VÍ DỤ VỚI INTERFACE

itface_example
File CanMove.java
itface_1
File CanDrink.java
itface_2
File CanEat.java
itface_3
File Animal.java
itface_4
File Cat.java
itface_5
File Mouse.java
itface_6
File AnimalDemo.java
itface_7
Kết quả
itface_8

CÂU HỎI: 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.

3. 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.

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 ộ ...