Anda di halaman 1dari 91

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 03 năm 2017
Nội dung
#2

1. Khai báo lớp và đối tượng trong Java

2. Phương thức khởi tạo

3. Các phạm vi trong Java, cách sử dụng


#3

Các khái niệm về hướng đối tượng


Lập trình hướng đối tượng (OOP)
#4

• 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

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ì?
#5

• Lớp đối tượng (class): định nghĩa danh sách các thuộc
tính (dữ liệu) 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)

Lớp = thuộc tính + phương thức


Lớp đối tượng là gì?
#6

• 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:


• 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ì?
#7

• Đố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
Lớp đối tượng vs Đối tượng?
#8

Thể hiện
#9

Các nguyên lý cơ bản

của hướng đối tượng


Nguyên lý cơ bản của OOP
#10
Trừu tượng hoá
#11

• 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 chính 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 vào góc nhìn


Trừu tượng hoá
#12

1 5 7 Khái Số nguyên
-3 8 .... quát ( int )
hóa

int, NGUOI, PERSON Danh từ chung trong


là các ADT ngôn ngữ tự nhiên

Người
Khái ( PERSON )
quát <Code, Name,
hóa date_of_birth,
attributes Address, e-mail
.......>
Đóng gói – Module hoá
#13

• 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

• Hành vi riêng/ nội (private, internal): hành vi xử lý dữ


liệu bên trong của đối tượng

• Cung cấp cho các đối tượng khác (client) một hành vi
giao tiếp (public/ interface methods)

• Tính trong suốt: Thay đổi việc thực thi bên trong không
làm ảnh hưởng tới các đối tượng khác
Phân cấp
#14

• 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


#15

Cách xây dựng lớp đối tượng


Xây dựng lớp đối tượng
#16

• 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:

• Thuộc tính

• Phương thức

• 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
Xây dựng lớp đối tượng
#17

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

• private: chỉ có thể truy cập từ chính lớp đó

• Không chỉ định: có thể truy cập từ trong gói


Các bước xây dựng lớp đối tượng
#18

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 getter, setter

Bước 5: Định nghĩa phương thức constructor

Bước 6: Định nghĩa phương thức


Bước 1: Mô hình hoá lớp đối tượng
#19

• Ta cần biết/ quan tâm 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 lê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ý


mà bên ngoài không cần biết?  hành vi nội
Bước 1: Mô hình hoá lớp trừu tượng
#20

Một lớp cần có:

• Tên lớp

• Danh sách các thuộc tính (fields)

• Phương thức getter, setter

• Phương thức constructor

• Các phương thức: khởi tạo, cập nhật, kiểm tra ràng
buộc, xử lý tính toán, cung cấp thông tin
#21

Xác định thành phần thuộc tính (field)


Xác định thuộc tính
#22

• Đố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:

Stt Thuộc tính Kiểu/ lớp Ràng buộc Diễn giải

• Nếu có ràng buộc liên thuộc tính thì lập thêm bảng sau:
Thuộc tính
Stt Mô tả ràng buộc Ghi chú
liên quan
Xác định thuộc tính
#23

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


23
Ví dụ 1 xét lớp PhanSo
#24

Thuộc
Stt Kiểu/ lớp Ràng buộc Diễn giải
tính

1 tuSo Số nguyên Tử số

2 mauSo Số nguyên mauSo  0 Mẫu số


Ví dụ 2 xét lớp MyDate
#25

Thuộc
Stt Kiểu/ lớp Ràng buộc Diễn giải
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


Ví dụ 2 xét lớp MyDate (tt)
#26

Thuộc tính
STT Mô tả ràng buộc Ghi chú
liên quan
Nếu month là 4, 6, 9, 11 thì
1 day, month
day tối đa là 30
Nếu month là 2 và year
nhuận thì day tối đa là 29
day, month,
2 Nếu month là 2 và year
year
không nhuận thì day tối đa
là 28

26
#27

Khai báo lớp (class)


Bước 2: Mô tả phần tiêu đề lớp
#28

• 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
Bước 3: Định nghĩa thuộc tính
#29

• 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
Bước 3: Định nghĩa thuộc tính
#30

• 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;
Bảo vệ dữ liệu của đối tượng
#31

• Thuộc tính của lớp thường được đặt chỉ định truy cập
là private class CIRLCE

public int getX()


public void setX(int xx)
public int getY()
int x, y, r;
public void setY(int yy)
int BorderColor;
public int getR() int BkColor;
public void setR(int r)
public double getPerimeter()
public double getArea()
#32

