3. Trừu tượng và đóng gói dữ liệu
Lập trình hướng đối tượng đòi hỏi thiết kế các
lớp đối tượng như là những hộp đen (black
box):
Giấu đi cách hoạt động bên trong và các chi tiết
dữ liệu không quan trọng => đóng gói dữ liệu
(encapsulation)
Khái niệm (concept) của mỗi hộp đen là kết quả
của quá trình trừu tượng hoá (abstraction)
Mô hình hoá sự vật hiện tượng
Bỏ qua các tiểu tiết, chỉ giữ lại các đặc tính cơ bản của
đối tượng
2009-2010 http://mim.hus.edu.vn 3
4. Các mức trừu tượng – ví dụ
trong đời sống (1)
2009-2010 http://mim.hus.edu.vn 4
5. Các mức trừu tượng – ví dụ
trong đời sống (2)
Người dùng xe không cần biết các hộp đen hoạt động thế nào bên trong
Tương tác của hộp đen với thế giới bên ngoài được định nghĩa chính xác
Người lái tương tác với xe bằng cách sử dụng bàn đạp, các nút bấm, v.v.
Thợ cơ khí có thể kiểm tra khối điều khiển động cơ có gửi tín hiệu đúng tới
các tiếp xúc không
Đối với nhà sản xuất động cơ, các tụ điện và bóng bán dẫn là các hộp đen
sản xuất bởi các nhà máy linh kiện điện tử
Đóng gói là yếu tố mang lại tính hiệu quả
Thợ cơ khí chỉ làm việc với các bộ phận của xe hơi (như khối điều khiển điện
tử), mà không làm việc với các bộ cảm biến và bóng bán dẫn
Người lái xe chỉ lo việc tương tác với xe (như đổ xăng vào xe) chứ không cần
biết hoạt động bên trong của động cơ hay của bộ điều khiển như thế nào.
2009-2010 http://mim.hus.edu.vn 5
6. Các mức trừu tượng - Thiết kế
phần mềm (1)
2009-2010 http://mim.hus.edu.vn 6
7. Các mức trừu tượng - Thiết kế
phần mềm (2)
Trước kia, người lập trình chỉ làm việc với dữ liệu kiểu
nguyên thuỷ: số và kí tự
Thao tác với quá nhiều dữ liệu dễ gây lỗi
Giải pháp: Đóng gói các tính toán thường xuyên thành các hộp
đen phần mềm
Trừu tượng hoá: đưa ra các kiểu dữ liệu bậc cao hơn (có cấu
trúc)
Lập trình hướng đối tượng: đối tượng là hộp đen
Đóng gói: Người dùng đối tượng chỉ biết các hành vi của nó,
không biết cấu trúc hoạt động bên trong thế nào
Thiết kế phần mềm: mô hình hoá (trừu tượng hoá) đối tượng
Định nghĩa các hành vi (behaviour) của lớp đối tượng
Cài đặt lớp
2009-2010 http://mim.hus.edu.vn 7
8. Thiết kế lớp - Ví dụ
Yêu cầu:
Thiết kế lớp tài khoản ngân hàng
(BankAccount) cho một ứng dụng quản lí
tài chính
2009-2010 http://mim.hus.edu.vn 8
9. Thiết kế giao diện công khai
(public) của lớp (1)
Trừu tượng hoá:
Hành vi của đối tượng tài khoản ngân hàng
Chuyển một số tiền vào
Rút một số tiền ra
Xem số tiền đang có
2009-2010 http://mim.hus.edu.vn 9
10. Thiết kế giao diện công khai
(public) của lớp (2)
Xác định phương thức
Các phương thức công khai cần có cho lớp
BankAccount:
deposit
withdraw
getBalance
Lời gọi các phương thức này có dạng:
harrysChecking.deposit(2000);
harrysChecking.withdraw(500);
System.out.println(harrysChecking.getBalance());
2009-2010 http://mim.hus.edu.vn 10
11. Thiết kế giao diện công khai
(public) của lớp (3)
Định nghĩa phương thức
Cú pháp
accessSpecifier returnType methodName(parameterType parameterName, . . .)
{
method body
}
Ví dụ
public void deposit(double amount) { . . . }
public void withdraw(double amount) { . . . }
public double getBalance() { . . . }
2009-2010 http://mim.hus.edu.vn 11
12. Thiết kế giao diện công khai
(public) của lớp (4)
Định nghĩa hàm dựng (constructor)
Hàm dựng khởi tạo các biến (thuộc tính) của một thực thể
Tên hàm dựng trùng tên lớp
Các lệnh trong thân một hàm dựng được thực hiện khi tạo đối
tượng mới bằng hàm dựng này (với từ khoá new)
Một lớp có thể có nhiều hàm dựng, các hàm dựng phân biệt
được với nhau nhờ danh sách tham biến hiện khác nhau
Cú pháp
accessSpecifier ClassName(parameterType parameterName, . . .)
{
constructor body
}
Ví dụ
public BankAccount(double initialBalance) { . . . }
2009-2010 http://mim.hus.edu.vn 12
13. Giao diện công khai của lớp
BankAccount
public class BankAccount{
// Constructors
public BankAccount(){
// body--filled in later
}
public BankAccount(double initialBalance) {
// body--filled in later
}
// Methods
public void deposit(double amount) {
// body--filled in later
}
public void withdraw(double amount) {
// body--filled in later
}
public double getBalance() {
// body--filled in later
}
// private fields--filled in later
}
2009-2010 http://mim.hus.edu.vn 13
14. Định nghĩa lớp
Cú pháp
accessSpecifier class ClassName {
constructors
methods
fields
}
Fields: Các trường dữ liệu (thuộc tính đối
tượng)
2009-2010 http://mim.hus.edu.vn 14
15. Tài liệu chương trình
(documentation)
Cần cho người sử dụng lớp: API
documentation
Nội dung tài liệu được sinh tự động (dùng
javadoc) từ các chú thích trong chương trình
Có cú pháp quy định cho các loại chú thích
chú thích cho từng phương thức: mô tả phương thức,
danh sách tham biến, giá trị trả lại
chú thích cho lớp: mô tả lớp, thông tin về tác giả, phiên
bản phần mềm
Cần làm chú thích tài liệu cho tất cả các lớp,
phương thức, tham biến, giá trị trả lại
2009-2010 http://mim.hus.edu.vn 15
16. Chú thích giao diện công khai
/**
Withdraws money from the bank account.
@param amount the amount to withdraw
*/
public void withdraw(double amount) {
// implementation filled in later
}
/**
Gets the current balance of the bank account.
@return the current balance
*/
public double getBalance() {
// implementation filled in later
}
2009-2010 http://mim.hus.edu.vn 16
17. Chú thích lớp
/**
A bank account has a balance that
can be changed by deposits and
withdrawals.
*/
public class BankAccount {
. . .
}
2009-2010 http://mim.hus.edu.vn 17
20. Các trường dữ liệu (1)
Các trường dữ liệu là các thuộc tính của các cá thể
(instance) trong lớp
Cú pháp khai báo các trường dữ liệu trong lớp như
sau:
accessSpecifier class ClassName {
...
accessSpecifier fieldType fieldName;
...
}
Nên đặt quyền truy nhập của tất cả các trường là
private (bảo đảm tính vẹn toàn dữ liệu)
2009-2010 http://mim.hus.edu.vn 20
21. Các trường dữ liệu (2)
Ví dụ:
public class BankAccount
{
. . .
private double balance;
. . .
}
2009-2010 http://mim.hus.edu.vn 21
22. Truy cập trường dữ liệu
Phương thức deposit của lớp BankAccount có thể truy cập
trường dữ liệu balance:
public void deposit(double amount){
double newBalance = balance + amount;
balance = newBalance;
}
Các phương thức thuộc lớp khác không truy cập được
public class BankRobber {
public static void main(String[] args){
BankAccount momsSavings = new BankAccount(1000);
. . .
momsSavings.balance = -1000; // ERROR
}
}
Đóng gói = Giấu dữ liệu, cung cấp truy cập thông qua các
phương thức
2009-2010 http://mim.hus.edu.vn 22
23. Cài đặt hàm dựng
Hàm dựng chứa các lệnh để khởi tạo giá trị các thuộc
tính của một đối tượng
Kiểu giá trị trả lại của hàm dựng là lớp tương ứng, do vậy
khai báo hàm dựng không chứa kiểu trả lại
Hàm dựng cũng không có lệnh trả giá trị (return)
Ví dụ
public BankAccount() {
balance = 0;
}
public BankAccount(double initialBalance) {
balance = initialBalance;
}
2009-2010 http://mim.hus.edu.vn 23
24. Ví dụ gọi hàm dựng
BankAccount harrysChecking = new BankAccount(1000);
Tạo 1 đối tượng mới có kiểu BankAccount;
Ở đây, hàm dựng được gọi là hàm dựng thứ 2
Trường balance được gán giá trị của tham biến
initialBalance = 1000;
Hàm trả lại tham chiếu tới đối tượng mới tạo
(địa chỉ ô nhớ), lưu vào biến harrysChecking
2009-2010 http://mim.hus.edu.vn 24
25. Cài đặt phương thức
Phương thức có thể có hoặc không trả lại giá trị
Ví dụ
public void withdraw(double amount) {
double newBalance = balance - amount;
balance = newBalance;
}
public double getBalance() {
return balance;
}
2009-2010 http://mim.hus.edu.vn 25
26. Ví dụ gọi phương thức
harrysChecking.deposit(500);
Tham biến amount có giá trị 500
Biến newBalance của phương thức
deposit được tính bằng giá trị thuộc tính
balance (1000) của đối tượng
harrysChecking cộng với giá trị tham
biến amount
Thuộc tính balance được gán bằng giá trị
biến newBalance (1500).
2009-2010 http://mim.hus.edu.vn 26
27. Thử nghiệm 1 lớp
Lớp BankAccount (BankAccount.java – ch3)
Lớp thử nghiệm (VD BankAccountTester.java):
lớp chứa hàm main, trong đó có chứa các lệnh:
Tạo 1 hoặc nhiều đối tượng của lớp muốn thử
Gọi các phương thức muốn thử
In ra kết quả
Quy trình xây dựng chương trình:
Tạo 1 thư mục con cho chương trình, tạo 2 tệp chứa 2 lớp
trong đó
Biên dịch 2 tệp
Chạy lớp thử nghiệm
2009-2010 http://mim.hus.edu.vn 27
28. Thử nghiệm 1 lớp với BlueJ
Giá trị trả lại của
phương thức
getBalance sau
khi tạo 1 đối tượng
với giá trị khởi đầu
của thuộc tính
balance là 500
2009-2010 http://mim.hus.edu.vn 28
29. Các loại biến
Có 3 loại biến:
Biến tương ứng với các trường dữ liệu (VD: balance trong
BankAccount)
Biến địa phương (VD: newBalance trong phương thức
deposit)
Tham biến của các phương thức (VD: amount trong phương
thức deposit).
Phạm vi biến:
Trường dữ liệu: thuộc về đối tượng
Biến địa phương: khối lệnh (block) chứa khai báo biến
Tham biến của phương thức: trong toàn bộ phương thức
Tên biến địa phương trong 1 phương thức không được trùng
với tên 1 tham biến của phương thức đó
2009-2010 http://mim.hus.edu.vn 29
30. Tham biến ẩn và this
Nhắc lại: tham biến ẩn của 1 phương thức là đối tượng
áp dụng phương thức đó
Từ khoá this dùng để chỉ tham biến ẩn
Trong 1 phương thức, khi dùng 1 trường dữ liệu thực ra
là dùng trường dữ liệu của tham biến ẩn (this)
double newBalance = balance - amount;
tương đương với
double newBalance = this.balance - amount;
Nếu trong phương thức có biến địa phương hay tham
biến trùng tên với trường dữ liệu, muốn tham chiếu tới
trường dữ liệu cần viết tường minh tham biến ẩn this
2009-2010 http://mim.hus.edu.vn 30
31. Biến tĩnh (static)
Nếu 1 trường dữ liệu (thuộc tính các đối tượng trong
1 lớp) được khai báo là biến tĩnh thì:
Tất cả các đối tượng thuộc lớp đó chia sẻ 1 vùng nhớ chung
cho biến tĩnh này
Vùng nhớ cho biến tĩnh được cấp phát mà không cần tạo đối
tượng mới
Các giá trị hằng của 1 lớp thường được khai báo với
bộ từ khoá public static final
Ví dụ:
Các hằng trong lớp bao kiểu số nguyên Integer
CashRegister.java và CashRegisterTester.java (BigJava, ch4)
2009-2010 http://mim.hus.edu.vn 31
32. Nhập dữ liệu
Dữ liệu từ bàn phím được truyền cho chương trình thông
qua đối tượng System.in dưới dạng 1 chuỗi các byte
Từ Java 5.0, có lớp Scanner (gói java.util) cung cấp
các phương thức nhập dữ liệu thuận tiện hơn
VD sử dụng:
Scanner in = new Scanner(System.in);
System.out.print("Enter quantity: ");
int quantity = in.nextInt();
nextDouble cho phép đọc 1 số thực
nextLine cho phép đọc 1 dòng văn bản (tới khi ấn phím Enter)
nextWord cho phép đọc 1 từ (tới khi ấn phím cách)
Chương trình ví dụ: InputTester.java
2009-2010 http://mim.hus.edu.vn 32
33. Nhập dữ liệu qua hộp thoại
Lớp thư viện javax.swing.JOptionPane
String input =
JOptionPane.showInputDialog(prompt);
Đổi xâu sang số nếu cần thiết:
int count = Integer.parseInt(input);
2009-2010 http://mim.hus.edu.vn 33