Tải bản đầy đủ

Ch06 07

Chương 6. Đối tượng và lớp
PHẦ
PH N II
LẬP TRÌNH HƯỚNG ĐỐI TƯ NG
GV. Ngô Công Thắ
Thắng
Bộ môn Công nghệ phần mềm
Khoa Công nghệ thông tin

6.1. Khai báo lớp
6.2. Tạo các đối tượng
6.3. Truy nhập đối tượng qua biến tham chiếu
6.4. Mảng đối tượng
6.5. Truyề
Truyền đố
đối tượ
tượng cho phương thứ
thức
6.6. Che giấ
giấu thông tin
6.7. Cá

Các thà
thành viên tĩ
tĩnh
6.8. Đố
Đối tượ
tượng và
và lớp hằ
hằng
6.9. Cá
Các lớ
lớp lồ
lồng nhau
Bài tậ
tập chương 6
Bài giả
Phầ
ần 2,C
hương 6 GV. Ngô Công Thắ
giảng LT JAVA - Ph
2,Chương
Thắng

6.1. Khai báo lớp

2

6.1.1. Cú pháp khai báo lớp

6.1.1. Cú
Cú phá
pháp khai bá
báo lớ
lớp
6.1.2. Điều khiển truy nhập
6.1.3. Định nghĩa các biến của lớp
6.1.4. Định nghĩa các phương thức của lớp
6.1.5. Ví dụ về khai báo lớp

class TenLop
{

//Khai báo các thành viên dữ liệu
//và phương thức của lớp
}
Không có dấu
chấm phẩy

Bài giả
Phầ
ần 2,C
hương 6 GV. Ngô Công Thắ
giảng LT JAVA - Ph
2,Chương
Thắng

3

Bài giả
Phầ
ần 2,C
hương 6 GV. Ngô Công Thắ
giảng LT JAVA - Ph
2,Chương
Thắng

4


6.1.2. Điều khiển truy nhập

6.1.2. Điều khiển truy nhập

Java có
có các modifier để
để điề
điều khiể
khiển việ
việc
truy nhập dữ liệu, phương thức và lớp:
public dùng cho dữ liệu, phương thức và
lớp; private chỉ dùng cho dữ liệu và
phương thức.
public cho phép truy nhập lớp, dữ liệu và
phương thức từ bất kỳ lớp nào.
private chỉ cho phép truy nhập dữ liệu và
phương thứ
thức từ
từ bên trong lớ
lớp.
Bài giả
Phầ
ần 2,C
hương 6 GV. Ngô Công Thắ
giảng LT JAVA - Ph
2,Chương
Thắng

Các từ
từ khó
khóa modifier đượ
được đặ
đặt trướ
trước cá
các
khai báo dữ liệu, phương thức và lớp.
Nếu không dùng modifier nào thì mặc định
dữ liệu và phương thức có thể truy nhập
từ tất cả các lớp trong cùng package.

5

6.1.3. Định nghĩa các biến của lớp

6

6.1.3. Định nghĩa các biến của lớp

Dữ liệ
liệu củ
của lớ
lớp chí
chính là
là các biế
biến củ
của lớ
lớp.
Các biến của lớp được chia thành hai loại,
biến thực thể và biến tĩnh. Biến thực thể là
biến của riêng từng đối tượng, biến tĩnh là
biến của cả lớp đối tượng, dùng chung
cho tất cả các đối tượng.
Cú pháp khai báo biến của lớp giống như
khai báo biến thông thường.
Bài giả
Phầ
ần 2,C
hương 6 GV. Ngô Công Thắ
giảng LT JAVA - Ph
2,Chương
Thắng

Bài giả
Phầ
ần 2,C
hương 6 GV. Ngô Công Thắ
giảng LT JAVA - Ph
2,Chương
Thắng

7

