Chương 3 Lập trình Hướng đối tượng với Java – P1
Ầ
TR N MINH THÁI Email: minhthai@huflit.edu.vn Website: www.minhthai.edu.vn
Cập nhật: 02 tháng 07 năm 2016
Nội dung
1. Khai báo lớp và đối tượng trong Java
2. Hàm khởi tạo
3. Các phạm vi trong Java cách sử dụng
#2
Lập trình hướng đối tượng (OOP)
• Mô hình hóa các đối tượng trong thế giới thực thành đối tượng
phần mềm
#3
Chương trình = Đối tượng + Thông điệp
• Một đối tượng gồm có
• Thuộc tính: các đặc điểm, trạng thái của đối tượng
• Hành vi: các hành vi/ chức năng của đối tượng
Lớp đối tượng là gì?
• Lớp đối tượng (Class): định nghĩa các thuộc tính (không mang giá trị cụ thể) và các phương thức chung của một nhóm đối tượng nào đó
• Lớp là khái niệm trung tâm của OOP, là sự mở rộng của khái
niệm cấu trúc (struct)
#4
• Ngoài thành phần dữ liệu (như cấu trúc), lớp còn chứa các thành phần hàm, còn gọi là phương thức (method)/ hàm thành viên (member function)
Lớp đối tượng là gì?
• Lớp được xem như một kiểu dữ liệu (kiểu đối tượng)
• Lớp giúp lập trình viên:
#5
Trừu tượng hóa dữ liệu
•
• Đóng gói
và ẩn thông tin
• Lớp là mô hình hóa rút gọn của thực thể trên thực tế, chỉ mô tả
những thuộc tính, phương thức quan tâm
•
Đối tượng là gì?
• Đối tượng (Object): là một thể hiện cụ thể của lớp, các thuộc
tính có giá trị xác định
• Đối tượng được xem như là một biến có kiểu dữ liệu là lớp đối
tượng
#6
Lớp đối tượng vs Đối tượng?
#7
ể ệ Th hi n
Nguyên lý cơ bản của OOP
#8
Trừu tượng hoá
• Loại bỏ đi các thông tin cụ thể, giữ lại các thông tin chung
• Tập trung vào các đặc điểm của thực thể, làm cho nó khác biệt
với những thực thể khác
• Phụ thuộc góc nhìn
#9
Trừu tượng hoá
#10
1 5 7 -3 8 ....
Số nguyên ( int )
Khái quát hóa
int, NGUOI, PERSON là các ADT
Danh từ chung trong ngôn ngữ tự nhiên
Khái quát hóa
attributes
Người
( PERSON )
Đóng gói – Module hoá
• Chia nhỏ hệ thống phức tạp thành các đối tượng nhỏ hơn
• Đóng gói: Che giấu, ẩn chi tiết thực hiện bên trong
#11
đối tượng
• Hành vi riêng/ nội (private, internal): hành vi xử lý dữ liệu bên trong của
interface methods)
• Cung cấp cho các đối tượng khác (client) một hành vi giao tiếp (public/
tới các đối tượng khác
• Tính trong suốt: Thay đổi việc thực thi bên trong không làm ảnh hưởng
Phân cấp
• Một nhóm đối tượng mang những đặc điểm khác biệt với
những đối tượng khác có thể tách thành nhóm con
• Lặp lại bước trên ta có cây phân cấp
#12
Xây dựng lớp đối tượng
• Lớp đóng gói các thành viên và chỉ định điều khiển truy cập tới
các thành viên:
#13
• Thuộc tính
• Tập hợp các lớp được nhóm lại thành gói (package). Mỗi lớp
trong gói cũng được chỉ định điều khiển truy cập
• Phương thức
Xây dựng lớp đối tượng
Các từ khóa chỉ định điều khiển truy cập trong Java:
• public: có thể truy cập từ mọi nơi
• protected: có thể truy cập từ trong gói hoặc từ các lớp con
• Không chỉ định: có thể truy cập từ trong gói
• private: chỉ có thể truy cập từ chính lớp đó
#14
Các bước xây dựng lớp đối tượng
#15
Bước 1: Mô hình hóa lớp đối tượng
Phát hiện các thuộc tính và hành vi
Bước 2: Mô tả phần tiêu đề của lớp
Bước 3: Định nghĩa thuộc tính
Bước 4: Định nghĩa phương thức khởi tạo (Constructor)
Bước 5: Định nghĩa phương thức
Bước 1: Mô hình hoá lớp đối tượng
• Ta cần biết những thông tin gì về một đối tượng thuộc lớp này
thuộc tính
• Ta thực sự cần xử lý (tác động) gì từ bên ngoài trên đối tượng
hành vi giao tiếp
• Để có được hành vi giao tiếp, có cần thêm những xử lý gì mà
bên ngoài không cần biết hay không? hành vi nội
#16
Bước 1: Mô hình hoá lớp trừu tượng
Một lớp cần có:
• Tên lớp
• Danh sách các thuộc tính
• Phương thức khởi tạo
• Danh sách các phương thức
#17
Xác định thuộc tính
• Đối với mỗi đối tượng, xác định các thông tin cần lưu trữ. Sau
đó lập bảng mô tả thuộc tính như sau:
ộ
ả
ớ Ràng bu c ộ Di n gi
Stt Thu c tính
Ki u/ l p
i
ễ ể • Nếu có ràng buộc liên thuộc tính thì lập thêm bảng sau:
ả
Stt Mô t
ộ ràng bu c
Ghi chú
ộ Thu c tính liên quan
#18
Xác định thuộc tính
Ràng buộc là các quy định, quy tắc áp đặt trên các giá trị thuộc
tính của đối tượng trong lớp, sao cho đối tượng này thể hiện
đúng với thực tế • Ràng buộc tĩnh: ràng buộc trên giá trị thuộc tính • Ràng buộc động: ràng buộc trên biến đổi giá trị thuộc tính Ví dụ: • “Lương của nhân viên ít nhất là 1.500.000 đồng” Tĩnh • “Lương của nhân viên chỉ có thể tăng” Động
#19
19
Ví dụ 1 xét lớp PhanSo
ể
ả
Stt
ớ Ki u/ l p
Ràng bu c ộ
ễ Di n gi
i
Thu cộ tính
ố
1
tuSo
S nguyên
T sử ố
2
ố mauSo S nguyên
mauSo (cid:0)
0 M u sẫ ố
#20
Ví dụ 2 xét lớp MyDate
ể
ả
Stt
ớ Ki u/ l p
Ràng bu c ộ
ễ Di n gi
i
Thu cộ Tính
ố
1
day
S nguyên
1≤day≤31
Ngày
2
ố month S nguyên
1≤month≤12 Tháng
ố
3
year
S nguyên
Năm
#21
Ví dụ 2 xét lớp MyDate (tt)
ả
STT
Mô t
ộ ràng bu c
Ghi chú
ộ Thu c tính liên quan
ế
1
day, month
ố
ế
ậ
ố
i đa là 29
ế
2
day, month, year
ố
N u month là 4, 6, 9, 11 i đa là 30 thì day t N u month là 2 và year nhu n thì day t N u month là 2 và year ậ không nhu n thì day t i đa là 28
#22
22
Xác định phương thức
́
̀
ợ
#23
Kiêm tra tính h p
ủ ố ượ
ệ
ị
1. Nho m kiêm tra ra ng buôc: ộ giá tr thu c tính c a đ i t
l
ng
̀
́
̉ ̣ ̉
2. Nho m kh i tao:
́ ̣ Cung câ p gia tri ban đâ u cho
́ ́ ượ đô i t
ở ng
́
̣
́ ̣ Thay đôi gia tri thuôc ti nh
3. Nho m câp nhât: ́
ượ
̣ ̉ ̣ ̣
́ cua đô i t
ng
́
́
́
4. Nho m x ly ti nh toa n:
X ly ti nh toa n các
́ ́ ủ ố ượ
́ ử ầ ừ yêu c u t
ử thông tin c a đ i t
́ ng
́
́
̉
5. Nho m cung câ p thông tin:
́ Cung câ p thuôc
́
́
ượ
̣
ti nh nôi bô cua đô i t
ng
̣ ̣ ̉
Xác định phương thức
#24
ở ạ 2. Kh i t o
ể 1. Ki m tra ràng bu cộ
ậ ậ 3. C p nh t
ử
4. X lý, tính toán
ấ 5. Cung c p thông tin
Phương thức kiểm tra ràng buộc
public boolean kiemTra... ( tham sô )́
• Giá trị trả về
#25
• true: Thoả ràng buộc
• Tham số
• false: Không thoả ràng buộc
• Ràng buộc miền giá trị: Chỉ có 1 tham số ứng với tham số cần kiểm tra
• Ràng buộc liên thuộc tính: Có tham số là các thuộc tính liên quan
25
Lưu ý
• Các phương thức thuộc nhóm khởi tạo và cập nhật có liên
quan đến ràng buộc phải được bổ sung thêm kiểm tra ràng
buộc
• Việc kiểm tra tham số thoả hoặc không thoả ràng buộc bằng
cách gọi phương thức kiểm tra ràng buộc tương ứng
#26
26
public boolean tenPhuongThuc ( Tham số )
{
//Trả về true: thực hiện được
//Trả về false: không thực hiện được
boolean kq = false;
if(Tham số thoả ràng buộc)
{
gán giá trị tương ứng cho thuộc tính của lớp
kq = true;
}
return kq;
}
#27
27
hoặc
public boolean Tên hàm ( Tham số )
{
//Trả về true: thực hiện được
//false: không thực hiện được
if(Tham số không thoả ràng buộc)
return false;
gán giá trị tương ứng cho thuộc tính của lớp
return true;
}
#28
28
Bước 2: Mô tả phần tiêu đề lớp
• Cú pháp
ươ
package pack.name; Modifier class ClassName { ộ Khai báo thu c tính; ị Khai báo và đ nh nghĩa ph
ứ ng th c
}
• pack.name: tên gói
• /**Javadoc*/: chú thích để tạo tài liệu Javadoc (không bắt
buộc)
• Modifier: chỉ định truy cập (chỉ có thể là public hoặc không chỉ
định)
• ClassName: tên lớp, theo quy tắc định danh của Java
#29
Bước 3: Định nghĩa thuộc tính
• Cú pháp
/**Javadoc*/ Modifier DataType attributeName;
• /**Javadoc*/: chú thích để tạo tài liệu Javadoc (không bắt
buộc)
• Modifier: chỉ định truy cập
• Datatype: kiểu dữ liệu, có thể là một lớp lồng (nested class)
• attributeName: tên thuộc tính, theo quy tắc định danh
#30
Bước 3: Định nghĩa thuộc tính
• Khai báo thành viên hằng
• Cú pháp
Modifier final DataType CONST_NAME = value;
• Modifier: chỉ định truy cập
• Datatype: kiểu dữ liệu
• CONST_NAME: tên hằng
• value: giá trị gán cho hằng
• Ví dụ
public final int MAX_STUDENT = 100;
#31
Bảo vệ dữ liệu của đối tượng
• Thuộc tính của lớp thường được đặt chỉ định truy cập là private
#32
class CIRLCE
public int getX()
public void setX(int xx)
public int getY()
public void setY(int yy)
public int getR()
int x, y, r; int BorderColor; int BkColor;
public void setR(int r) public double getPerimeter() public double getArea()
Bảo vệ dữ liệu của đối tượng
Truy cập vào thuộc tính của đối tượng thông qua
• Phương thức setter (cập nhật giá trị của thuộc tính)
• và Phương thức getter (lấy giá trị của thuộc tính): che giấu và
kiểm soát giá trị truyền cho thuộc tính
#33
Phương thức getter và setter
#34
private int intAttr;
//Setter method
public void setIntAttr (int intAttr){
this.intAttr = intAttr;
}
//Getter method
public int getIntAttr (){
return this.intAttr;
}
!!!Từ khóa this cho phép tự tham chiếu đến chính đối tượng đó
Ví dụ
#35
Ví dụ (tt)
#36
Bước 4: Định nghĩa phương thức khởi tạo (Constructor)
Khi một đối tượng tạo ra, một phương thức đặc biệt được gọi là phương thức khởi tạo được tự động gọi:
• Gán giá trị ban đầu cho các thuộc tính
• Có thể thực hiện một số thao tác xử lý
• Một lớp có thể có nhiều phương thức khởi tạo
#37
Bước 4: Định nghĩa phương thức khởi tạo (Constructor)
Đặc điểm
• Không có giá trị trả về
• Tên phương thức trùng với tên lớp
• Có thể có hoặc không có tham số
• Sử dụng phải có từ khóa new
#38
Bước 4: Định nghĩa phương thức khởi tạo (Constructor)
• Cú pháp
/**Javadoc*/
Modifier ClassName(parameterList){
ị
ươ
//đ nh nghĩa ph
ứ ng th c
}
#39
Các loại phương thức khởi tạo
#40
Có ba loại
• Mặc định: public ClassName ()
• Có tham số: public ClassName (danh sách tham số)
• Sao chép: public ClassName (ClassName object)
Phương thức khởi tạo mặc định (Default Constructor)
• Nên có
• Không có tham số
• Mỗi lớp có duy nhất một constructor mặc định
#41
Phương thức khởi tạo có tham số
• Tạo ra 01 đối tượng mới có thông tin thuộc tính mang các giá
trị của tham số tương ứng được truyền vào
#42
Phương thức khởi tạo sao chép (Copy Constructor)
• Tạo ra 01 đối tượng mới có thông tin thuộc tính giống với 01 đối
tượng đã có
• Có 01 tham số là một đối tượng của cùng lớp
#43
Phương thức khởi tạo sao chép
#44
Toán tử gán vs Constructor sao chép
• Toán tử gán không tạo ra đối tượng mới: chỉ thực hiện phép gán
giữa 2 đối tượng đã tồn tại
• Constructor sao chép được dùng để tạo một đối tượng mới và gán nội dung của một đối tượng đã tồn tại cho đối tượng mới vừa tạo
Lưu ý
• Ngôn ngữ có sẵn 1 constructor chuẩn làm công việc xóa trống
vùng nhớ chứa dữ liệu của đối tượng Trị 0/null
• Khi một lớp đã có constructor thì constructor mặc định của
ngôn ngữ không còn được áp dụng nữa
#45
Ví dụ
#46
Bước 5: Định nghĩa phương thức
• Cú pháp
ươ
ị
/**Javadoc*/ Modifier DataType methodName(parameterList) { ứ ng th c
Đ nh nghĩa ph
}
• /**Javadoc*/: chú thích để tạo tài liệu Javadoc (không bắt
buộc)
• Modifier: chỉ định truy cập
• Datatype: kiểu dữ liệu trả về của phương thức
• methodName: tên phương thức
• parameterList: danh sách các tham số, bao gồm kiểu dữ liệu
và tên của tham số
#47
Thành viên lớp
• Thành viên lớp: các thành viên có thể được truy cập mà không
cần thông qua một đối tượng (thể hiện của lớp)
• Dùng từ khóa static
Modifier static DataType attributeName;
Modifier static DataType methodName(parameterList) {
ị
ươ
Đ nh nghĩa ph
ứ ng th c
}
Modifier static final DataType CONST_NAME = value;
#48
Thành viên lớp vs Thành viên đối tượng
ố ượ
Thành viên l pớ
Thành viên đ i t
ng
ể
ậ
c truy c p thông qua
ố ượ
ớ
ậ Có th truy c p thông qua ặ tên l p ho c qua đ i t
ng
ỉ ượ Ch đ ộ ố ượ m t đ i t
ng
ủ ố ượ
ủ
ố
ng có
tính c a các đ i
ộ ị ố
Thu c tính c a đ i t giá tr gi ng nhau
ộ Thu c ị ượ ng có giá tr khác nhau t
ị
ị
ộ
ả
ộ ổ Thay đ i giá tr thu c tính ượ ố ủ t nh ng này c a đ i ố ả ớ ấ ướ i t t c các đ i ng t h ớ ượ ng khác cùng l p t
ổ Thay đ i giá tr thu c tính ố ượ ộ ủ ng này là c a m t đ i t ố ượ ớ ộ ậ đ c l p v i các đ i t ng khác cùng l pớ
ươ
ứ
ậ
ộ
ỉ
ể ng th c static ch có th truy c p vào các thu c ươ
ể ọ
ứ
ủ
ớ
ộ !!! M t ph ỉ tính static và ch có th g i các ph
ng th c static c a cùng l p
#49
Ví dụ 1
#50
Ví dụ 2
#51
Ví dụ 2 (tt)
#52
Sử dụng lớp đối tượng
• Cú pháp
ClassName objectName = new ClassName();
#53
• ClassName: Tên lớp mà đối tượng tạo ra từ lớp đó
• objectName: Tên đối tượng
• ClassName(): Phương thức khởi tạo
Sử dụng lớp đối tượng
• Truy cập tới các thành viên của đối tượng qua toán tử ‘.’
• Lưu ý tới chỉ định điều khiển truy cập
• Các đối tượng được khai báo mà không khởi tạo sẽ mang giá trị
null
#54
Sử dụng lớp đối tượng
#55
Ví dụ
Cho bài toán đăng ký học phần. Hãy thiết kế lớp đối tượng theo yêu cầu sau:
• Đối tượng “học phần” (HocPhan) có các thông tin: Mã môn, tên
môn, số lượng đăng ký tối đa và số lượng đăng ký hiện tại
• Các chức năng: Cho phép người dùng đăng ký một SV vào lớp,
hủy đăng ký một SV và hiển thị thông tin môn học, sao cho:
#56
• Không thể đăng ký nữa nếu số đăng ký đã bằng định mức
• Không thể hủy đăng ký nếu không có sinh viên
Lớp HocPhan
• Thuộc tính
#57
• maHocPhan: Mã học phần, chuỗi ký tự
• tenHocPhan: Tên học phần, chuỗi ký tự
• soLuongMax: Số lượng tối đa, số nguyên
• soLuongHienTai: Số lượng đăng ký hiện tại, số nguyên
Lớp HocPhan
• Phương thức
#58
• dangKy(): Đăng ký thêm một sinh viên
• huyDangKy(): Huỷ đăng ký
• hienThi(): Hiển thị thông tin học phần
• HocPhan(): Phương thức khởi tạo
• Phương thức getter, setter
Định nghĩa thuộc tính lớp HocPhan
#59
Định nghĩa phương thức khởi tạo
#60
Định nghĩa phương thức đăng ký học phần
#61
Định nghĩa phương thức huỷ đăng ký
#62
Định nghĩa phương thức hiển thị thông tin học phần
#63
Sử dụng lớp HocPhan
#64
Bài tập
• Viết thêm các phương thức setter và getter cho lớp HocPhan
• Bổ sung kiểm tra ràng buộc cho số lượng tối đa phải [20..100]
• Viết lại chương trình cho phép thực hiện những yêu cầu sau:
#65
• Thông tin của học phần được nhập từ bàn phím
• Cho phép đăng ký thêm một sinh viên. Mỗi lần đăng ký xong, hỏi lại người dùng có tiếp tục không. Hiển thị thông tin môn học nếu người dùng không muốn tiếp tục
• Cho phép hủy đăng ký một sinh viên. Mỗi lần hủy đăng ký xong, hỏi lại người dùng có tiếp tục không. Hiển thị thông tin môn học nếu người dùng không muốn tiếp tục
Gán đối tượng
• object2 = object1;
• object1 và object2 là các tham chiếu gán giá trị tham chiếu
#66
So sánh 2 đối tượng
1. Sử dụng toán tử bằng (==)
#67
object1 == object2
Chỉ kiểm tra xem 2 tham chiếu có cùng trỏ đến một đối tượng không?
2. Phương thức equals(Object)
!!!Đối với các lớp của Java
• Trả về true nếu mọi thành viên của 2 đối tượng có giá trị bằng
nhau
• Trả về false nếu ngược lại
!!!Đối với các lớp định nghĩa mới: Cần sử dụng nguyên lý nạp chồng phương thức để viết lại
Ví dụ
#68
Ví dụ
#69
Mảng đối tượng
• Cú pháp
ClassName[] arrayName = new ClassName[size];
• Trong đó:
#70
• ClassName : Tên lớp mà đối tượng tạo ra từ lớp đó
• arrayName : Tên mảng đối tượng
• size : Kích thước
• Các phần tử sẽ mang giá trị null
Mảng đối tượng
Hoặc
ClassName[] arrayName = {new ClassName(), ...,
#71
new ClassName()};
!!!Số lần khởi tạo đối tượng là số lượng mảng
Bài tập
Bổ sung vào chương trình đăng ký học phần một lớp quản lý học phần (QuanLyHocPhan) bao gồm các chức năng:
• Tạo danh sách các học phần được mở gồm các thông tin được
người dùng nhập từ bàn phím
• Cho phép đăng ký thêm một sinh viên cho một học phần trong danh sách học phần có sẵn. Mỗi lần đăng ký xong, hỏi lại người dùng có tiếp tục không.
• Cho phép hủy đăng ký một sinh viên của một học phần nào đó. Mỗi lần hủy đăng ký xong, hỏi lại người dùng có tiếp tục không
• Hiển thị thông tin học phần nếu người dùng không muốn tiếp
tục
#72
Q&A
#73

