Please enable JavaScript.
Coggle requires JavaScript to display documents.
LESSON 04 - TÍNH CHẤT CỦA OOP - Coggle Diagram
LESSON 04 - TÍNH CHẤT CỦA OOP
1. ENCAPSULATION
TCĐG được thể hiện qua Access modifier
private
: đóng gói trong phạm vi Class (hiện tại)
public
: dùng ở đâu cũng được
__ : chỉ đóng gói trong phạm vi package (hiện tại)
protected
:
TCĐG cho Class/Interface/Abstract class/Enum
public
: dùng ở đâu cũng được
__ : dùng trong phạm vi package
Ứng dụng
Khi tạo Class => các thuộc tính nên cho "
private
" => Để class nào quản lý thông tin của class đó,
lấy ví dụ về việc chuyển lương của cty và nhân viên
các thuộc tính (phương thức) nào có thể sử dụng bên trong package hiện tại =>
Lấy VD EmployeeA1, EmployeeA2
2. POLYMORPHISM
2.1 Đa hình trong phương thức
Overloading
2 hoặc nhiều phương thức thuộc cùng 1 class trùng tên
Khác số lượng tham số truyền vào
Khác ít nhất 1 KDL truyền vào của tham số
VD: Class X --> sum(int a, int b), sum (int a, int b, int c)
Override
2 hay nhiều phương thức được gọi là override khi:
các phương thức thuộc các class có quan hệ thừa kế
hàm trong class Con định nghĩa lại nội dung của hàm trong class Cha
thừa kế được cả thuộc tính và phương thức
chỉ override được phương thức
VD: toString();
2.2 Đa hình trong đối tượng
Là 1 đối tượng/biến có KDL lớp Cha lúc compile, có thể tham chiếu/trỏ đến KDL của các lớp con lúc runtime
VD:
Cha => Shape
Con => Rectangle, Circle, Square
2.3 Câu hỏi khác
Vì sao không lấy class hiện tại new class hiện tại
mà phải lấy class cha new class con?
Dễ dàng ép kiểu/gán giá trị qua về giữa các biến có KDL thuộc nhóm cha-con. Vì tất cả đều là KDL cha lúc compile (VD phía trên)
Có thể gộp/gom tất cả các phần tử có KDL cha-con vào 1 mảng/danh sách có KDL của cha
Thỏa mãn tính chất trong design pattern => factory pattern
Vì sao KDL cha = new KDL con => OK
KDL con = new KDL cha => fail???
Lúc compile => sq có thể truy cập hàm x và y
Nhưng lúc runtime => sq sẽ vào các hàm trong Cha, mà trong Cha ko có y => fail
lúc gán cha cho con => con và cha cùng trỏ đến ô nhớ của cha (H1)
sh = sq => OK
sq (H1) = sh (H1) => Fail
Shape sh = new Shape(); => H1 => method: x
Square sq = new Square(); => H2 => method: x, y
==> JAVA bắt lỗi ngay tại lúc Compile
3. INHERITANCE
3.1 Tính chất thừa kế là gì?
Khi các class muốn dùng trong dự án, có phương thức và thuộc tính trùng nhau, thay vì ở mỗi class lặp đi lặp lại các phương thức và thuộc tính chung đó => gây trùng lặp code
Giải quyết: tạo class cha chứa các phương thức và thuộc tính chung đó. Sau đó mỗi class con sẽ kế thừa từ cha, muốn mở rộng (extends) hoặc override thì tạo thêm ở class con
3.2 Ví dụ, code demo
---------- Thừa kế thuộc tính -----------
class Book: id, name, publisher
class ClassicalBook extends Books
=> status
class ReferenceBook extends Books
=> tax
---------- Thừa kế phương thức ----------
interface Shape
=> void calS();
class Rectangle implements Shape
=> Override "void calS();"
3.3 KDL Cha có thể là ai?
abstract class
interface
class
3.4 Phân biệt class, abstract class, interface
---------- Abstract class ----------
chứa thuộc tính và phương thức bình thường & trừu tượng
→ cha là [abstract] class thì class con chỉ kế thừa duy nhất 1 [abstract] class
---------- Interface ----------
chứa thuộc tính và phương thức trừu tượng
thuộc tính trong interface bắt buộc phải khởi tạo giá trị
→ vì không thể override trong lớp con
→ mặc định là static
→ hiếm khi tạo biến/thuộc tính trong interface
→ cha là interface thì class con có thể kế thừa từ 1 hoặc nhiều interface
---------- Class ----------
chứa thuộc tính và phương thức bình thường
3.5 interface mở rộng từ JAVA08 đến hiện tại
Có thể chứa
phương thức trừu tượng
phương thức bình thường: không bắt buộc phải override
↓
private, default, static return_type method_name(..) {}
Interface => 1/N hàm trừu tượng => có 3 cách để override hàm trừu tượng
Cách 1: Tạo
class con
implements từ interface
→ override abstract method
Cách 2:
→
new
trực tiếp interface =>
anonymous class
→ override abstract method
Cách 3:
→
functional interface
FunctionalInterface
→
Để tạo đối tượng
/thể hiện/giá trị
cho biến kiểu functional interface
→ sử dụng
anonymous function
(lambda expression)
3.6 1 KDL con có thể kế thừa từ một hoặc nhiều KDL cha không, vì sao?
con: class/abstract class/interface
cha: class/abstract class/interface
----- Khi KDL con là
CLASS
-----
→ chỉ được kế thừa (extends) duy nhất từ 1 CLASS cha
↓
Nếu như 1 class con kế thừa từ nhiều class cha
Trong trường hợp các class cha có chung hàm (khai báo) và các phương thức lại ko bắt buộc override trong class con
con kế thừa dùng mặc định các hàm chung từ class cha
con gọi phương thức chung đó => ko biết gọi ai
error first (JAVA bắt lỗi ngày từ đầu) => ko cho extends từ nhiều class cha
-----
có thể thực thi (implements) từ N interface cha
-----
Phương thức trong INTERFACE cha => bắt buộc override trong CLASS con
class con có thể dùng chính hàm vừa override lại từ cha
4. ABSTRACTION
4.1 Tính chất trừu tượng là gì?
Tính chất trừu tượng được thể hiện qua:
class/abstract class/interface
abstract method
=> Khi tạo ra đối tượng từ class hoặc override abstract method thì đối tượng, method mới có phần dữ liệu/thực thi
4.2 Cho VD, code demo
class EmailService
login
abstract login2Steps
BookPredicate
test (Book book)