Khá
Khác vớ
với C++:
Các biế
biến củ
của lớ
lớp (cả
(cả biế
biến thự
thực thể
thể và biế
biến
tĩnh) phả
phải khai bá
báo và
và đị
định nghĩ
nghĩa ngay trong
mô tả
tả lớp.
Khi khai báo biến lớp có thể khởi tạo giá trị
ban đầu cho chúng..

Bài giả
Phầ
ần 2,C
hương 6 GV. Ngô Công Thắ
giảng LT JAVA - Ph
2,Chương
Thắng

8


6.1.4. Định nghĩa các phương thức
của lớp

public class circle
{
private double radius = 1.0;
public circle()
{ }
puplic circle(double newRadius) //Ham tao mot doi so
{
radius = newRadius;
}
//Tinh dien tich
public double findArea()
{
return 3.14159 * radius * radius;
}
}

Các phương thức của lớp phải được định nghĩa
ngay trong mô tả
tả lớp.
Hàm tạo là một phương thức đặc biệt của lớp
đượ
được dù
dùng để
để tạo đố
đối tượ
tượng củ
của lớ
lớp. Hà
Hàm tạ
tạo
trong Java giố

ng
trong
C++,
chỉ

khá
á
c

à
không
gi
ch kh l
được thực hiện tự động mà phải gọi. Trong lớp
có thể
thể có nhiề
nhiều hà
hàm tạ
tạo chồ
chồng nhau, mỗ
mỗi hà
hàm
tạo cho ta mộ
một cá
cách tạ
tạo đố
đối tượ
tượng củ
của lớ
lớp.
Khá
Khác vớ
với C++, trong Java không có
có hàm hủ
hủy,
bởi vì
vì công việ
việc hủ
hủy đố
đối tượ
tượng và
và dọn dẹ
dẹp bộ
bộ
nhớ được JVM thực hiện tự động.
Bài giả
Phầ
ần 2,C
hương 6 GV. Ngô Công Thắ
giảng LT JAVA - Ph
2,Chương
Thắng

9

Bài giả
Phầ
ần 2,C
hương 6 GV. Ngô Công Thắ
giảng LT JAVA - Ph
2,Chương
Thắng

10

6.2.1. Biến tham chiếu và kiểu
tham chiếu

6.2. Tạo các đối tượng
6.2.1. Biến tham chiếu và kiểu tham chiếu
6.2.2. Cú
Cú phá
pháp tạ
tạo đố
đối tượ
tượng
6.2.3. Biế
Biến kiể
kiểu cơ bả
bản và
và biế
biến kiể
kiểu tham chiế
chiếu
6.2.4. Giá trị null

Bài giả
Phầ
ần 2,C
hương 6 GV. Ngô Công Thắ
giảng LT JAVA - Ph
2,Chương
Thắng

6.1.5. Ví dụ về khai báo lớp

Trong Java, lớp được coi là kiểu tham chiếu.
Một biến có kiểu lớp được gọi là biến tham
chiế
chiếu đố
đối tượ
tượng (khá
(khác C++, biế
biến có
có kiể
kiểu lớ
lớp là

đối tượ
tượng). Biế
Biến tham chiế
chiếu đố
đối tượ
tượng có
có thể
thể
chứ
chứa tham chiế
chiếu tớ
tới đố
đối tương củ
của lớ
lớp.
Cú pháp khai báo biến tham chiếu đối tượng
như sau:
sau:
TenLop TenBienThamChieu;
Ví dụ: Circle c1;
11

Bài giả
Phầ
ần 2,C
hương 6 GV. Ngô Công Thắ
giảng LT JAVA - Ph
2,Chương
Thắng

12


6.2.3. Biến kiểu cơ bản và biến
kiểu tham chiếu

6.2.2. Cú pháp tạo đối tượng
Để tạo đố
đối tượ
tượng củ
của mộ
một lớ
lớp ta phả
phải gọ
gọi
hàm tạo của lớp bằng toán tử new

Biế
Biến kiể
kiểu cơ bả
bản chứ
chứa giá
giá trị
trị của kiể
kiểu cơ
bản, biến kiểu tham chiếu chứa giá trị là
tham chiếu tới nơi để đối tượng.

new TenLop(DS Các đối số);

Ví dụ: new Circle(5);
Toán tử new tạo đối tượng và trả về tham
chiếu tới đối tượng, tham chiếu này phải
đặt trong một biến tham chiếu.
Ví dụ: Circle c = new Circle();

Biến kiểu cơ bản

int i = 1;

i

1

Biến kiểu tham chiếu

Circle c;

c

reference

c:Circle
radius = 1
Tạo dùng new Circle(1);

Bài giả
Phầ
ần 2,C
hương 6 GV. Ngô Công Thắ
giảng LT JAVA - Ph
2,Chương
Thắng

13

6.2.3. Biến kiểu cơ bản và biến
kiểu tham chiếu

14

6.2.4. Giá trị null

Khi gá
gán mộ
một biế
biến cho mộ
một biế
biến thì
thì giá
giá trị
trị
của biến này được đưa sang biến kia, hai
biến có cùng giá trị.
Với biến kiểu tham chiếu, vì giá trị là tham
chiếu nên sau khi gán hai biến cùng tham
chiếu tới một đối tượng, để lại một đối
tượng không được tham chiếu. JVM sẽ tự
động tìm và giải phóng các vùng nhớ
không được tham chiếu nữa.
Bài giả
Phầ
ần 2,C
hương 6 GV. Ngô Công Thắ
giảng LT JAVA - Ph
2,Chương
Thắng

Bài giả
Phầ
ần 2,C
hương 6 GV. Ngô Công Thắ
giảng LT JAVA - Ph
2,Chương
Thắng

15

Nếu một biến kiểu tham chiếu không tham
chiế
chiếu tớ
tới đố
đối tượ
tượng nà
nào thì
thì nó chứ
chứa giá
giá trị
trị
null.
Java sẽ
sẽ gán giá
giá trị
trị mặc đị
định là
là null cho
biến có kiểu tham chiếu.
Java tự động giải phóng vùng nhớ của đối
tượng không được tham chiếu, bởi vậy,
nếu không cần dùng tới đối tượng nữa, ta
cho biến tham chiếu tới đối tượng đó bằng
null.
Bài giả
Phầ
ần 2,C
hương 6 GV. Ngô Công Thắ
giảng LT JAVA - Ph
2,Chương
Thắng

16


6.3. Truy nhập đối tượng qua
biến tham chiếu

6.3. Truy nhập đối tượng qua biến
tham chiếu

Khi đối tượng được tạo, bên trong đối tượng
luôn có
có một biế
biến tham chiế
chiếu tớ
tới chí
chính đố
đối tượ
tượng
đó. Biến tham chiếu này có tên là từ khóa this.
Nếu một phương thức có tên tham số trùng với
tên biế
biến củ
của lớ
lớp thì
thì trong phương thứ
thức ta có
có thể
thể
truy nhậ
nhập biế
biến củ
của lớ
lớp qua biế
biến this..

Sau khi một đối tượng được tạo ta có thể
truy nhậ
nhập dữ
dữ liệ
liệu và
và gọi cá
các phương thứ
thức
của nó
nó qua biế
biến tham chiế
chiếu tớ
tới nó
nó.
Cú phá
pháp:
TenBienThamChieu.Bien
TenBienThamChieu.PThuc(DS Đối số)

Ví dụ: Lớ
Lớp Circle có
có một biế
biến Radius để
để chứ
chứa bá
bán
kính, hà
hàm tạ
tạo Circle(doube Radius) có
có tên tham số
số
trù
trùng vớ
với tên biế
biến củ
của lớ
lớp =>
=> Để gán giá
giá trị
trị của tham
số cho biế
biến lớ
lớp ta phả
phải dù
dùng this.Radius=Radius

Ví dụ:
Circle c1 = new Circle(1.5);
c1.findArea();
Bài giả
Phầ
ần 2,C
hương 6 GV. Ngô Công Thắ
giảng LT JAVA - Ph
2,Chương
Thắng

Biế
Biến this cũ
cũng có
có thể
thể dùng trong hà
hàm tạ
tạo để
để gọi
một hà
hàm tạ
tạo khá
khác cù
cùng lớ
lớp.
17

18

6.5. Truyền đối tượng cho
phương thức

6.4. Mảng đối tượng
Mảng các đối tượng thực chất là mảng các biến
tham chiế
chiếu tớ
tới đố
đối tượ
tượng.
Để có mảng cá
các đố
đối tượ
tượng ta phả
phải khai bá
báo
mảng các biến tham chiếu tới đối tượng rồi tạo
các đố
đối tượ
tượng và
và gán tham chiế
chiếu cho cá
các phầ
phần
tử của mả
mảng.
Ví dụ:
- Tạo mả
mảng 10 biế
biến tham chiế
chiếu tớ
tới lớ
lớp Circle:
Circle[ ] mang = new Circle[10];
- Tạo 10
10 đối tượ
tượng và
và cho cá
các biế
biến tham chiế
chiếu tớ
tới
chú
chúng:
for(i=0;iBài giả
Phầ
ần 2,C
hương 6 GV. Ngô Công Thắ
giảng LT JAVA - Ph
2,Chương
Thắng

Bài giả
Phầ
ần 2,C
hương 6 GV. Ngô Công Thắ
giảng LT JAVA - Ph
2,Chương
Thắng

19

Giống như mảng, truyền đối tượng cho
phương thứ
thức thự
thực chấ
chất là
là truyề
truyền tham
chiế
chiếu củ
của đố
đối tượ
tượng cho phương thứ
thức.
Bởi vậy trong phương thức có thể tác
động tới đối tượng giống như ở bên ngoài
phương thức.
Để có thể truyền đối tương cho phương
thức thì khi định nghĩa phương thức phải
khai báo tham số là tham chiếu tới đối
tượng.
Bài giả
Phầ
ần 2,C
hương 6 GV. Ngô Công Thắ
giảng LT JAVA - Ph
2,Chương
Thắng

20


6.6. Che giấu thông tin

6.6. Che giấu thông tin

Để đảm bảo nguyên tắc bao gói thông tin, dữ
liệu của lớp phải là private.
Khi dữ
dữ liệ
liệu củ
của lớ
lớp để
để ở private thì
thì bên ngoà
ngoài
lớp không thể truy nhập trực tiếp tới dữ liệu của
đối tượng thông qua tham chiếu tới đối tượng.
Để cho phé
phép bên ngoà
ngoài lớ
lớp có
có thể
thể lấy dữ
dữ liệ
liệu và

thay đổ
đổi dữ
dữ liệ
liệu củ
của đố
đối tượ
tượng thì
thì trong mô tả
tả
lớp phải có phương thức trả về dữ liệu lớp và
thiế
thiết lậ
lập giá
giá trị
trị mới cho dữ
dữ liệ
liệu lớ
lớp.

Phương thức trả về dữ liệu lớp được gọi
là getter (mutator), phương thứ
thức thiế
thiết lậ
lập
giá
giá trị
trị mới cho dữ
dữ liệ
liệu lớ
lớp đượ
được gọ
gọi là

setter (accessor).
Phương thức getter thường có tên là:

Bài giả
Phầ
ần 2,C
hương 6 GV. Ngô Công Thắ
giảng LT JAVA - Ph
2,Chương
Thắng

21

getTenBien
isTenBien nế
nếu kiể
kiểu trả
trả về là boolean.

Phương thứ
thức setter thườ
thường có
có tên là
là:
setTenBien
Bài giả
Phầ
ần 2,C
hương 6 GV. Ngô Công Thắ
giảng LT JAVA - Ph
2,Chương
Thắng

6.7. Các thành viên tĩnh

6.7. Các thành viên tĩnh

Giống như C++, các biến và phương thức của
lớp được chia thành hai loại:

Để khai báo biến và phương thức tĩnh ta
đặt từ
từ khó
khóa static trong khai bá
báo biế
biến và

phương thứ
thức.

Biế
Biến và
và phương thứ
thức thự
thực thể
thể
Biế
Biến và
và phương thứ
thức tĩ
tĩnh

Biế
Biến và
và phương thứ
thức thự
thực thể
thể là của đố
đối tượ
tượng,
chú
chúng gắ
gắn vớ
với đố
đối tượ
tượng.
Bi ến và phương thức tĩnh là của lớp, được dùng
chung bởi tất cả các đối tượng của lớp. Nếu một
đối tượ
tượng thay đổ
đổi biế
biến tĩ
tĩnh thì
thì các đố
đối tượ
tượng
tượ
tượng khá
khác cù
cùng lớ
lớp sẽ
sẽ bị ảnh hưở
hưởng.
Bài giả
Phầ
ần 2,C
hương 6 GV. Ngô Công Thắ
giảng LT JAVA - Ph
2,Chương
Thắng

23

22

private static int numberOfObjects;
public static int getNumberOfObjects()
{ }

Để khai báo hằng của lớp, ta thêm từ
khóa final trong khai báo biến tĩnh. Ví dụ:
private final static double PI = 3.1515;
Bài giả
Phầ
ần 2,C
hương 6 GV. Ngô Công Thắ
giảng LT JAVA - Ph
2,Chương
Thắng

24


6.7. Các thành viên tĩnh

6.8. Đối tượng và lớp hằng
Một đối tượng mà dữ liệu của nó không thể thay
đổi từ
từ khi sinh ra đượ
được là
là đố
đối tượ
tượng hằ
hằng và
và lớp
của nó
nó đượ
được gọ
gọi là
là lớp hằ
hằng.
Để có lớp và
và đố
đối tượ
tượng hằ
hằng chỉ
chỉ cần cho tấ
tất cả
cả
dữ liệ

u

à
private

à
b

t

t
cả

c
á
c
phương
thứ

li l
v
c
th c
setter.
Lưu ý: Một lớp có tất cả dữ liệu là private và
không có
có phương thứ
thức setter chưa chắ
chắc đã là

lớp hằ
hằng, vì
vì nếu phương thứ
thức getter mà
mà trả
trả về
tham chiế
chiếu tớ
tới dữ
dữ liệ
liệu lớ
lớp thì
thì vẫn có
có thể
thể thay đổ
đổi
được.

Phương thức thực thể được gọi theo cú
phá
pháp sau:
BienThamChieuDT.TenPhuongThuc()

Phương thức tĩnh có thể được gọi theo
hai cá
cách:
BienThamChieuDT.TenPhuongThuc()
TenLop.TenPhuongThuc()

Chỉ nên gọi phương thức tĩnh dùng tên
lớp.
Bài giả
Phầ
ần 2,C
hương 6 GV. Ngô Công Thắ
giảng LT JAVA - Ph
2,Chương
Thắng

25

6.9. Các lớp lồng nhau

26

6.9. Các lớp lồng nhau

Kh ác với C++, Java cho phép mô tả một lớp bên
trong mô tả
tả một lớ
lớp khá
khác. Đây đượ
được gọ
gọi là
là sự
lồng nhau củ
của cá
các lớ
lớp.
Lớp bên trong mộ
một lớ
lớp khá
khác có
có các đặ
đặc điể
điểm
sau:
Có thể
thể truy nhậ
nhập biế
biến và
và phương thứ
thức củ
của lớ
lớp ngoà
ngoài
chứ
chứa nó
nó.
Có thể
thể khai bá
báo là
là public, private và
và protected giố
giống
như cá
các thà
thành viên củ
của lớ
lớp ngoà
ngoài.
Có thể
thể khai bá
báo là
là static. Nế
Nếu lớ
lớp trong là
là static thì
thì
không thể
thể truy nhậ
nhập cá
các thà
thành viên không phả
phải tĩ
tĩnh
của lớ
lớp ngoà
ngoài.
Bài giả
Phầ
ần 2,C
hương 6 GV. Ngô Công Thắ
giảng LT JAVA - Ph
2,Chương
Thắng

Bài giả
Phầ
ần 2,C
hương 6 GV. Ngô Công Thắ
giảng LT JAVA - Ph
2,Chương
Thắng

Lớp bên trong một lớp khác có các đặc
điể
điểm sau:
Đối tượng của lớp trong có thể tạo bên trong
lớp ngoà
ngoài hoặ
hoặc bên trong mộ
một lớ
lớp khá
khác.
Nếu tạ
tạo trong lớ
lớp khá
khác thì
thì theo cú
cú phá
pháp sau:
Nếu lớp bên trong không phải static thì phải tạo
đối tượ
tượng lớ
lớp ngoà
ngoài trướ
trước, sau đó
đó dùng:
TenLopNgoai.TenLopTrong TenBien = DoiTuongLopNgoai. new TenLopTrong();

Nếu lớ
lớp bên trong là
là static thì
thì chỉ
chỉ cần dù
dùng cú

phá
pháp sau:
TenLopNgoai.TenLopTrong TenBien = TenLopNgoai. new TenLopTrong();

27

Bài giả
Phầ
ần 2,C
hương 6 GV. Ngô Công Thắ
giảng LT JAVA - Ph
2,Chương
Thắng

28


Chương 7. Xâu ký tự

7.1. Xâu ký tự trong Java
Một xâu ký tự
tự là một dãy cá
các ký tự
tự. Khá
Khác vớ
với
C++, trong Java xâu ký tự
tự không phả
phải là
là mảng
các ký tự

m
à
l
à
m

t
đố

i
tượ

ng.
t
đ tư
Java có
có 3 lớ
lớp xâu ký tự
tự đượ
được dù
dùng để
để lưu trữ
trữ và
xử lý cá
các xâu ký tự
tự: Lớ
Lớp String, lớ
lớp StringBuffer
và lớp StringTokenizer.
Lớp String đượ
được dù
dùng để
để tạo ra cá
các xâu ký tự
tự cố
định, không thể
thể thay đổ
đổi đượ
được. Lớ
Lớp StringBuffer
đượ
được dù
dùng để
để tạo ra cá
các xâu ký tự
tự có thể
thể thay
đổi đượ
được. Lớ
Lớp StringTokenizer đượ
được dù
dùng để
để
lưu trữ
trữ các xâu ký tự
tự và tách ra cá
các xâu con.

7.1. Xâu ký tự
tự trong Java
7.2. Lớp String
7.3. Lớ
Lớp Character
7.4. Lớp StringBuffer
7.5. Lớp StringTokenizer
Bài tập chương 7

hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

1

hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

2

String

7.2. Lớp String
Lớp java.lang.String
java.lang.String đượ
được tự
tự độ
động nạ
nạp
vào trong mọi chương trình java => không
cần dùng lệnh nạp (import) lớp.
Lớp String có nhiều hàm tạo cho phép tạo
các đối tượng xâu ký tự theo nhiều cách
khá
khác nhau và
và nhiề
nhiều phương thứ
thức dù
dùng để
để
lấy từ
từng ký tự
tự của xâu, so sá
sánh xâu, tì
tìm
xâu con, tách xâu con…
hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

3

+String()
+String(value: String)
+String(value: char[])
+charAt(index: int): char
+compareTo(anotherString: String): int
+compareToIgnoreCase(anotherString: String): int
+concat(anotherString: String): String
+endsWithSuffixe(suffix: String): boolean
+equals(anotherString: String): boolean
+equalsIgnoreCase(anotherString: String): boolean
+indexOf(ch: int): int
+indexOf(ch: int, fromIndex: int): int
+indexOf(str: String): int
+indexOf(str: String, fromIndex: int): int
+intern(): String
+regionMatches(toffset: int, other: String, offset: int, len: int): boolean
+length(): int
+replace(oldChar: char, newChar: char): String
+startsWith(prefix: String): boolean
+subString(beginIndex: int): String
+subString(beginIndex: int, endIndex: int): String
+toCharArray(): char[]
+toLowerCase(): String
+toString(): String
+toUpperCase(): String
+trim(): String
+copyValueOf(data: char[]): String
+valueOf(c: char): String
+valueOf(data: char[]): String
+valueOf(d: double): String
+valueOf(f: float): String
+valueOf(i:
i giả
LT JAVA - Phầ
hương 7 GV. Ngô Công Thắ
Bàint):
giảngString
Phần 2,C
2,Chương
Thắng
+valueOf(l: long): String

4


7.2. Lớp String

7.2.1. Tạo xâu ký tự lớp String

7.2.1. Tạ
Tạo xâu ký tự
tự lớp String
7.2.2. Lấ
Lấy chiề
chiều dà
dài và
và từng ký tự
tự của xâu
7.2.3. Nố
Nối cá
các xâu
7.2.4. Tá
Tách cá
các xâu con
7.2.5. So sánh xâu
7.2.6. Chuyể
Chuyển đổ
đổi xâu
7.2.7. Tì
Tìm ký tự
tự và xâu con trong mộ
một xâu
7.2.8. Chuyể
Chuyển đổ
đổi giữ
giữa mả
mảng ký tự
tự và xâu
7.2.9. Chuyể
Chuyển cá
các ký tự
tự và giá
giá trị
trị số thà
thành đố
đối
tượ
tượng xâu ký tự
tự
hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

Lớp String có
có nhiề
nhiều hà
hàm tạ
tạo để
để tạo đố
đối
tượng xâu ký tự, hay dùng nhất là hàm tạo
String(Hằng xâu):
String BienXau = new String(Hằ
String(Hằng xâu);
hoặ
hoặc
String BienXau = Hằ
Hằng xâu;

Ví dụ:
String strVar = new String(“
String(“DHNN1 HN”
HN”);
5

6

7.2.2. Lấy chiều dài và từng ký tự
của xâu

7.2.1. Tạo xâu ký tự lớp String

Để lấy chiều dài một xâu ký tự ta dùng
phương thức length()
Để lấy từng ký tự của xâu ta dùng phương
thứ
thức charAt(index),
charAt(index), trong
trong đó
đó index có
có giá
giá
trị
trị từ 0 đến chiề
chiều dà
dài xâu trừ
trừ 1.
Ví dụ:

Một đối tượng xâu ký tự String sau khi tạo
không thể
thể thay đổ
đổi đượ
được, tứ
tức là
là nội dung củ
của nó

không thay đổi được.
Ví dụ:
String s = new String(“
String(“Java”
Java”);
s = "HTML";

Khi gá
gán s = “HTML”
HTML” tạo ra mộ
một đố
đối tượ
tượng xâu
mới có
có nội dung là
là “HTML”
HTML” và gán tham chiế
chiếu
tới s, còn đố
đối tượ
tượng xâu có
có nội dung là
là “Java”
Java”
không đượ
được tham chiế
chiếu nữ
nữa sẽ
sẽ bị hủy.
hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

String s = "Welcome";
s.length() cho giá
giá trị
trị 7
s.charAt(1) cho ký tự
tự ‘e’
7

hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

8


7.2.3. Nối các xâu

7.2.4. Tách các xâu con

Để nối hai hoặc nhiều xâu ký tự ta có thể
dùng phương thức concat() hoặc dùng
phé
phép toá
toán cộ
cộng.
Ví dụ:

Có thể
thể lấy ra mộ
một phầ
phần củ
của đố
đối tượ
tượng xâu ký tự
tự
bằng phương thứ
thức substring().
substring(). Phương
Phương thứ
thức
này có
ó
2
dạ

ng:
c
d
substring(beginIndex,endIndex) trả
trả về một đố
đối tượ
tượng
xâu chứ
chứa ký tự
tự từ beginIndex đế
đến endIndexendIndex-1.
substring(beginIndex) trả
trả về một đố
đối tượ
tượng xâu chứ
chứa
ký tự
tự từ beginIndex đế
đến cuố
cuối xâu.

String s3 = s1.concat(s2);
hoặ
hoặc
String s3 = s1 + s2;

Ví dụ:
String s = “DHNN1";
s.substring(2, 3) cho “N”
s.substring(3) cho “N1”
N1”

Trong Java hay dù
dùng phé
phép cộ
cộng để
để ghé
ghép
hai hoặ
hoặc nhiề
nhiều xâu ký tự
tự.
hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

9

hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

7.2.5. So sánh xâu

7.2.5. So sánh xâu

Giống C++, trong Java không dùng được
các phép toán so sánh để so sánh hai xâu
ký tự
tự.
Muố
Muốn so sá
sánh hai xâu ký tự
tự ta phả
phải dù
dùng
phương thứ
thức equals() hoặ
hoặc compareTo()

Nếu muố
muốn so sá
sánh hai xâu ký tự
tự không
phân biệt chữ hoa, chữ thường thì dùng
phương thức equalsIgnoreCase() hoặc
compareToIgnoreCase().
Ví dụ:
“dhnn1”
dhnn1”.equalsIgnoreCase(“
.equalsIgnoreCase(“DHNN1”
DHNN1”) cho
giá
giá trị
trị true.

s1.equals(s2) cho true nế
nếu nộ
nội dung s1 giố
giống
nội dung s2.
s1.compareTo(s2) cho giá trị 0 nếu s1=s2,
cho giá
giá trị
trị < 0 nế
nếu s1và cho giá
giá trị
trị > 0
nếu s1>s2. (giố
(giống hà
hàm strcmp() trong C++).
hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

11

hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

10

12


7.2.5. So sánh xâu

7.2.6. Chuyển đổi xâu
Mặc dù nội dung của đối tượng xâu String
không thể
thể thay đổ
đổi nhưng ta có
có thể
thể dùng cá
các
phương thức toLowerCase(), toUpperCase(),
trim() và
và replace()
replace() để tạo ra cá
các xâu mớ
mới.
s.toLowerCase() cho xâu ký tự
tự chữ
chữ thườ
thường củ
của
s.
s.toUpperCase() cho xâu ký tự
tự chữ
chữ hoa củ
của s.
s.trim() cho xâu ký tự
tự của s nhưng không có
có dấu
cách ở hai đầ
đầu.

Để kiể
kiểm tra xem mộ
một xâu có
có bắt đầ
đầu hay
kết thúc bằng một xâu nào đó ta dùng
phương thức startWith(prefix) và
endWith(suffix)
Ví dụ:
String s = “Welcome to Java”
Java”;
s. startWith(“
startWith(“Wel”
Wel”) cho giá
giá trị
trị true
s.endWith(“
s.endWith(“Java”
Java”) cho giá
giá trị
trị true
hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

13

7.2.6. Chuyển đổi xâu

14

7.2.6. Chuyển đổi xâu

s.replace(oldChar, newChar) cho xâu ký tự của
s nhưng thay thế
thế tất cả
cả các ký tự
tự oldChar bằ
bằng
ký tự newChar.
s.replaceFirst(oldSubstr,newSubstr) cho xâu ký
tự của s nhưng thay thế
thế xâu con oldSubstr bằ
bằng
xâu con newSubstr tạ
tại vị
vị trí
trí xuấ
xuất hiệ
hiện đầ
đầu tiên.
s.replaceAll(oldSubstr,newSubstr) cho xâu ký tự
tự
của s nhưng thay thế
thế xâu con oldSubstr bằ
bằng
xâu con newSubstr tạ
tại tấ
tất cả
cả các vị
vị trí
trí xuấ
xuất hiệ
hiện.
hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

15

Ví dụ:
"Welcome".replace(‘
"Welcome".replace(‘e’, ‘A’) => “WAlcome”
WAlcome”
"Welcome".replaceFirst("e", "A") => “WAcome”
WAcome”
"Welcome".replaceAll("e", "A") => “WAlcomA”
WAlcomA”

hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

16


7.2.7. Tìm ký tự và xâu con trong
một xâu

7.2.7. Tìm ký tự và xâu con trong
một xâu

Dùng cá
các phương thứ
thức indexOf() và

lastIndexOf() để
để tìm mộ
một ký tự
tự hoặ
hoặc mộ
một xâu con
trong mộ

t
xâu

tự

.
m
t

Ví d ụ
✥✿

indexOf(int ch)
lastIndexOf(int ch)
indexOf(int ch, int fromIndex)
lastIndexOf(int ch, int endIndex)
indexOf(String str)
lastIndexOf(String str)
indexOf(String ch, int fromIndex)
lastIndexOf(String str, int endIndex)
hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

"Welcome to Java!".indexOf('W') returns 0.
"Welcome to Java!".indexOf('x') returns -1.
"Welcome to Java!".indexOf('o', 5) returns 9.
"Welcome to Java!".indexOf("come") returns 3.
"Welcome to Java!".indexOf("Java", 5) returns 11.
"Welcome to Java!".indexOf("java", 5) returns -1.

17

hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

7.2.8. Chuyển đổi giữa mảng ký tự
và xâu

7.2.9. Chuyển các ký tự và giá trị
số thành đối tượng xâu ký tự

Chuyển đối tượng xâu ký tự thành mảng các ký
tự dùng phương thứ
thức toCharArray(). Ví
Ví dụ:

Phương thứ
thức valueOf đượ
được chồ
chồng để
để
chuyển một ký tự hoặc một số thành xâu
ký tự.
Ví dụ:

char[] chars = “Java”
Java”.toCharArray();

Chuyể
Chuyển mả
mảng cá
các ký tự
tự thà
thành đố
đối tượ
tượng xâu ký
tự dùng hà
hàm tạ
tạo String(mả
String(mảng kt) hoặ
hoặc phương
thức valueOf(m ảng kt).
Ví dụ:

18

String str = String.valueOf(5.44); cho “5.44”
5.44”

String str = new String(new char[] {'J','a','v','a'});
String str = String.valueOf(new char[] {'J','a','v','a'});

hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

19

hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

20


7.3. Lớp Character

7.3. Lớp Character

Với mỗ
mỗi kiể
kiểu dữ
dữ liệ
liệu cơ sở
sở, Java có
có một
lớp gói (wrapper class): Character,
Boolean, Byte, Short, Integer, Long, Float,
Double. Các kiểu dữ liệu cơ sở được
đóng gói trong các lớp tương ứng. Các giá
trị
trị kiể
kiểu cơ sở
sở có thể
thể dùng như cá
các đố
đối
tượng.
Tất cả các lớp gói trên đặt trong java.lang
hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

21

7.3. Lớp Character

Character
+Character(value: char)
+charValue(): char
+compareTo(anotherCharacter: Character): int
+equals(anotherCharacter: Character): boolean
+isDigit(ch: char): boolean
+isLetter(ch: char): boolean
+isLetterOrDigit(ch: char): boolean
+isLowerCase(ch: char): boolean
+isUpperCase(ch: char): boolean
+toLowerCase(ch: char): char
+toUpperCase(ch: char): char

hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

22

7.4. Lớp StringBuffer

Ví dụ 

7.4.1. Giớ
Giới thiệ
thiệu về
về lớp StringBuffer
7.4.2. Tạo đối tượng xâu StringBuffer
7.4.3. Thay đổ
đổi xâu ký tự
tự StringBuffer

Character charObj = new Character('b');
charObj.compareTo(new Character('a')) returns 1
charObj.compareTo(new Character('b')) returns 0
charObj.compareTo(new Character('c')) returns -1
charObj.compareTo(new Character('d') returns –2
charObj.equals(new Character('b')) returns true
charObj.equals(new Character('d')) returns false

hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

23

hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

24


7.4.1. Giới thiệu về lớp StringBuffer

7.4.1. Giới thiệu về lớp StringBuffer
StringBuffer

Lớp StringBuffer đượ
được dù
dùng như lớ
lớp
String nhưng mềm dẻo hơn. Nội dung của
đối tượng StringBuffer có thể thay đổi
trong khi nội dung của đối tượng String thì
không.
Lớp StringBuffer có
có 3 hà
hàm tạ
tạo và
và trên 30
phương thứ
thức để
để quả
quản lý vù
vùng nhớ
nhớ chứ
chứa
xâu (buffer) và thay đổi xâu.
hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

25

7.4.2. Tạo đối tượng xâu
StringBuffer

+append(data: char[]): StringBuffer
+append(data: char[], offset: int, len: int): StringBuffer
+append(v: aPrim itiveType): StringBuffer
+append(str: String): StringBuffer
+capacity(): int
+charAt(index: int): char
+delete(startIndex: int, endIndex: int): StringBuffer
+deleteCharAt(int index): StringBuffer
+insert(index: int, data: char[], offset: int, len: int): StringBuffer
+insert(offset: int, data: char[]): StringBuffer
+insert(offset: int, b: aPrim itiveType): StringBuffer
+insert(offset: int, str: String): StringBuffer
+length(): int
+replace(int startIndex, int endIndex, String str): StringBuffer
+reverse(): StringBuffer
+setCharAt(index: int, ch: char): void
+setLength(new Length: int): void
+substring(start: int): StringBuffer
+substring(start:
int, end: int):
StringBuffer
hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

26

7.4.2. Tạo đối tượng xâu
StringBuffer

Có thể tạo đối tượng xâu StringBuffer
bằng một trong 3 hàm tạo:

Ví dụ:
StringBuffer s = new StringBuffer(“
StringBuffer(“DHNN1”
DHNN1”);

StringBuffer() => Tạ
Tạo mộ
một đố
đối tượ
tượng xâu
không chứ
chứa ký tự
tự nào, có
có kích thướ
thước là
là 16.
StringBuffer(int length) => Tạ
Tạo mộ
một đố
đối tượ
tượng
xâu không chứa ký tự nào, có kích thước là
length.
StringBuffer(String str) => Tạ
Tạo mộ
một đố
đối tượ
tượng
xâu chứ

a
str,

ó
k
í
ch
thướ

c

à
16
+
ch
c
thư l
str.length().
hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

27

hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

28


7.4.3. Thay đổi xâu ký tự
StringBuffer

7.4.3. Thay đổi xâu ký tự
StringBuffer

Dùng phương thứ
thức append()
append() để thêm và
vào cuố
cuối xâu
StringBuffer cá
các giá
giá trị
trị boolean, char, char array, double,
float, int, long và
và String.
Ví dụ: Cá
Các lệ
lệnh sau tạ
tạo ra xâu “Welcome to Java”
Java”
StringBuffer strBuf = new StringBuffer();
strBuf.append("Welcome");
strBuf.append(' ');

Dùng phương thứ
thức insert()
insert() để chè
chèn và
vào
một vị trí xác định trong xâu StringBuffer
các giá trị boolean, char, char array,
double, float, int, long và String.
insert(p, str) => Chèn str vào vị trí p
Ví dụ: StringBuffer s = new StringBuffer(“Welcome to Java”);

strBuf.append("to");

s.insert(11,”HTML and ”); => “Welcome to HTML and Java”

strBuf.append(' ');
strBuf.append("Java");
hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

29

7.4.3. Thay đổi xâu ký tự
StringBuffer

30

7.5. Lớp StringTokenizer

Xóa ký tự của xâu:
delete(beginIndex,endIndex) => Xó
Xóa cá
các ký tự
tự từ vị trí
trí
beginIndex đế
đến endIndexendIndex-1
deleteCharAt(index) => Xó
Xóa ký tự
tự tại vị
vị trí
trí index

Đảo ngượ
ngược xâu: reverse()
Thay thế
thế các ký tự
tự của xâu:
replace(beginIndex,endIndex,str) => Thay cá
các ký tự
tự từ
beginIndex đế
đến endIndex bằ
bằng str.

Thay thế
thế ký tự
tự tại mộ
một vị
vị trí
trí: setCharAt(index,ch)
hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

31

Một xâu ký tự có thể được tách thành
các xâu con (mảnh, token) bởi các ký
tự phân tách (delimiter). Để có thể
tách thành các xâu con ta phải dùng
đối tượng xâu ký tự lớp
StringTokenizer.
Lớp StringTokenizer nằm trong gói
java.util và được tự động import khi
biên dịch.
hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

32


7.5. Lớp StringTokenizer

7.5. Lớp StringTokenizer

Các hà
hàm tạ
tạo:

Một số phương thức:

StringTokenizer(String s)
StringTokenizer(String s, String delim)
StringTokenizer(String s, String delim,
boolean returnTokens)

boolean hasMoreTokens()
String nextToken()
String nextToken(String delim)

Ví dụ:

Ví dụ:

String s = "Java is cool."
StringTokenizer tkz = new StringTokenizer(s);
System.out.println("Tong so token = " + tkz.countTokens());
while (tkz.hasMoreTokens())
System.out.println(tkz.nextToken());

String s = "Java is cool."
StringTokenizer tkz = new StringTokenizer(s);
StringTokenizer tkz = new StringTokenizer(s,"ac");
StringTokenizer tkz = new StringTokenizer(s,"ac",true);

hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

33

hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

34

Bài tập chương 7

Bài tập chương 7

Bài 1. Viế
Viết chương trì
trình nhậ
nhập và
vào mộ
một xâu
ký tự và một ký tự. Gọi phương thức đếm
số lần xuất hiện của ký tự trong xâu ký tự
String đã nhập. Tiêu đề phương thức đếm
có dạng:

Bài 2. Viết phương thức đếm số lần xuất
hiện của mỗi chữ số trong một xâu ký tự
String. Tiêu đề
đề phương thứ
thức đế
đếm có
có dạng:

public static int count(String str, char ch)
Ví dụ: count(“
count(“Welcome”
Welcome”,’e’) trả
trả về 2

hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

35

public static int[] count(String str)

Phương thức trả về mảng 10 phần tử, mỗi
phần tử chứa số đếm được cho 1 chữ số.
Viết chương trình nhập vào 1 xâu ký tự có
chứa số, hiển thị kết quả đếm cho từng
chữ
chữ số có mặt trong xâu.
hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

36


Bài tập chương 7

Bài tập chương 7

Bài 3. Viế
Viết phương thứ
thức chuyể
chuyển mộ
một số
số hex
cho dưới dạng xâu ký tự thành số nguyên
thập phân. Tiêu đề của phương thức có
dạng sau:
int parseHex(String hexString)
Viết chương trình nhập vào 1 số hex dưới
dạng xâu, gọi phương thức parseHex() để
chuyể
chuyển thà
thành số
số nguyên thậ
thập phân và

đưa kế
kết quả
quả ra mà
màn hì
hình.
hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

37

Bài tập chương 7

hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

38

Bài tập chương 7

Bài 5. Viế
Viết phương thứ
thức chuyể
chuyển mộ
một số
số
nguyên dương thập phân thành số hex
dưới dạng xâu ký tự. Tiêu đề của phương
thức có dạng sau:
String convertDecimalToHex(int value)
Viết chương trình nhập vào 1 số nguyên
dương, gọi phương thức này để chuyển
thà
thành số
số hex và
và đưa kế
kết quả
quả ra mà
màn hì
hình.
hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

Bài 4. Viế
Viết phương thứ
thức chuyể
chuyển mộ
một số
số nhị
nhị
phân cho dưới dạng xâu ký tự thành số
nguyên thập phân. Tiêu đề của phương
thức có dạng sau:
int parseBin(String binString)
Viết chương trình nhập vào 1 số binary
dưới dạng xâu, gọi phương thức
parseBin() để
để chuyể
chuyển thà
thành số
số nguyên
thậ
thập phân và
và đưa kế
kết quả
quả ra mà
màn hì
hình.

39

Bài 6. Viế
Viết phương thứ
thức sắ
sắp xế
xếp cá
các ký tự
tự
trong một xâu ký tự theo chiều tăng dần
và trả về xâu ký tự đã sắp xếp. Tiêu đề
của phương thức có dạng sau:
String sort(String s)
Viết chương trình nhập vào 1 xâu ký tự,
đưa ra màn hình xâu ký tự đã sắp xếp.

hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

40


Bài tập chương 7

Bài tập chương 7

Bài 7. Viế
Viết phương thứ
thức kiể
kiểm tra xem hai từ
từ
có phải là anagram. Hai từ được gọi là
anagram với nhau nếu chúng có số chữ
cái giống nhau từng đôi một, không kể đến
thứ tự. Tiêu đề của phương thức có dạng
sau:
boolean isAnagram(String s1, String s2)
Viế
Viết chương trì
trình nhậ
nhập và
vào 2 từ
từ, đưa kế
kết
quả
quả kiể
kiểm tra ra mà
màn hì
hình.

Bài 8. Viết chương trình nhập vào một xâu
ký tự. Đếm xem trong xâu đó có bao nhiêu
từ. Biế
Biết rằ
rằng cá
các từ
từ phân cá
cách nhau bở
bởi
dấu cá
cách và
và các dấ
dấu chấ
chấm câu. Đưa kế
kết
quả ra màn hình.
Bài 9. Viết chương trình nhập vào một dãy
số thực dưới dạng xâu ký tự, các số thực
phân cách nhau bởi ít nhất một dấu cách.
Tính tổng các số thực và đưa kết quả ra
màn hình.

hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

hương 7 GV. Ngô Công Thắ
Bà i giả
giảng LT JAVA - Phầ
Phần 2,C
2,Chương
Thắng

41

42



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay

×