Bài 5. Tính trừu tượng
Lập trình hướng đối tượng gồm 4 tính chất chính: Tính đóng gói, Tính đa hình, Tính kế thừa, Tính trừu tượng.
Nội dung chính
1. Abstract
Data Abstact
(trừu tượng dữ liệu) có nghĩa là ẩn một số chi tiết nhất định và hiển thị những thứ cần thiết cho người dùng.
💡 Hiểu đơn giản thì bạn gọi một món ăn thì bạn không cần phải biết quy trình nấu ăn, công thức nấu... chỉ cần ăn thôi.
Từ khoá abstract
là một non-access modifier
, sử dụng cho classes
và methods
:
Abstract class
: đây là mộtclass
không được sử dụng để tạoObject
(nó chỉ dùng để kế thừa).Abstact method
: có thể sử dụng trongAbstract class
và không có phầnbody
(phầnbody
được cung cấp bởisubclass
hoặc kế thừa từ nó).
Lớp trừu tượng
abstract class Animal { //lớp trừu tượng
public abstract void animalSound(); //phương thức trừu tượng
public void sleep() {
System.out.println("Zzz");
}
}
Thực thi
⚠️ Không thể tạo Object
từ một lớp Abstract
như sau :
Animal myObj = new Animal(); // sẽ lỗi
TIP
- Lớp trừu tượng không thể khởi tạo bằng từ khóa
new
- Để sử dụng được lớp trừu tượng, ta cần tạo một lớp thỏa mãn hai yêu cầu sau:
- Lớp này không phải là lớp trừu tượng (Abstract Class)
- Lớp này sẽ kế thừa và trở thành lớp con của lớp trừu tượng
//khai báo lớp abstract
abstract class Animal{
public abstract void animalSound();
public void sleep(){
System.out.println("Zzz");
}
}
//khai báo subclass (kế thừa từ lớp Animal)
class Cat extends Animal{
public void animalSound(){
System.out.println("mèo méo meo mèo meo");
}
}
class Main{
public static void main(String[] args){
Cat myCat = new Cat();
myCat.animalSound();
myCat.sleep();
}
}
/* mèo méo meo
Zzz */
💡 Như bạn đã thấy,
abstract class
chỉ cho phép kế thừa nó, và ta sử dụng thôi, dễ mà !!!
🚀 Ta sử dụng tính
Abstract
(trừu tượng) để :
- Bảo đảm tính bảo mật (ẩn các chi tiết quan trọng và chỉ hiển thị thứ cần thiết)
2. Interface
Interfect
là một bản thiết kế cho abstract class
, được sử dụng để nhóm các methods
với phần body
trống :
//interface
interface Animal{
public void animalSound();//không có body => gọi là interface methods =
public void run();//không có body => gọi là interface method, cũng được xem là phương thức trừu tượng
}
Để truy cập vào Interface Methods
ta phải dùng từ khoá implements
(thay vì sử dụng extends
) như sau :
interface Animal{
public void animalSound();
public void run();
}
class Cat implements Animal{
public void animalSound(){
System.out.println("Con mèo kêu : mèo méo meo");
}
}
class Main{
public static void main(String[] args){
Cat myCat = new Cat();
myCat.animalSound();
myCat.sleep();
}
}
/* Con mèo kêu mèo méo meo
Zzz, khò khò */
Interface
Tính chất của
- Các
Interface methods
không có phầnbody
, được cung cấp bởi lớpimplement
- Về việc dùng
Interface
, bạn phải ghi đè lại tất cảmethods
- Mặc định thì
Interface methods
làabstract
vàpublic
- Mặc định thì
Interface attributes
làpublic
,static
,final
Các lưu ý
- Giống như
abstract class
,interface
không sử dụng để tạoObject
- Một
Interface
không thể chứaconstructor
Interface
?
Tại sao ta phải sử dụng - Để được sử bảo mật an toàn.
Java
không hỗ trợmultiple inheritance
(đa kế thừa), tức là mộtclass
có thể kế thừa từ mộtsubclass
==> Tuy nhiên ta có thể làm được điều đó bằng cách sử dụngInterface
(Xem lại bài Tính kế thừa)
💭 Đơn giản hơn là khi bạn vào nhà hàng, người ta sẽ đưa cho bạn cái menu chọn món, chứ không ai lại dẫn bạn vào nhà bếp coi món nào để chọn ==>
Interface
là cái menu đó.
So sánh Interface và Absctract
Các phương thức
- Tất cả phương thức trong Interface đều là phương thức trừu tượng (không có phần thân). Từ Java8 có thêm các phương thức
default
,static
- Abstract Class thì có cả các loại phương thức khác
Các biến
- Trong Interface, các biến là
final
(constant) vàstatic
- Abstract Class có thể
final
hoặc không,static
hoặc không
Thực thi
- Để triển khai một Interface ta sẽ dừng từ khóa implements
- Abstract Class thì dùng extends
Kế thừa
- Interface có thể extends từ các Interfaces khác
- Abstract Class thể thể extends một lớp khác và implements nhiều interfaces
Trừu tượng
- Interface đạt được trừu tượng toàn phần (chứa các
non-abstract method
) - Abstract Class chỉ đath trừu tượng một phần
Khả năng truy cập
- Interface mặc định các methods, attribute là
public
- Abstract Class có thể tất cả như
private
,protected