Định nghĩa phương thức getter và setter


Bảo vệ dữ liệu của đối tượng
#33

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):
che giấu và kiểm soát giá trị truyền cho thuộc tính

• và Phương thức getter (lấy giá trị của thuộc tính)


Phương thức getter và setter
#34

private int intAttr;


//Setter method
public void setIntAttr (int intAttr){
Có thể bổ sung lệnh kiểm tra
this.intAttr = intAttr; giá trị truyền vào

}
//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
#37

Định nghĩa phương thức constructor


Bước 4: Định nghĩa Constructor
#38

Khi một đối tượng tạo ra, constructor đượ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 constructor


Bước 4: Định nghĩa Constructor
#39

Đặ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


Bước 4: Định nghĩa Constructor
#40

• Cú pháp

/**Javadoc*/
Modifier ClassName(parameterList){
//định nghĩa phương thức
}
Các loại Constructor
#41

Có ba loại

• Default: public ClassName ()

• Parameter: public ClassName (danh sách tham số)

• Copy: public ClassName (ClassName object)


Default Constructor
#42

• Nên có

• Không có tham số

• Mỗi lớp có duy nhất một default constructor


Parameter constructor
#43

• 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
Copy Constructor
#44

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


Copy Constructor
#45

Toán tử gán (=) vs Copy Constructor

• 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

• Copy Constructor để 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 ý
#46

• 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 tác dụng nữa
Ví dụ
#47
Bài tập
#48

Định nghĩa các phương thức getter, setter và constructors


cho lớp

MyDate

PhanSo
#49

Định nghĩa phương thức


Bước 5: Định nghĩa phương thức
#50

1. Nhóm kiểm tra ràng buộc: Kiểm tra tính hợp lệ


giá trị thuộc tính của đối tượng
2. Nhóm khởi tạo: Cung cấp giá trị ban đầu cho
đối tượng
3. Nhóm cập nhật: Thay đổi giá trị thuộc tính của
đối tượng
4. Nhóm xử lý tính toán: Xử lý tính toán các yêu
cầu từ thông tin của đối tượng
5. Nhóm cung cấp thông tin: Cung cấp thuộc tính
nội bộ của đối tượng
Bước 5: Định nghĩa phương thức
#51

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


Bước 5: Định nghĩa phương thức
#52

• Cú pháp
/**Javadoc*/
Modifier DataType methodName(parameterList) {
Định nghĩa phương thức
}
• /**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ố
Kiểm tra ràng buộc
#53

public boolean kiemTra... ( tham số )

Giá trị trả về


• true: Thoả ràng buộc
• false: Không thoả ràng buộc
Tham số
• 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
53
Lưu ý
#54

• 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

54
public boolean tenPhuongThuc ( Tham số )
{
#55
//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;
}
55
#56
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;
}
56
Bài tập
#57

Giả sử cần xử lý dãy các số nguyên (lớp MyArray)

• Xác định thuộc tính

• Liệt kê các constructor

• Liệt kê các phương thức


Thành viên lớp
#58

• 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

• 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;
Thành viên lớp vs Thành viên đối tượng
#59

Thành viên lớp Thành viên đối tượng


Có thể truy cập thông qua tên Chỉ được truy cập thông qua
lớp hoặc qua đối tượng một đối tượng
Thuộc tính của các đối tượng Thuộc tính của các đối tượng
có giá trị giống nhau có giá trị khác nhau
Thay đổi giá trị thuộc tính Thay đổi giá trị thuộc tính
của đối tượng này ảnh hưởng của một đối tượng này là độc
tới tất cả các đối tượng khác lập với các đối tượng khác
cùng lớp cùng lớp
!!! Một phương thức static chỉ có thể truy cập vào các thuộc tính
static và chỉ có thể gọi các phương thức static của cùng lớp
Ví dụ 1
#60
Ví dụ 2
#61
Ví dụ 2 (tt)
#62
#63

Tạo đối tượng


Sử dụng lớp đối tượng
#64

• Cú pháp

ClassName objectName = new ClassName();

• 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
#65

• 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
Sử dụng lớp đối tượng
#66
Ví dụ
#67

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:

• 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
#68

• Thuộc tính

• 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
#69

• Phương thức

• 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
#70
Định nghĩa phương thức khởi tạo

#71
Định nghĩa phương thức đăng ký học
phần
#72
Định nghĩa phương thức huỷ đăng ký
#73
Định nghĩa phương thức hiển thị thông
tin học phần
#74
Sử dụng lớp HocPhan
#75
Bài tập
#76

• 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:
• 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
#77

Vấn đề gán và so sánh đối tượng


Gán đối tượng
#78

• object2 = object1;

• object1 và object2 là các tham chiếu  gán giá trị


tham chiếu
So sánh 2 đối tượng
#79

Sử dụng toán tử bằng (==)

object1 == object2

 Chỉ kiểm tra xem 2 tham chiếu có cùng trỏ đến một đối
tượng không?
public class SoSanhDoiTuong {
private int value;

public SoSanhDoiTuong() {
this.setValue(0);
}
public SoSanhDoiTuong(int value) {
this.setValue(value);
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
public class SoSanhDoiTuongTest {
public static void main(String []args) {
SoSanhDoiTuong t1 = new SoSanhDoiTuong(10);
SoSanhDoiTuong t2 = new SoSanhDoiTuong(10);
System.out.println(" Gia tri t1 = " + t1.getValue());
System.out.println(" Gia tri t2 = " + t2.getValue());

System.out.println("* So sanh hai doi tuong:");


if(t1==t2)
System.out.println(" t1 bang voi t2 ");
else
System.out.println(" t1 khac t2 ");
}
}

Gia tri t1 = 10
Gia tri t2 = 10
* So sanh hai doi tuong:
t1 khac t2
public class SoSanhDoiTuongTest {
public static void main(String []args) {
SoSanhDoiTuong t1 = new SoSanhDoiTuong(10);
SoSanhDoiTuong t2 = new SoSanhDoiTuong();
t2 = t1;

System.out.println(" Gia tri t1 = " + t1.getValue());


System.out.println(" Gia tri t2 = " + t2.getValue());

System.out.println("* So sanh hai doi tuong:");


if(t1==t2)
System.out.println(" t1 bang voi t2 ");
else
System.out.println(" t1 khac t2 ");
}
}

Gia tri t1 = 10
Gia tri t2 = 10
* So sanh hai doi tuong:
t1 bang voi t2
So sánh 2 đối tượng
#83

Phương thức equals(Object)

• 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

!!!Chỉ áp dụng trên các lớp của Java

!!!Đối với các lớp định nghĩa mới: Không sử dụng được
Cần sử dụng nguyên lý nạp chồng phương thức để viết lại
public class SoSanhDoiTuongTest {
public static void main(String []args) {
SoSanhDoiTuong t1 = new SoSanhDoiTuong(10);
SoSanhDoiTuong t2 = new SoSanhDoiTuong(10);

System.out.println(" Gia tri t1 = " + t1.getValue());


System.out.println(" Gia tri t2 = " + t2.getValue());

System.out.println("* So sanh hai doi tuong:");


if(t1.equals(t2))
System.out.println(" t1 bang voi t2 ");
else
System.out.println(" t1 khac t2 ");
}
}

Gia tri t1 = 10
Gia tri t2 = 10
* So sanh hai doi tuong:
t1 khac t2
public class SoSanhDoiTuong {
private int value;

public SoSanhDoiTuong() {
this.setValue(0);
}
public SoSanhDoiTuong(int value) {
this.setValue(value);
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
@Override
public boolean equals(Object obj) {
SoSanhDoiTuong dt2 = (SoSanhDoiTuong) obj;
if (this.value == dt2.value) return true;
else return false;
}
}
public class SoSanhDoiTuongTest {
public static void main(String []args) {
SoSanhDoiTuong t1 = new SoSanhDoiTuong(10);
SoSanhDoiTuong t2 = new SoSanhDoiTuong(10);

System.out.println(" Gia tri t1 = " + t1.getValue());


System.out.println(" Gia tri t2 = " + t2.getValue());

System.out.println("* So sanh hai doi tuong:");


if(t1.equals(t2))
System.out.println(" t1 bang voi t2 ");
else
System.out.println(" t1 khac t2 ");
}
}

Gia tri t1 = 10
Gia tri t2 = 10
* So sanh hai doi tuong:
t1 bang voi t2
#87

Mảng đối tượng


Mảng đối tượng
#88

• Cú pháp

ClassName[] arrayName = new ClassName[size];

• Trong đó:

• 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
#89

Hoặc

ClassName[] arrayName = {new ClassName(), ...,


new ClassName()};

!!!Số lần khởi tạo đối tượng là số lượng mảng


Bài tập
#90

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
Q&A
#91

Anda mungkin juga menyukai