Chương 10

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 44

Trang 1

Hướng đối tượng


Lập trình

Trong chương này, bạn sẽ tìm hiểu về:

Các nguyên tắc của lập trình hướng đối tượng


Các lớp học
Quyền truy cập công khai và riêng tư
Các cách tổ chức lớp học
Phương pháp phiên bản
Phương pháp tĩnh
Sử dụng các đối tượng
Trang 2

CHƯƠNG 1 0 Lập trình hướng đối tượng

Nguyên tắc lập trình hướng đối tượng


Lập trình hướng đối tượng (OOP) là một mô hình lập trình tập trung vào một
các thành phần và dữ liệu của ứng dụng và các phương pháp bạn cần để thao tác chúng. Với
OOP, bạn xem xét các mục mà một chương trình sẽ thao tác — ví dụ: một khách hàng
428 hóa đơn, đơn xin vay, một nút mà người dùng nhấp vào hoặc một menu mà từ đó người dùng chọn một
Lựa chọn. Các mục này được gọi là các đối tượng và khi bạn lập trình, bạn xác định chúng
đặc điểm, chức năng và khả năng.

OOP sử dụng tất cả các khái niệm quen thuộc của lập trình thủ tục mô-đun, chẳng hạn như các biến,
các phương thức và truyền đối số. Các phương thức trong chương trình hướng đối tượng tiếp tục được sử dụng
cấu trúc tuần tự, lựa chọn và lặp và tận dụng các mảng. Tuy nhiên, OOP cho biết thêm
một số khái niệm mới về lập trình và liên quan đến một cách suy nghĩ khác. A
lượng từ vựng mới đáng kể cũng được tham gia. Đầu tiên, bạn sẽ đọc về OOP
các khái niệm nói chung, và sau đó bạn sẽ học các thuật ngữ cụ thể.
Năm tính năng quan trọng của ngôn ngữ hướng đối tượng là:
Các lớp học
Các đối tượng
Tính đa hình
Di sản
Đóng gói

Lớp và Đối tượng


Trong thuật ngữ hướng đối tượng, một lớp mô tả một nhóm hoặc tập hợp các đối tượng với
các thuộc tính chung. Một đối tượng là một thể hiện của một lớp. Lập trình viên hướng đối tượng
đôi khi nói rằng một đối tượng là một bản khởi tạo của một lớp; khi một chương trình tạo một đối tượng, nó
khởi tạo đối tượng. Các từ in đậm trong câu trước đều bắt nguồn từ
ví dụ. Ví dụ: redChevroletAutomobileWithTheDent của bạn là một thể hiện của lớp
mô tả tất cả các loại ô tô và goldenRetrieverDogNamedGinger của bạn là một ví dụ về
lớp mô tả tất cả các con chó. Một lớp học giống như một bản thiết kế mà từ đó nhiều ngôi nhà có thể
được xây dựng, hoặc giống như một công thức mà từ đó nhiều bữa ăn có thể được chuẩn bị. Một ngôi nhà và một bữa ăn là
mỗi một thể hiện của lớp của họ; cuối cùng có thể tạo ra vô số phiên bản. Ví dụ,
Hình 10-1 mô tả một lớp Dog và hai trường hợp của nó.

https://translate.googleusercontent.com/translate_f 2/41
9/7/2021 Lập trình hướng đối tượng
Trang 3

Nguyên tắc lập trình hướng đối tượng

Mô tả lớp học Cá thể hoặc đối tượng

Tên lớp Chó


Mũi nhọn
4 năm
Tên Đúng
Thuộc tính hoặc 429
tuổi tác
lĩnh vực
hasShots

Phương pháp thay đổi tên


Phương pháp
Phương pháp cập nhật ảnh chụp
Brutus
7 năm
Không

Hình 10-1 Một lớp Dog và hai trường hợp


© 2015 Cengage Learning

Các đối tượng cả trong thế giới thực và trong lập trình hướng đối tượng có thể chứa các thuộc tính
và các phương pháp. Các thuộc tính là các đặc điểm của một đối tượng. Ví dụ, một số
thuộc tính của ô tô là sản xuất, kiểu máy, năm và giá mua. Các thuộc tính này không
thay đổi trong suốt vòng đời của xe. Ví dụ về các thuộc tính thường xuyên thay đổi bao gồm
ô tô hiện đang chạy, hộp số, tốc độ của nó và nó có bị bẩn hay không. Tất cả ô tô
sở hữu các thuộc tính giống nhau, nhưng không cùng giá trị cho các thuộc tính đó. Tương tự, con chó của bạn
có các thuộc tính về giống, tên, tuổi và liệu các mũi chích ngừa của nó có hiện tại hay không. Các phương pháp là
các hành động có thể được thực hiện trên một đối tượng; thường họ thay đổi, sử dụng hoặc truy xuất các thuộc tính. Đối với
ví dụ, một chiếc ô tô có các phương pháp để thay đổi và xem tốc độ của nó, và một con chó có
các phương pháp để thiết lập và tìm ra trạng thái bắn của nó.

Việc coi các mục như các thể hiện của một lớp cho phép bạn áp dụng kiến ​thức chung của mình về
lớp cho các đối tượng riêng lẻ được tạo ra từ nó. Bạn biết một đối tượng có những thuộc tính nào khi
bạn biết lớp nào định nghĩa nó. Ví dụ: nếu bạn của bạn mua Ô tô , bạn
biết nó có tên kiểu mẫu, và nếu bạn của bạn nhận được một con Chó , bạn sẽ biết con chó đó có giống. Bạn
có thể không biết trạng thái hiện tại của Ô tô của bạn bè bạn , chẳng hạn như tốc độ hiện tại của nó, hoặc
trạng thái các cảnh quay của Chú chó của cô ấy , nhưng bạn có biết những thuộc tính nào tồn tại cho Ô tô và
Các lớp chó ,
cho phép bạn hình dung các đối tượng này một cách hợp lý trước khi bạn nhìn thấy chúng.
Bạn biết đủ để hỏi kiểu xe ô tô chứ không phải giống của nó; bạn biết đủ để hỏi
tên của Con chó chứ không phải kích thước động cơ của nó. Một ví dụ khác, khi bạn sử dụng một ứng dụng mới
trên máy tính của mình, bạn mong đợi mỗi thành phần có các thuộc tính cụ thể, nhất quán, chẳng hạn như
một nút có thể nhấp được hoặc một cửa sổ có thể đóng được. Mỗi thành phần nhận được các thuộc tính này như
một thể hiện của lớp chung của các thành phần GUI (giao diện người dùng đồ họa).
Trang 4

Hầu hết các lập trình viên sử dụng một quy ước đặt tên trong đó tên lớp bắt đầu bằng một chữ cái viết hoa và
các mã nhận dạng nhiều từ được chạy cùng nhau, chẳng hạn như SavingsAccount hoặc TemporaryWorker. Mỗi cái mới
từ trong mã định danh bắt đầu bằng một chữ cái viết hoa. Trong Chương 2, bạn đã biết rằng quy ước này là
được gọi là vỏ Pascal.

Phần lớn hiểu biết của bạn về thế giới đến từ khả năng phân loại các đối tượng và
430
sự kiện thành các lớp. Khi còn nhỏ, bạn đã học khái niệm về động vật từ rất lâu trước khi bạn biết
từ. Cuộc gặp gỡ đầu tiên của bạn với một con vật có thể là với con chó của gia đình, một
con mèo của nhà hàng xóm, hoặc một con dê ở vườn thú cưng. Khi bạn phát triển bài phát biểu, bạn có thể đã sử dụng
cùng một thuật ngữ cho tất cả những sinh vật này, vui sướng hét lên "Doggie!" như cha mẹ bạn đã chỉ ra
bò, ngựa và cừu trong sách tranh hoặc dọc theo lề đường trên đường lái xe trong nước. Như
bạn trở nên tinh vi hơn, bạn học cách phân biệt chó với bò; vẫn sau đó, bạn
đã học để phân biệt các giống. Sự hiểu biết của bạn về lớp Động vật giúp bạn thấy
sự tương đồng giữa chó và bò và hiểu biết của bạn về lớp Chó giúp bạn thấy
điểm tương đồng giữa Great Dane và Chihuahua. Việc hiểu các lớp học mang lại cho bạn một
khung phân loại trải nghiệm mới. Bạn có thể không biết thuật ngữ okapi, nhưng khi
bạn học nó là một con vật, bạn bắt đầu phát triển một khái niệm về okapi có thể như thế nào.
Khi bạn suy nghĩ theo hướng đối tượng, mọi thứ đều là đối tượng. Bạn có thể nghĩ về bất kỳ
vật thể vô tri vô giác như một đồ vật — bàn làm việc, máy tính và ngôi nhà của bạn đều được gọi là
đồ vật trong hội thoại hàng ngày. Bạn cũng nghĩ về đồ vật cũng như đồ vật — cây nhà của bạn,
con cá vàng cưng của bạn, và em gái của bạn là đồ vật. Các sự kiện cũng là đối tượng — việc mua cổ phiếu mà bạn
đã thực hiện, việc đóng thế chấp mà bạn đã tham dự, và bữa tiệc tốt nghiệp của bạn đều là đồ vật.
Mọi thứ đều là một đối tượng, và mọi đối tượng là một thể hiện của một lớp tổng quát hơn. Bàn của bạn là một
thể hiện của lớp bao gồm tất cả các bàn và chú cá vàng cưng của bạn là một thể hiện của lớp
chứa tất cả cá. Những tuyên bố này thể hiện mối quan hệ là mối quan hệ bởi vì bạn có thể nói, "Của tôi
bàn làm việc bằng gỗ sồi với vết xước phía trên là Bàn và con cá vàng của tôi tên là Moby là Cá ”. Của bạn
cá vàng, cá bảy màu của tôi và cá mập trong vườn thú mỗi con tạo thành một thể hiện của lớp Cá .

Các lập trình viên hướng đối tượng cũng sử dụng thuật ngữ is-a khi mô tả sự kế thừa. Bạn sẽ học về
kế thừa ở phần sau của chương này và trong chương 11.

Khái niệm về một lớp rất hữu ích vì khả năng tái sử dụng của nó. Ví dụ, nếu bạn mời tôi đến một
tiệc tốt nghiệp, tôi tự động biết nhiều điều về đối tượng của đảng. Tôi cho rằng
sẽ có các thuộc tính như thời gian bắt đầu, số lượng khách, số lượng thức ăn và
những món quà. Tôi hiểu các đảng vì kiến ​thức trước đây của tôi về lớp Đảng , trong đó tất cả
các bên là những ví dụ hoặc trường hợp hữu hình. Tôi không biết số lượng khách hoặc ngày hoặc
thời gian của bữa tiệc cụ thể này, nhưng tôi hiểu rằng vì tất cả các bên đều có ngày và giờ,
thì cái này cũng phải như vậy. Tương tự, mặc dù mọi giao dịch mua cổ phiếu là duy nhất, nhưng mỗi lần mua phải
có một lượng đô la và một số cổ phiếu. Tất cả các đối tượng đều có các thuộc tính có thể dự đoán được vì
chúng được khởi tạo từ các lớp cụ thể.
Các thành phần dữ liệu của một lớp thuộc về mọi đối tượng được khởi tạo là các thành phần của lớp
biến cá thể . Các biến phiên bản thường được gọi là các trường để giúp phân biệt chúng với
các biến khác mà bạn có thể sử dụng. Tập hợp tất cả các giá trị hoặc nội dung của phiên bản đối tượng

Trang 5

Nguyên tắc lập trình hướng đối tượng

các biến được gọi là trạng thái của nó . Ví dụ: trạng thái hiện tại của một bên cụ thể có thể là
8 giờ tối và thứ sáu; trạng thái của một giao dịch mua cổ phiếu cụ thể có thể là $ 10 và năm cổ phiếu.

https://translate.googleusercontent.com/translate_f 4/41
9/7/2021 Lập trình hướng đối tượng
Ngoàikhởi
được các thuộc
tạo từ tính
một của
lớp chúng, cácsởlớp
nhất định cócác
hữu cácphương
phươngthức
thứcgiống
được nhau.
liên kết
Vívới
dụ,chúng và nào
một lúc mọiđó
đốibạn
tượng
có thể muốn đưa ra lời mời cho một bữa tiệc. Bạn có thể đặt tên cho phương thức là issueInvitations () , 431
và nó có thể hiển thị một số văn bản cũng như giá trị của các trường ngày và giờ của bên. Của bạn
bữa tiệc tốt nghiệp, sau đó, có thể được đặt tên là myGraduationParty . Là đối tượng của giai cấp Đảng ,
nó có thể có các thành viên dữ liệu cho ngày và giờ, giống như tất cả các bên và nó có thể có một phương thức để
phát hành lời mời. Khi bạn sử dụng phương pháp này, bạn có thể muốn gửi một đối số
to issueInvitations () cho biết cần in bao nhiêu bản. Khi bạn nghĩ về một
đối tượng và các phương thức của nó, giống như thể bạn có thể gửi một thông điệp đến đối tượng để hướng nó đến
hoàn thành một nhiệm vụ cụ thể — bạn có thể yêu cầu đối tượng bên có tên myGraduationParty để in
số lượng lời mời bạn yêu cầu. Mặc dù yourAnniversaryParty cũng là một ví dụ
của lớp Đảng và mặc dù nó cũng có quyền truy cập vào phương thức issueInvitations () ,
bạn sẽ gửi một giá trị đối số khác tới yourAnniversaryParty ’s issueInvitations ()
phương thức mà tôi gửi tới phương thức tương ứng của myGraduationParty . Trong một hướng đối tượng
chương trình, bạn liên tục thực hiện các yêu cầu đối với các phương thức của một đối tượng, thường bao gồm các đối số
như một phần của những yêu cầu đó.

Trong ngữ pháp, một danh từ tương đương với một đối tượng và giá trị của các thuộc tính của một lớp là tính từ — chúng
mô tả đặc điểm của các đối tượng. Một đối tượng cũng có thể có các phương thức, tương đương với động từ.

Khi bạn lập trình bằng ngôn ngữ hướng đối tượng, bạn thường xuyên tạo các lớp từ đó
các đối tượng sẽ được khởi tạo. Bạn cũng viết ứng dụng để sử dụng các đối tượng, cùng với
dữ liệu và phương pháp. Thông thường, bạn sẽ viết các chương trình sử dụng các lớp do người khác tạo ra; lúc khác
lần, bạn có thể tạo một lớp mà các lập trình viên khác sẽ sử dụng để khởi tạo các đối tượng bên trong
các chương trình của riêng họ. Một chương trình hoặc lớp khởi tạo các đối tượng của một lớp viết sẵn khác là
một máy khách lớp hoặc người dùng lớp . Ví dụ: tổ chức của bạn có thể đã có một lớp có tên
Khách hàng cóchứa các thuộc tính như tên , địa chỉ , và PhoneNumber , và bạn có thể
tạo khách hàng bao gồm mảng hàng nghìn Khách hàng . Tương tự, trong hoạt động GUI
môi trường, bạn có thể viết các ứng dụng bao gồm các thành phần viết sẵn từ các lớp
với các tên như Cửa sổ và Nút .

Tính đa hình
Thế giới thực có rất nhiều đối tượng. Hãy xem xét một cánh cửa. Một cánh cửa cần được mở và đóng lại. Bạn
mở một cánh cửa với giao diện dễ sử dụng được gọi là tay nắm cửa. Hướng đối tượng
các lập trình viên sẽ nói rằng bạn đang chuyển một thông điệp tới cánh cửa khi bạn yêu cầu nó mở
xoay núm của nó. Thông báo tương tự (xoay một núm) có kết quả khác khi áp dụng cho
đài của bạn so với khi áp dụng cho một cánh cửa. Như được mô tả trong Hình 10-2, quy trình bạn sử dụng để
mở một cái gì đó — gọi đó là quy trình “mở” — hoạt động trên một cánh cửa khác với trên
ngăn bàn, tài khoản ngân hàng, tập tin máy tính, hoặc đôi mắt của bạn. Tuy nhiên, mặc dù
các thủ tục này hoạt động khác nhau bằng cách sử dụng các đối tượng khác nhau, bạn có thể gọi từng
thủ tục "mở."
Trang 6

Tính đa hình xảy ra khi tên phương thức giống nhau


hoạt động thích hợp cho các loại đối tượng khác nhau.

mở()
432

cửa tài khoản ngân hàng con mắt

Hình 10-2 Các ví dụ về tính đa hình

Trong các lớp trong chương trình hướng đối tượng, bạn có thể tạo nhiều phương thức với cùng một
tên, sẽ hoạt động khác nhau và phù hợp khi được sử dụng với các loại đối tượng khác nhau. Trong
Chương 9, bạn đã học được rằng khái niệm này được gọi là đa hình và bạn đã học cách nạp chồng
các phương pháp. Ví dụ: bạn có thể sử dụng một phương thức có tên print () để in hoá đơn của khách hàng,
đơn xin vay, hoặc phong bì. Bởi vì bạn sử dụng cùng một tên phương pháp để mô tả
các hành động cần thiết để in các đối tượng đa dạng này, bạn có thể viết các câu lệnh theo hướng đối tượng
ngôn ngữ lập trình giống tiếng Anh hơn; bạn có thể sử dụng cùng một tên phương pháp để
mô tả cùng một loại hành động, bất kể loại đối tượng nào đang được tác động. Sử dụng
methodname print () dễ dàng hơn đánh số printInvoice () , printLoanApplication () ,
và như thế. Ngôn ngữ hướng đối tượng hiểu các động từ trong ngữ cảnh, giống như mọi người.
Một ví dụ khác về lợi ích của việc sử dụng một tên cho nhiều đối tượng, hãy xem xét một màn hình
bạn có thể thiết kế để người dùng nhập dữ liệu vào ứng dụng bạn đang viết. Giả sử rằng
màn hình chứa nhiều đối tượng — một số biểu mẫu, nút, thanh cuộn, hộp thoại, v.v.
Cũng giả sử rằng bạn quyết định làm cho tất cả các đối tượng có màu xanh lam. Thay vì phải ghi nhớ
tên phương thức mà các đối tượng này sử dụng để thay đổi màu — có lẽ là changeFormColor () ,
changeButtonColor () ,
và sắp tới — công việc của bạn sẽ dễ dàng hơn nếu bộ tạo của tất cả các đối tượng đó có
đã phát triển một phương thức setColor () hoạt động phù hợp với từng loại đối tượng.
Những người theo chủ nghĩa thuần túy tìm thấy một sự khác biệt tinh tế giữa quá tải và đa hình. Một số bảo lưu thời hạn
đa hình (hoặc đa hình thuần túy ) cho các tình huống trong đó một phần thân phương pháp được sử dụng với nhiều loại
tranh luận. Ví dụ, một phương thức duy nhất có thể được sử dụng với bất kỳ loại đối tượng nào là đa hình. Thời hạn
nạp chồng được áp dụng cho các tình huống trong đó bạn xác định nhiều phương thức với một tên duy nhất — ví dụ:
ba phương thức, tất cả đều có tên là display (), hiển thị một số, một nhân viên và một học sinh, tương ứng.
Chắc chắn, hai thuật ngữ có liên quan với nhau; cả hai đều đề cập đến khả năng sử dụng một tên duy nhất để liên lạc với nhiều
ý nghĩa. Bây giờ, hãy nghĩ về quá tải như một kiểu đa hình nguyên thủy.
Trang 7

Nguyên tắc lập trình hướng đối tượng

Di sản
Một khái niệm quan trọng khác trong lập trình hướng đối tượng là kế thừa , là
quá trình tiếp thu những nét của người đi trước. Trong thế giới thực, một cánh cửa mới với
cửa sổ kính màu thừa hưởng hầu hết các đặc điểm của nó từ một cửa tiêu chuẩn. Nó có cùng mục đích,
nó mở và đóng theo cùng một cách, và nó có cùng một núm và bản lề. Như hình 10-3 433
cho thấy, cánh cửa với cửa sổ kính màu chỉ đơn giản có một đặc điểm bổ sung — cửa sổ của nó.
Ngay cả khi bạn chưa bao giờ nhìn thấy một cánh cửa có cửa sổ kính màu, bạn cũng biết nó là gì và như thế nào
để sử dụng nó vì bạn hiểu các đặc điểm của tất cả các cửa. Với hướng đối tượng
lập trình, khi bạn tạo một đối tượng, bạn có thể phát triển các đối tượng mới có tất cả
đặc điểm của đối tượng ban đầu cộng với bất kỳ đặc điểm mới nào mà bạn mong muốn. Nếu bạn phát triển lớp CustomerBill
của các đối tượng, không cần phải phát triển lớp OverdueCustomerBill từ đầu. Bạn có thể
tạo lớp mới để chứa tất cả các đặc điểm của lớp đã được phát triển và đơn giản là
bổ sung các đặc điểm mới cần thiết. Điều này không chỉ làm giảm công việc liên quan đến việc tạo mới

đối tượng, điều này làm cho chúng dễ hiểu hơn vì chúng sở hữu hầu hết các đặc điểm
của các đối tượng đã được phát triển.

Một ví dụ về sự kế thừa: Một cánh cửa với một cửa sổ kính màu
kế thừa tất cả các thuộc tính và phương thức của một cửa.

Hình 10-3 Một ví dụ về kế thừa


© 2015 Cengage Learning

Xem video Giới thiệu về Lập trình Hướng Đối tượng.

Đóng gói
Các đối tượng trong thế giới thực thường sử dụng tính năng đóng gói và ẩn thông tin. Đóng gói là
quá trình kết hợp tất cả các thuộc tính và phương thức của một đối tượng thành một gói duy nhất; các
gói bao gồm dữ liệu thường bị ẩn khỏi các lớp bên ngoài cũng như các phương thức
có sẵn cho các lớp bên ngoài để truy cập và thay đổi dữ liệu. Ẩn thông tin là khái niệm
rằng các lớp khác không được thay đổi thuộc tính của đối tượng — chỉ các phương thức của riêng đối tượng
lớp nên có đặc quyền đó. (Khái niệm này còn được gọi là ẩn dữ liệu .) Bên ngoài các lớp
chỉ nên được phép đưa ra yêu cầu thay đổi một thuộc tính; sau đó nó là vào
các phương thức của lớp để xác định xem yêu cầu có phù hợp hay không. Khi sử dụng cửa, bạn
thường không quan tâm đến kết cấu chốt hoặc bản lề và bạn không có quyền truy cập vào
Trang 8

CHƯƠNG 1 0 Lập trình hướng đối tượng

hoạt động bên trong của núm. Bạn chỉ quan tâm đến chức năng và giao diện,
ranh giới thân thiện giữa người dùng và các cơ chế bên trong của thiết bị. Khi bạn
xoay núm cửa, bạn đang tương tác một cách thích hợp với giao diện. Đập vào núm
sẽ là một tương tác không phù hợp, vì vậy cửa sẽ không phản hồi. Tương tự, chi tiết
hoạt động của các đối tượng bạn tạo trong các chương trình hướng đối tượng có thể bị ẩn khỏi bên ngoài
434 các chương trình và mô-đun nếu cần thiết và các phương thức bạn viết có thể kiểm soát cách các đối tượng
vận hành. Khi các chi tiết được ẩn, các lập trình viên có thể tập trung vào chức năng và
giao diện, như mọi người làm với các đối tượng trong cuộc sống thực.

Tóm lại, hiểu được lập trình hướng đối tượng có nghĩa là bạn phải xem xét năm
các thành phần tích hợp của nó: lớp, đối tượng, đa hình, kế thừa và đóng gói.
Tham khảo nhanh 10-1 minh họa các thành phần này.

THAM KHẢO NHANH 10-1 Các thành phần của lập trình hướng đối tượng

Các lớp học Thú vật Di sản


Thể loại các lớp học mới có được các đặc điểm
Chó Chim
của các đối tượng trong số các lớp hiện có nhưng đang
cụ thể hơn
Các đối tượng
các trường hợp con chó của tôi con chó của bạn theHummingbirdAtMyFeeder
trong số các lớp học

tên Molly tên Scruffy tuổi tác 1


Đóng gói giới tính F giới tính M giới tính F
tuổi tác 5 tuổi tác 1
các thuộc tính và hasShots Y hasShots N
phương pháp của một độ tuổi()
đối tượng được xác định đặt tên() đặt tên() setGender ()
độ tuổi() độ tuổi() giveBirth ()
theo lớp của nó và
setHasShots () setHasShots ()
kết hợp như một giveBirth () giveBirth ()
đơn vị

Tính đa hình
các phương pháp có cùng tên hoạt động
thích hợp cho loại đối tượng
Trang 9

Xác định lớp và tạo sơ đồ lớp

HAI SỰ THẬT & MỘT LỜI NÓI DỐI


Nguyên tắc lập trình hướng đối tượng

1. Học về lập trình hướng đối tượng rất khó vì nó không sử dụng 435
các khái niệm bạn đã biết, chẳng hạn như khai báo biến và sử dụng mô-đun.

2. Trong thuật ngữ hướng đối tượng, một lớp mô tả một nhóm hoặc tập hợp các đối tượng
với các thuộc tính chung; một thể hiện của một lớp là một đối tượng hiện có của một lớp.

3. Một chương trình hoặc lớp khởi tạo các đối tượng của một lớp được viết trước khác là một lớp
khách hàng hoặc người dùng lớp.

Xác định lớp và tạo sơ đồ lớp


Lớp là một phạm trù của sự vật; một đối tượng là một thể hiện cụ thể của một lớp. Một định nghĩa lớp là một tập hợp
programstatementsthat liệt kê đối tượng đặc tính và các phương thức mà mỗi đối tượng có thể sử dụng.

Một định nghĩa lớp có thể chứa ba phần:

Mỗi lớp đều có một cái tên.


Hầu hết các lớp đều chứa dữ liệu, mặc dù điều này là không bắt buộc.
Hầu hết các lớp đều chứa các phương thức, mặc dù điều này là không bắt buộc.
Ví dụ, bạn có thể tạo một lớp có tên Nhân viên . Mỗi đối tượng Nhân viên sẽ đại diện cho một
nhân viên làm việc cho một tổ chức. Các trường dữ liệu hoặc thuộc tính của lớp Nhân viên ,
bao gồm các lĩnh vực như lastName , hourlyWage , và weeklyPay .
Các phương thức của một lớp bao gồm tất cả các hành động bạn muốn thực hiện với lớp. Thích hợp
các phương thức cho một lớp Employee có thể bao gồm setHourlyWage () , getHourlyWage () và
tính toánWeeklyPay () .
Công việc của setHourlyWage () là để cung cấp giá trị cho một nhân viên ‘s
trường dữ liệu tiền lương, mục đích của getHourlyWage () là truy xuất giá trị tiền lương và
Mục đích của calculateWeeklyPay () là để nhân nhân viên s’ hourlyWage bằng của số
số giờ trong một tuần làm việc để tính lương hàng tuần. Với ngôn ngữ hướng đối tượng, bạn
hãy nghĩ về tên lớp, dữ liệu và các phương thức như một đơn vị được đóng gói duy nhất.
Khai báo một lớp không tạo ra các đối tượng thực tế. Một lớp chỉ là một mô tả trừu tượng về những gì
một đối tượng sẽ là nếu bất kỳ đối tượng nào thực sự được khởi tạo. Cũng như bạn có thể hiểu tất cả
đặc điểm của một mặt hàng bạn định sản xuất trước khi mặt hàng đầu tiên ra mắt
dây chuyền lắp ráp, bạn có thể tạo một lớp với các trường và phương thức trước khi bạn khởi tạo
các đối tượng từ nó.
Trang 10

CHƯƠNG 1 0 Lập trình hướng đối tượng

Khi bạn khai báo một biến đơn giản là kiểu dữ liệu dựng sẵn, bạn viết một câu lệnh chẳng hạn như
một trong những điều sau đây:
số tiền
tên chuỗi

436 Khi bạn viết một chương trình khai báo một đối tượng là kiểu dữ liệu lớp, bạn viết
như sau:
Nhân viên myAssistant

Trong một số ngôn ngữ lập trình hướng đối tượng, bạn cần thêm nhiều hơn vào câu lệnh khai báo để
thực sự tạo một đối tượng Nhân viên. Ví dụ, trong Java, bạn sẽ viết:

Employee myAssistant = new Employee ();

Bạn sẽ hiểu thêm về định dạng của câu lệnh này khi bạn tìm hiểu về các hàm tạo trong Chương 11.

Khi bạn khai báo đối tượng myAssistant , nó chứa tất cả các trường dữ liệu và có quyền truy cập vào tất cả
các phương thức chứa trong lớp của nó. Nói cách khác, một phần bộ nhớ lớn hơn được dành riêng
so với khi bạn khai báo một biến đơn giản, vì một Nhân viên chứa nhiều trường. Bạn
có thể sử dụng bất kỳ phương thức nào của Nhân viên với đối tượng myAssistant . Cú pháp thông thường là
cung cấp tên đối tượng, dấu chấm (dấu chấm) và tên phương thức có dấu ngoặc đơn và có thể
danh sách đối số. Ví dụ: bạn có thể viết một chương trình có chứa các câu lệnh như
được hiển thị trong Hình 10-4.

khởi đầu
Tuyên bố
Nhân viên myAssistant
myAssistant.setLastName ("Reynolds")
myAssistant.setHourlyWage (16,75)

đầu ra "Trợ lý của tôi làm",


myAssistant.getHourlyWage (), "mỗi giờ"
dừng lại

Hình 10-4 Ứng dụng khai báo và sử dụng đối tượng Employee
© 2015 Cengage Learning

Đoạn chương trình trong Hình 10-4 rất ngắn. Trong một chương trình thực tế hữu ích hơn, bạn có thể đọc
dữ liệu nhân viên từ tệp dữ liệu trước khi gán nó vào các trường của đối tượng, mỗi Nhân viên có thể chứa
hàng chục trường và ứng dụng của bạn có thể tạo ra hàng trăm hoặc hàng nghìn đối tượng.

Bên cạnh việc đề cập đến Employee như một lớp, nhiều lập trình viên sẽ đề cập đến nó như một loại do người dùng xác định ,
nhưng một thuật ngữ chính xác hơn là kiểu do lập trình viên xác định. Một lớp mà từ đó các đối tượng được khởi tạo là
kiểu dữ liệu của các đối tượng của nó. Các lập trình viên hướng đối tượng thường đề cập đến một lớp như Employee như một lớp trừu tượng
kiểu dữ liệu (ADT); thuật ngữ này ngụ ý rằng dữ liệu của kiểu là riêng tư và chỉ có thể được truy cập thông qua các phương thức. Bạn
tìm hiểu về dữ liệu cá nhân ở phần sau của chương này.
Trang 11

Xác định lớp và tạo sơ đồ lớp

Khi bạn viết một câu lệnh chẳng hạn như myAssistant.setHourlyWage (16.75) , bạn đang thực hiện một
gọi đến một phương thức được chứa trong lớp Employee . Bởi vì myAssistant là một
Đối tượng Employee , nó được phép sử dụng phương thức setHourlyWage () là một phần của lớp nó. Bạn
có thể cho biết từ cuộc gọi phương thức rằng setHourlyWage () phải chấp nhận một tham số số.
Khi bạn viết ứng dụng trong Hình 10-4, bạn không cần biết các câu lệnh là gì
437
được viết trong các phương thức của lớp Nhân viên , mặc dù bạn có thể đưa ra một phỏng đoán có học thức
dựa trên tên phương thức. Trước khi bạn có thể thực thi ứng dụng trong Hình 10-4,
ai đó sẽ phải viết các câu lệnh thích hợp trong các phương thức của lớp Employee . Nếu
bạn đã viết các phương thức, tất nhiên bạn sẽ biết nội dung của chúng, nhưng nếu một lập trình viên khác
đã viết sẵn các phương thức, bạn có thể sử dụng ứng dụng mà không cần biết chi tiết
chứa trong các phương thức. Để sử dụng các phương pháp, bạn chỉ cần biết tên của chúng,
danh sách tham số và kiểu trả về.
Trong Chương 9, bạn đã học được rằng khả năng sử dụng các phương thức như một hộp đen mà không biết
nội dung là một tính năng của đóng gói. Thế giới thực có rất nhiều thiết bị hộp đen. Đối với
ví dụ, bạn có thể sử dụng tivi và lò vi sóng mà không biết chúng hoạt động như thế nào
nội bộ — tất cả những gì bạn cần hiểu là giao diện. Tương tự, với các phương pháp được viết tốt
thuộc về các lớp bạn sử dụng, bạn không cần hiểu cách chúng hoạt động nội bộ để có thể
sử dụng chúng; bạn chỉ cần hiểu kết quả cuối cùng khi bạn sử dụng chúng.
Trong phân đoạn chương trình khách hàng trong Hình 10-4, trọng tâm là đối tượng — Nhân viên
được đặt tên là myAssistant —và các phương thức bạn có thể sử dụng với đối tượng đó. Đây là bản chất của
lập trình hướng đối tượng.

Trong các ngôn ngữ lập trình hướng đối tượng cũ hơn, các số và ký tự đơn giản được cho là nguyên thủy
Loại dữ liệu; điều này phân biệt chúng với các đối tượng là các loại lớp. Trong chương trình mới nhất
ngôn ngữ, mọi mục bạn đặt tên, ngay cả mục là kiểu số hoặc chuỗi, đều là đối tượng được tạo từ một lớp
xác định cả dữ liệu và phương thức.

Khi bạn khởi tạo các đối tượng, các trường dữ liệu của chúng được lưu trữ tại các vị trí bộ nhớ riêng biệt. Tuy nhiên, tất cả các đối tượng
của cùng một lớp chia sẻ một bản sao các phương thức của lớp. Bạn sẽ tìm hiểu thêm về khái niệm này ở phần sau
chương.

Tạo sơ đồ lớp
Một sơ đồ lớp bao gồm một hình chữ nhật được chia thành ba phần, như thể hiện trong hình 10-5.
Phần trên cùng chứa tên của lớp, phần giữa chứa tên và dữ liệu
các loại thuộc tính và phần dưới cùng bao gồm các phương thức. Sơ đồ lớp chung này
hiển thị hai thuộc tính và ba phương thức, nhưng một lớp nhất định có thể có bất kỳ số lượng thuộc tính nào
hoặc các phương pháp, bao gồm không có. Các lập trình viên thường sử dụng một biểu đồ lớp để lập kế hoạch hoặc minh họa lớp
đặc trưng. Biểu đồ lớp cũng hữu ích để mô tả một lớp cho những người không lập trình.

Hình 10-6 cho thấy sơ đồ lớp cho lớp Nhân viên . Theo quy ước, một sơ đồ lớp
liệt kê tên của các mục dữ liệu trước tiên; mỗi tên được theo sau bởi dấu hai chấm và kiểu dữ liệu.
Tên phương thức được liệt kê tiếp theo và mỗi tên được theo sau bởi kiểu dữ liệu của nó (kiểu trả về). Liệt kê
tên đầu tiên và kiểu dữ liệu cuối cùng nhấn mạnh mục đích của các trường và phương thức.
Trang 12

Nhân viên

lastName: string
hàng giờ
WeekPay: num
Tên lớp
438
setLastName (name: string): void
Thuộc tính1: dataType
setHourlyWage (lương: num): void
Thuộc tính2: dataType
getLastName (): chuỗi
Method1 (): dataType getHourlyWage (): num
Method2 (): dataType getWeeklyPay (): num
Method3 (): dataType tính toánWeeklyPay (): void

Hình 10-5 Biểu đồ lớp chung Hình 10-6 Biểu đồ lớp nhân viên
© 2015 Cengage Learning © 2015 Cengage Learning

Biểu đồ lớp là một loại biểu đồ Ngôn ngữ Mô hình Hợp nhất (UML). Chương 13 trình bày về UML.

Một số nhà phát triển thích chèn từ void vào trong dấu ngoặc đơn của các phương thức được liệt kê trong sơ đồ lớp
khi các phương thức không có danh sách tham số. Ví dụ: khoảng trống có thể được chèn vào giữa
dấu ngoặc đơn trong getLastName () trong sơ đồ lớp trong Hình 10-6. Chèn khoảng trống cho thấy rằng một
danh sách tham số không vô tình bị bỏ qua. Bạn nên tuân theo các quy ước của tổ chức của bạn.

Hình 10-5 và 10-6 đều cho thấy rằng một sơ đồ lớp chỉ nhằm mục đích tổng quan về
các thuộc tính và phương thức của lớp. Biểu đồ lớp hiển thị các mục dữ liệu và phương thức của lớp
sẽ sử dụng, không phải chi tiết của các phương pháp cũng như khi nào chúng sẽ được sử dụng. Nó là một công cụ thiết kế giúp
bạn nhìn thấy bức tranh lớn về các yêu cầu của lớp học. Hình 10-6 cho thấy lớp Nhân viên
chứa ba trường dữ liệu đại diện cho tên của nhân viên, mức lương hàng giờ và hàng tuần
Số tiền trả. Mọi đối tượng Employee được tạo trong một chương trình sử dụng lớp này sẽ chứa các
ba trường dữ liệu. Nói cách khác, khi bạn khai báo một đối tượng Employee , khai báo đơn
câu lệnh phân bổ đủ bộ nhớ để chứa cả ba trường.
Hình 10-6 cũng cho thấy rằng lớp Employee chứa sáu phương thức. Ví dụ, đầu tiên
phương pháp được định nghĩa như sau:
setLastName (name: string): void

Ký hiệu này có nghĩa là tên phương thức là setLastName () , nó nhận một chuỗi đơn

tham số có tên tên , và nó không trả về gì.

Nhiều sách, trang web và tổ chức khác nhau sử dụng sơ đồ lớp mô tả các phương pháp theo những cách khác nhau.
Ví dụ: một số nhà phát triển chỉ sử dụng tên phương thức và những người khác bỏ qua danh sách tham số. Cuốn sách này sẽ
thực hiện phương pháp tiếp cận đầy đủ nhất có thể, vì vậy các sơ đồ lớp bạn thấy ở đây sẽ chứa từng
định danh của phương thức, danh sách tham số với các kiểu và kiểu trả về.
Trang 13

Xác định lớp và tạo sơ đồ lớp

Các nhân viên chương trình sơ đồ lớp rằng hai trong số sáu phương pháp lấy thông số
( setLastName () và setHourlyWage () ). Biểu đồ cũng hiển thị kiểu trả về cho mỗi
phương thức — ba phương thức void, hai phương thức số và một phương thức chuỗi. Lớp
sơ đồ không chỉ ra những gì diễn ra bên trong phương thức, mặc dù bạn có thể
thực hiện một phỏng đoán có học. Sau đó, khi bạn viết mã thực sự tạo ra Nhân viên
lớp, bạn bao gồm các chi tiết triển khai phương thức. Ví dụ, Hình 10-7 cho thấy một số 439
mã giả mà bạn có thể sử dụng để liệt kê các chi tiết cho các phương thức trong lớp Nhân viên .

nhân viên lớp


Tuyên bố
string lastName
num hàng giờ
num hàng tuần

void setLastName (tên chuỗi)


lastName = tên
trở về

void setHourlyWage (số lương)


giờ lương = tiền lương
tính toánWeeklyPay ()
trở về

string getLastName ()
trả lại lastName

num getHourlyWage ()
trả lại hàng giờ

num getWeeklyPay ()
trả lại hàng tuần

void tínhWeeklyPay ()
Tuyên bố
num WORK_WEEK_HOURS = 40
weekPay = hourlyWage * WORK_WEEK_HOURS
trở về
endClass

Hình 10-7 Mã giả cho lớp Nhân viên được mô tả trong biểu đồ lớp ở Hình 10-6
© 2015 Cengage Learning

Trong Hình 10-7, các thuộc tính lớp Nhân viên được xác định với một kiểu dữ liệu và một tên trường.
Ngoài việc liệt kê các trường dữ liệu bắt buộc, hình này cho thấy các phương pháp hoàn chỉnh cho
Tầng lớp công nhân viên . Mục đích của các phương pháp có thể được chia thành ba loại:

Hai trong số các phương pháp chấp nhận các giá trị từ thế giới bên ngoài; những phương pháp này, theo quy ước,
đặt tiền tố. Các phương thức này được sử dụng để thiết lập các trường dữ liệu trong lớp.
Trang 14

Ba trong số các phương pháp gửi dữ liệu ra thế giới bên ngoài; những phương pháp này, theo quy ước, có
tiền tố get. Các phương thức này trả về giá trị trường cho một chương trình khách.
Một phương thức thực hiện công việc trong lớp; phương thức này được đặt tên là CalculWeeklyPay () .
Phương pháp này không giao tiếp với bên ngoài; mục đích của nó là nhân lên hàng giờ
440
theo số giờ trong một tuần.

Các phương pháp thiết lập


Trong Hình 10-7, hai phương thức bắt đầu bằng tập hợp từ; chúng là setLastName () và
setHourlyWage () .
Mục đích của phương thức tập hợp hoặc phương thức trình đột biến là thiết lập hoặc thay đổi
giá trị của các trường dữ liệu được xác định trong lớp. Không có yêu cầu rằng các phương pháp đó bắt đầu
với bộ; tiền tố chỉ là quy ước và làm rõ ý định của các phương pháp. Các
phương thức setLastName () được thực hiện như sau:
void setLastName (tên chuỗi)
lastName = tên
trở về

Trong phương thức này, một tên chuỗi được chuyển vào dưới dạng tham số và được gán cho trường lastName .
Bởi vì lastName được chứa trong cùng một lớp với phương thức này, phương thức có quyền truy cập vào
trường và có thể thay đổi nó.
Tương tự, phương thức setHourlyWage () chấp nhận một tham số số và gán nó cho
trường lớp hourlyWage . Phương thức này cũng gọi phương thức CalculWeeklyPay () , phương thức này thiết lập
Thanh toán hàng tuần dựa
trên Mức lương theo giờ . Bằng cách viết phương thức setHourlyWage () để gọi
tự động tính toán phương thức allowWeeklyPay () , bạn đảm bảo rằng trường weekPay là
cập nhật bất cứ lúc nào hourlyWage thay đổi.
Khi bạn tạo một đối tượng Employee với một tuyên bố, chẳng hạn như Employee mySecretary , bạn
có thể sử dụng các câu lệnh như sau:
mySecretary.setLastName ("Johnson")
mySecretary.setHourlyWage (15.00)

Thay vì các hằng số theo nghĩa đen, bạn có thể truyền các biến hoặc các hằng được đặt tên cho các phương thức như
miễn là chúng là kiểu dữ liệu chính xác. Ví dụ: nếu bạn viết một chương trình mà bạn
thực hiện khai báo sau, khi đó phép gán trong câu lệnh tiếp theo là hợp lệ.
Tuyên bố
num PAY_RATE_TO_START = 8,00
mySecretary.setHourlyWage (PAY_RATE_TO_START)

Trong một số ngôn ngữ — ví dụ: Visual Basic và C # —bạn có thể tạo thuộc tính thay vì tạo
phương pháp thiết lập. Sử dụng thuộc tính cung cấp một cách để đặt giá trị trường bằng cú pháp đơn giản hơn. Theo quy ước, nếu a
trường lớp là Giờ theo giờ, thuộc tính của nó sẽ là Giờ theo giờ và trong một chương trình, bạn có thể tạo
tuyên bố tương tự như mySecretary.HourlyWage = PAY_RATE_TO_START. Việc thực hiện
của thuộc tính HourlyWage (với chữ cái đầu viết hoa) sẽ được viết ở định dạng rất giống với
của phương thức setHourlyWage ().
Trang 15

Xác định lớp và tạo sơ đồ lớp

Giống như các phương thức khác, các phương thức thao tác với các trường trong một lớp có thể chứa bất kỳ
tuyên bố bạn cần. Ví dụ: một phương thức setHourlyWage () phức tạp hơn
đầu vào xác nhận có thể được viết, như trong Hình 10-8. Trong phiên bản này, tiền lương được chuyển cho
phương thức được kiểm tra dựa trên các giá trị tối thiểu và tối đa, và được gán cho trường lớp
hourlyWage chỉkhi nó nằm trong giới hạn quy định. Nếu mức lương quá thấp, MINWAGE
giá trị được thay thế và nếu mức lương quá cao, giá trị MAXWAGE sẽ được thay thế. 441

void setHourlyWage (số lương)


Tuyên bố
num MINWAGE = 6,00
num MAXWAGE = 70,00
nếu lương <MINWAGE thì
hourlyWage = MINWAGE
khác
nếu mức lương> MAXWAGE thì
giờ hàng giờ = MAXWAGE
khác
giờ lương = tiền lương
endif
endif
tính toánWeeklyPay ()
trở về

Hình 10-8 phương thức setHourlyWage () bao gồm xác nhận


© 2015 Cengage Learning

Tương tự, nếu các phương thức được thiết lập trong một lớp yêu cầu chúng, các phương thức có thể chứa đầu ra
câu lệnh, vòng lặp, khai báo mảng hoặc bất kỳ câu lệnh lập trình hợp pháp nào khác. Tuy nhiên, nếu
mục đích chính của một phương thức không phải là đặt giá trị trường, vì vậy để rõ ràng phương thức phải
không được đặt tên với tiền tố đã đặt.

Các phương pháp Get


Mục đích của phương thức get hoặc phương thức trình truy cập là trả về một giá trị cho thế giới bên ngoài
lớp học. Trong lớp Employee trong Hình 10-7, ba phương thức get có tiền tố get:
getLastName () , getHourlyWage () và getWeeklyPay () . Các phương pháp được thực hiện như
sau:
string getLastName ()
trả lại lastName

num getHourlyWage ()
trả lại hàng giờ

num getWeeklyPay ()
trả lại hàng tuần
9/7/2021 Lập trình hướng đối tượng
Trang 16

Mỗi phương thức này chỉ trả về giá trị trong trường được liên kết với tên phương thức.
Giống như các phương thức set, bất kỳ phương thức get nào trong số này cũng có thể chứa các câu lệnh phức tạp hơn như
cần thiết. Ví dụ: trong một lớp phức tạp hơn, bạn có thể trả lại mức lương theo giờ của một
chỉ nhân viên nếu người dùng cũng đã chuyển một mã truy cập thích hợp cho phương thức, hoặc bạn
có thể trả lại giá trị trả hàng tuần dưới dạng một chuỗi có đính kèm ký hiệu đô la thay vì dưới dạng
442 giá trị số. Khi bạn khai báo một đối tượng Employee chẳng hạn như Employee mySecretary , bạn
sau đó có thể thực hiện các câu lệnh trong một chương trình tương tự như sau:
Tuyên bố
string staffName
workerName = mySecretary.getLastName ()
đầu ra "Wage is", mySecretary.getHourlyWage ()
đầu ra "Thanh toán cho nửa tuần là", mySecretary.getWeeklyPay () * 0,5

Nói cách khác, giá trị được trả về từ một phương thức get có thể được sử dụng như bất kỳ biến nào khác của nó
loại sẽ được sử dụng. Bạn có thể gán giá trị cho một biến khác, hiển thị nó, thực hiện
số học với nó hoặc thực hiện bất kỳ câu lệnh nào khác hoạt động chính xác với
loại dữ liệu.

Trong một số ngôn ngữ — ví dụ: Visual Basic và C # —trước khi tạo phương thức get, bạn có thể thêm
các câu lệnh cho thuộc tính để trả về một giá trị bằng cách sử dụng cú pháp đơn giản hơn. Ví dụ: nếu bạn đã tạo
Thuộc tính HourlyWage, bạn có thể viết một chương trình có chứa đầu ra câu lệnh mySecretary.
Lương theo giờ.

Phương pháp làm việc


Lớp Employee trong Hình 10-7 chứa một phương thức không phải là phương thức get hay set.
Phương thức này, CalculatedWeeklyPay () , là một phương thức làm việc trong lớp. Một phương pháp làm việc là
còn được gọi là phương pháp trợ giúp hoặc người hỗ trợ . Nó chứa một hằng số được đặt tên cục bộ
đại diện cho số giờ trong một tuần làm việc tiêu chuẩn và nó tính toán giá trị trường weekPay bằng
nhân hàng giờ Mức lương với hằng số được đặt tên. Phương thức được viết như sau:
void tínhWeeklyPay ()
Tuyên bố
num WORK_WEEK_HOURS = 40
weekPay = hourlyWage * WORK_WEEK_HOURS
trở về

Không có giá trị nào cần được chuyển vào phương thức này và không có giá trị nào được trả về từ nó vì
phương pháp không giao tiếp với thế giới bên ngoài. Thay vào đó, phương thức này chỉ được gọi là
từ một phương thức khác trong cùng một lớp ( phương thức setHourlyWage () ) và phương thức đó là
được gọi từ thế giới bên ngoài. Mỗi khi một chương trình sử dụng phương thức setHourlyWage () để
thay đổi trường Mức lương theo giờ của Nhân viên , CalculatedWeeklyPay () được gọi để tính toán lại
trường WeekPay . Không có phương thức setWeeklyPay () nào được bao gồm trong lớp Nhân viên này vì
ý định là weekPay chỉ được đặt bên trong phương thức CalculWeeklyPay () mỗi lần
các setHourlyWage () phương pháp gọi nó. Nếu bạn muốn các chương trình để có thể thiết lập các weeklyPay
trực tiếp, bạn sẽ phải viết một phương thức để cho phép nó.
Trang 17

Các lập trình viên chưa quen với việc tạo lớp thường muốn chuyển giá trị hàng giờ vào

Phương thức mathWeeklyPay () để nó có thể sử dụng giá trị trong phép tính của nó. Mặc dù kỹ thuật này
sẽ hoạt động, nó không bắt buộc. Phương thức CalculWeeklyPay () có quyền truy cập trực tiếp vào
lĩnh vực tiền lương theo giờ do là thành viên của cùng một lớp.

Ví dụ, Hình 10-9 cho thấy một chương trình khai báo một đối tượng Nhân viên và thiết lập 443
giá trị tiền lương. Theprogramdisplaysthe weeklyPay value.Then anewvalueis assignedto hourlyWage ,
và weekPay được hiển thị lại. Như bạn có thể thấy từ kết quả trong Hình 10-10, WeekPay
giá trị đã được tính toán lại mặc dù nó chưa bao giờ được đặt trực tiếp bởi chương trình khách hàng.

khởi đầu
Tuyên bố
num LOW = 9,00
num CAO = 14,65
Nhân viên myGardener
myGardener.setLastName ("Greene")
myGardener.setHourlyWage (THẤP)
đầu ra "Người làm vườn của tôi làm",
myGardener.getWeeklyPay (), "mỗi tuần"
myGardener.setHourlyWage (CAO)
đầu ra "Người làm vườn của tôi làm",
myGardener.getWeeklyPay (), "mỗi tuần"
dừng lại

Hình 10-9 Chương trình thiết lập và hiển thị dữ liệu Nhân viên hai lần
© 2015 Cengage Learning

Hình 10-10 Thực thi chương trình trong Hình 10-9


© 2015 Cengage Learning
Trang 18
Xác định lớp và tạo sơ đồ lớp
444 1. Mỗi lớp đều có tên, dữ liệu và phương thức.

2. Sau khi một đối tượng đã được khởi tạo, các phương thức của nó có thể được truy cập bằng cách sử dụng
mã định danh của đối tượng, một dấu chấm và một lệnh gọi phương thức.

3. Sơ đồ lớp bao gồm một hình chữ nhật được chia thành ba phần; đỉnh
phần chứa tên của lớp, phần giữa chứa tên
và kiểu dữ liệu của các thuộc tính và phần dưới cùng chứa các phương thức.

. I màu
yêu
đỏcầu
Làcô ấy
neit ough alth ods, meth và dữ liệuaintiếp sses mệnh
Phần
đề lớn
# 1. Làent vật tổest giả dối
Các

Hiểu quyền truy cập công khai và riêng tư


Khi bạn mua một sản phẩm mới, một trong những điều kiện thông thường của chế độ bảo hành là
nhà sản xuất phải thực hiện tất cả các công việc sửa chữa. Ví dụ: nếu máy tính của bạn có bảo hành
và xảy ra sự cố với hoạt động của nó, bạn không thể tự mở đơn vị hệ thống,
loại bỏ và thay thế các bộ phận, sau đó mong đợi nhận lại tiền của bạn cho một thiết bị không
hoạt động bình thường. Thay vào đó, khi có sự cố, bạn phải đưa máy tính đến
kỹ thuật viên đã được phê duyệt. Nhà sản xuất đảm bảo rằng máy của bạn sẽ hoạt động bình thường
chỉ khi nhà sản xuất có thể kiểm soát cách sửa đổi các cơ chế bên trong của máy tính.
Tương tự, trong thiết kế hướng đối tượng, bạn không muốn các chương trình hoặc phương pháp bên ngoài thay đổi
các trường dữ liệu của lớp mà bạn không có quyền kiểm soát quá trình. Ví dụ: bạn có thể chỉ định lớp
thực hiện phân tích thống kê phức tạp trên somedata, và bạn sẽ không muốn
có thể thay đổi kết quả được xây dựng cẩn thận của bạn. Hoặc, bạn có thể thiết kế một lớp mà từ đó những người khác có thể
tạo một đối tượng màn hình GUI sáng tạo và hữu ích. Trong trường hợp này, bạn sẽ không muốn bất cứ ai
thay đổi kích thước của thiết kế nghệ thuật của bạn. Để ngăn người ngoài thay đổi dữ liệu của bạn
các trường theo cách bạn làm ghi chú, bạn buộc các chương trình khác và phương phápmethodstousea đó là
một phần của lớp học của bạn để thay đổi dữ liệu. (Trước đó trong chương này, bạn đã học được rằng nguyên tắc giữ
dữ liệu riêng tư và không thể truy cập được đối với các lớp bên ngoài được gọi là ẩn thông tin hoặc ẩn dữ liệu.)
Để ngăn chặn các sửa đổi trường trái phép, các lập trình viên hướng đối tượng thường chỉ định
rằng các trường dữ liệu của họ sẽ có quyền truy cập riêng tư — không thể truy cập dữ liệu bằng bất kỳ phương pháp nào
đó không phải là một phần của lớp học. Bản thân các phương thức, như setHourlyWage () trong Employee
lớp, hỗ trợ truy cập công cộng. Khi các phương thức có quyền truy cập công khai , các chương trình khác và
các phương thức có thể sử dụng các phương pháp này để truy cập vào dữ liệu cá nhân.

Hình 10-11 cho thấy một lớp Nhân viên hoàn chỉnh mà các chỉ định truy cập đã được thêm vào
mô tả từng thuộc tính và phương thức. Công cụ xác định quyền truy cập là tính từ xác định loại
truy cập ( công khai hoặc riêng tư) các lớp bên ngoài sẽ phải thuộc tính hoặc phương thức. bên trong
hình, mỗi thông số truy cập được tô bóng.
Trang 19

Hiểu quyền truy cập công khai và riêng tư

nhân viên lớp


Tuyên bố
chuỗi riêng lastName
số riêng tư hàng giờ
số riêng tư hàng tuần 445

public void setLastName (string name)


lastName = tên

trở về
public void setHourlyWage (số lương)
giờ lương = tiền lương
tính toánWeeklyPay ()
trở về

chuỗi công khai getLastName ()


trả lại lastName

public num getHourlyWage ()


trả lại hàng giờ

public num getWeeklyPay ()


trả lại hàng tuần

private void tínhWeeklyPay ()


Tuyên bố
num WORK_WEEK_HOURS = 40
weekPay = hourlyWage * WORK_WEEK_HOURS
trở về
endClass

Hình 10-11 Lớp nhân viên bao gồm các chỉ định truy cập công cộng và riêng tư
© 2015 Cengage Learning

Trong nhiều ngôn ngữ lập trình hướng đối tượng, nếu bạn không khai báo mã định danh truy cập cho trường dữ liệu hoặc
, thì nó là riêng tư theo mặc định. Cuốn sách này sẽ tuân theo quy ước chỉ định rõ ràng quyền truy cập cho
mọi thành viên trong lớp.

Trong Hình 10-11, mỗi trường dữ liệu là riêng tư, có nghĩa là mỗi trường không thể truy cập được đối với
đối tượng được khai báo trong một chương trình. Nói cách khác, nếu một chương trình khai báo một đối tượng Employee ,
với tư cách là Employee myAssistant , sau đó là
tuyên bố là bất hợp pháp: Đừng làm điều đó
Bạn không thể chỉ định trực tiếp
myAssistant.hourlyWage = 15,00
một giá trị cho một dữ liệu riêng tư
trường từ bên ngoài lớp của nó.
Thay vào đó, chỉ có thể chỉ định Mức lương theo giờ
thông qua một phương thức công khai như sau:
myAssistant.setHourlyWage (15.00)
Trang 20

Nếu bạn đặt giờ công khai thay vì riêng tư, thì một câu lệnh chuyển nhượng trực tiếp sẽ
hoạt động, nhưng bạn sẽ vi phạm nguyên tắc OOP quan trọng về việc ẩn dữ liệu bằng cách sử dụng tính năng đóng gói.
Các trường dữ liệu thường phải ở chế độ riêng tư và ứng dụng khách phải có thể truy cập chúng
chỉ thông qua các giao diện công khai — nói cách khác, thông qua các phương thức công khai của lớp. Cái đó
bằng cách này, nếu bạn có các hạn chế về giá trị của hourlyWage , những hạn chế đó sẽ được thực thi bởi
446 phương thức công cộng hoạt động như một giao diện cho trường dữ liệu riêng tư. Tương tự, công chúng nhận được
phương thức có thể kiểm soát cách một giá trị riêng tư được truy xuất. Có lẽ bạn không muốn khách hàng
được tiếp cận với một nhân viên của hourlyWage nếu nó là nhiều hơn một giá trị cụ thể, hoặc có thể bạn muốn
để trả lại tiền lương cho khách hàng dưới dạng một chuỗi có gắn ký hiệu đô la. Ngay cả khi một trường có
không có yêu cầu hoặc hạn chế về giá trị dữ liệu, đặt dữ liệu ở chế độ riêng tư và cung cấp tập hợp công khai và
phương thức get thiết lập một khuôn khổ giúp cho việc sửa đổi như vậy dễ dàng hơn trong tương lai.
Trong lớp Nhân viên trong Hình 10-11, tất cả các phương thức đều là công khai ngoại trừ một phương thức —
Phương thức mathWeeklyPay () là riêng tư. Điều đó có nghĩa là nếu bạn viết một chương trình và khai báo một

Đối tượng nhân viên chẳng hạn như Employee myAssistant ,


thì câu lệnh sau không được phép: Đừng làm điều đó
Tính toánWeeklyPay ()
myAssistant.calculateWeeklyPay ()
phương pháp không thể truy cập được
ngoài lớp.
Bởi vì nó là riêng tư, cách duy nhất để gọi
Phương thức mathWeeklyPay () là từ một phương thức khác
phương thức đã thuộc về lớp. Trong ví dụ này, nó được gọi từ setHourlyWage ()
phương pháp. Điều này ngăn cản một phần mềm client từ thiết hourlyWage đến một giá trị trong khi thiết lập
hàng tuần Thanh toán đến
một giá trị không tương thích. Bằng cách đặt phương thức CalculWeeklyPay () ở chế độ riêng tư,
bạn đảm bảo rằng lớp giữ toàn quyền kiểm soát khi nào và cách nó được sử dụng.
Các lớp thường chứa dữ liệu riêng tư và các phương thức công khai, nhưng như bạn vừa thấy, chúng có thể
chứa các phương thức riêng. Các lớp cũng có thể chứa các mục dữ liệu công khai. Ví dụ, một
Lớp nhân viên có thể chứa trường dữ liệu hằng số công khai có tên MINIMUM_WAGE ; ở ngoài
các chương trình sau đó sẽ có thể truy cập giá trị đó mà không cần sử dụng một phương thức. Trường dữ liệu công khai
không bắt buộc phải được đặt tên là hằng số, nhưng chúng thường xuyên như vậy.

Trong một số ngôn ngữ lập trình hướng đối tượng, chẳng hạn như C ++, bạn có thể gắn nhãn một tập hợp các trường hoặc phương thức dữ liệu
dưới dạng công khai hoặc riêng tư bằng cách sử dụng tên công cụ xác định quyền truy cập chỉ một lần, sau đó theo sau nó với danh sách các mục trong đó
thể loại. Trong các ngôn ngữ khác, chẳng hạn như Java, bạn sử dụng trình xác định công khai hoặc riêng tư với mỗi trường hoặc phương thức.
Để rõ ràng, cuốn sách này sẽ gắn nhãn từng trường và phương pháp là công khai hoặc riêng tư.

Nhiều lập trình viên muốn chỉ định trong sơ đồ lớp xem mỗi thành phần trong một lớp là
công cộng hoặc tư nhân. Hình 10-12 cho thấy các quy ước thường được sử dụng. Dấu trừ
(-) đứng trước các mục riêng tư (ít truy cập hơn); dấu cộng (+) đứng trước những dấu
công khai (dễ tiếp cận hơn).
Trang 21

Nhân viên

-lastName: string
-hourlyWage: num
-weeklyPay: num 447

+ setLastName (name: string): void


+ setHourlyWage (lương: num): vô hiệu
+ getLastName (): chuỗi
+ getHourlyWage (): num
+ getWeeklyPay (): num
-calculateWeeklyPay (): void

Hình 10-12 Biểu đồ lớp nhân viên với các chỉ định truy cập công cộng và riêng tư
© 2015 Cengage Learning

Khi bạn tìm hiểu thêm về kế thừa trong Chương 11, bạn sẽ tìm hiểu về một quyền truy cập bổ sung
specifier — trình chỉ định quyền truy cập được bảo vệ. Trong một sơ đồ lớp, bạn sử dụng một octothorpe, còn được gọi là

dấu thăng hoặc dấu số (#), để biểu thị quyền truy cập được bảo vệ.

Trong các ngôn ngữ lập trình hướng đối tượng, chương trình chính thường được viết dưới dạng một phương thức có tên

main () hoặc Main (), và phương thức đó hầu như luôn được định nghĩa là public.

Xem video Tạo Lớp học.

HAI SỰ THẬT & MỘT LỜI NÓI DỐI


Hiểu quyền truy cập công khai và riêng tư

1. Các lập trình viên hướng đối tượng thường chỉ định rằng các trường dữ liệu của họ sẽ có
truy cập riêng tư.

2. Các lập trình viên hướng đối tượng thường chỉ định rằng các phương thức của họ sẽ có
truy cập riêng tư.

3. Trong sơ đồ lớp, dấu trừ (-) đứng trước các mục là private;
dấu cộng (+) đứng trước những giá trị công khai.
Trang 22

Tổ chức lớp học


Lớp Employee trong Hình 10-12 chỉ chứa ba trường dữ liệu và sáu phương thức; phần lớn
các lớp bạn tạo cho các ứng dụng chuyên nghiệp sẽ có nhiều hơn nữa. Ví dụ, ngoài
đến họ và thông tin thanh toán, nhân viên thực sự yêu cầu số nhân viên, tên,
448 địa chỉ, số điện thoại, ngày thuê, v.v., cũng như các phương pháp để đặt và lấy các trường đó. Như
các lớp phát triển với mức độ phức tạp, quyết định cách tổ chức chúng ngày càng trở nên quan trọng.
Mặc dù nó không bắt buộc, hầu hết các lập trình viên đặt các trường dữ liệu theo một số thứ tự logic tại
đầu của một lớp học. Ví dụ: một số ID rất có thể được sử dụng làm số nhận dạng duy nhất cho
mỗi nhân viên, vì vậy việc liệt kê số ID của nhân viên trước trong lớp là rất hợp lý. An
họ và tên của nhân viên "đi cùng nhau", vì vậy, việc lưu trữ cả hai
các thành phần phụ. Bất chấp những quy tắc thông thường này, trong hầu hết các ngôn ngữ, bạn có
tính linh hoạt đáng kể khi định vị các trường dữ liệu của bạn trong một lớp. Ví dụ,
tùy thuộc vào lớp, bạn có thể chọn lưu trữ các trường dữ liệu theo thứ tự bảng chữ cái hoặc bạn có thể
nhóm tất cả các trường có cùng kiểu dữ liệu lại với nhau. Ngoài ra, bạn có thể chọn
lưu trữ tất cả các mục dữ liệu công khai trước, sau đó là các mục dữ liệu riêng tư hoặc ngược lại.
Trong một số ngôn ngữ, bạn có thể tổ chức các trường và phương thức dữ liệu theo bất kỳ thứ tự nào trong một lớp. Đối với
ví dụ, bạn có thể đặt tất cả các phương thức trước, sau đó là tất cả các trường dữ liệu hoặc bạn có thể
tổ chức lớp để các trường dữ liệu được theo sau bởi các phương thức sử dụng chúng. Cuốn sách này sẽ
tuân theo quy ước đặt tất cả các trường dữ liệu trước để bạn có thể thấy tên và dữ liệu của chúng
loại trước khi đọc các phương pháp sử dụng chúng. Định dạng này cũng lặp lại cách dữ liệu và
các phương thức xuất hiện trong biểu đồ lớp tiêu chuẩn.
Để dễ định vị các phương thức của một lớp, một số lập trình viên lưu trữ chúng theo thứ tự bảng chữ cái.
Các lập trình viên khác sắp xếp chúng theo cặp phương thức get và set, theo thứ tự như
các trường dữ liệu được xác định. Một tùy chọn khác là liệt kê tất cả các phương thức truy cập (get) cùng nhau và tất cả
(tập hợp) các phương thức với nhau. Tùy thuộc vào lớp, bạn có thể quyết định tạo
các nhóm chức năng một cách hợp lý. Tất nhiên, nếu công ty của bạn phân phối các nguyên tắc cho
tổ chức các thành phần của lớp, bạn phải tuân theo các quy tắc đó.

HAI SỰ THẬT & MỘT LỜI NÓI DỐI


Tổ chức lớp học

1. Khi các lớp ngày càng phức tạp, việc quyết định cách tổ chức chúng trở nên
ngày càng quan trọng.

2. Bạn có sự linh hoạt đáng kể trong cách tổ chức các trường dữ liệu
trong một lớp học.

3. Trong một lớp, các phương thức phải được lưu trữ theo thứ tự mà chúng được sử dụng.
Trang 23

Hiểu các phương pháp phiên bản

Hiểu các phương pháp phiên bản


Các lớp chứa dữ liệu và phương thức và mọi phiên bản của lớp đều sở hữu cùng một dữ liệu và
có quyền truy cập vào các phương pháp tương tự. Ví dụ, Hình 10-13 cho thấy một sơ đồ lớp cho một
Lớp sinh viên chỉ chứa một trường dữ liệu riêng tư cho điểm trung bình của sinh viên. Các
lớp cũng chứa các phương thức get và set cho trường. Hình 10-14 cho thấy mã giả cho 449

các sinh viên lớp. Lớp này trở thành mô hình cho một kiểu dữ liệu mới có tên là Sinh viên ; khi nào
Sinh viên đối
tượng được tạo ra cuối cùng, mỗi người sẽ có riêng của mình gradePointAverage lĩnh vực và
có quyền truy cập vào các phương pháp để lấy và thiết lập nó.

Sinh viên

-gradePointAverage: num

+ setGradePointAverage (gpa: num): void


+ getGradePointAverage (): num

Hình 10-13 Biểu đồ lớp cho lớp Sinh viên


© 2015 Cengage Learning

sinh viên lớp


Tuyên bố
điểm số riêng tư

public void setGradePointAverage (num gpa)

gradePointAverage = gpa
trở về

public num getGradePointAverage ()


trả lại điểm
endClass

Hình 10-14 Mã giả cho lớp Sinh viên


© 2015 Cengage Learning

Nếu bạn tạo nhiều đối tượng Sinh viên bằng cách sử dụng lớp trong Hình 10-14, bạn cần một
vị trí lưu trữ trong bộ nhớ máy tính để lưu trữ điểm trung bình duy nhất của mỗi Học sinh .
Ví dụ: Hình 10-15 cho thấy một chương trình khách tạo ra ba đối tượng Sinh viên và
gán giá trị cho các trường điểm trung bình của chúng . Nó cũng cho thấy các đối tượng Student trông như thế nào
trong bộ nhớ sau khi các giá trị đã được gán.
Trang 24

khởi đầu oneSophomore


Tuyên bố
2,6
Sinh viên một
Sinh viên một
oneJunior
Sinh viên một
450 3.8
oneSophomore.setGradePointAverage (2.6)
oneJunior.setGradePointAverage (3.8)
oneSenior.setGradePointAverage (3.4) một người
dừng lại 3,4

Hình 10-15 Chương trình StudentDemo và cách các đối tượng Student trông như thế nào trong bộ nhớ
© 2015 Cengage Learning

Mỗi đối tượng Sinh viên trong Hình 10-15 có điểm riêng của nó là rất hợp lý
nhưng không có ý nghĩa gì đối với mỗi Học sinh khi có bản sao riêng của các phương thức
lấy và đặt điểm trung bình . Tạo các bản sao giống hệt nhau của một phương thức cho mỗi phiên bản
sẽ không hiệu quả. Thay vào đó, mặc dù tất cả các sinh viên có riêng của mình gradePointAverage
, chỉ một bản sao của mỗi phương thức getGradePointAverage () và
setGradePointAverage () được
lưu trữ trong bộ nhớ; tuy nhiên, mỗi đối tượng được khởi tạo của lớp
có thể sử dụng bản sao phương pháp duy nhất. Một phương pháp hoạt động thích hợp với các đối tượng khác nhau là
một phương thức thể hiện .

Mặc dù lớp Sinh viên chỉ chứa một bản sao của các phương thức get và set, chúng hoạt động
chính xác cho bất kỳ số lượng trường hợp nào. Do đó, các phương thức như getGradePointAverage () và
setGradePointAverage () là
các phương thức phiên bản. Bởi vì chỉ một bản sao của mỗi phiên bản
phương pháp được lưu trữ, máy tính cần một cách để xác định điểm trung bình đang được
thiết lập hoặc truy xuất khi một trong các phương thức được gọi. Cơ chế xử lý vấn đề này
được minh họa trong Hình 10-16. Khi một phương thức gọi chẳng hạn như oneSophomore.
setGradePointAverage (2.6) được
thực hiện, là lệnh gọi phương thức thực, ẩn và
được tạo tự động, bao gồm địa chỉ bộ nhớ của đối tượng oneSophomore . (Những
các lệnh gọi phương thức được biểu diễn bằng ba hộp hẹp ở giữa Hình 10-16.)
Trang 25

Hiểu các phương pháp phiên bản

khởi đầu
Tuyên bố
Sinh viên một
Sinh viên một
Địa chỉ này là
Sinh viên một
được gọi là cái này 451
oneSophomore.setGradePointAverage (2.6)
tài liệu tham khảo.
oneJunior.setGradePointAverage (3.8)
oneSenior.setGradePointAverage (3.4)
dừng lại

setGradePointAverage (oneSophomoreAddress, 2.6)

setGradePointAverage (oneJuniorAddress, 3.8)

setGradePointAverage (oneSeniorAddress, 3,4)

sinh viên lớp


Tuyên bố
điểm số riêng tư

public void setGradePointAverage (aStudentAddress, num gpa)


gradePointAverage = gpa
trở về

public num getGradePointAverage ()


trả lại điểm
endClass

Hình 10-16 Cách địa chỉ bộ nhớ đối tượng Student được truyền từ một ứng dụng đến một

phương thức cá thể của lớp Sinh viên

Trong phương thức setGradePointAverage () trong lớp Sinh viên , một phương thức ẩn và
tham số được tạo tự động được thêm vào danh sách. (Đối với mục đích minh họa, thông số này
được đặt tên là aStudentAddress và được tô bóng trong định nghĩa lớp Sinh viên trong Hình 10-16. Trong
thực tế, không có tham số nào được tạo với tên đó.) Tham số này chấp nhận địa chỉ của một
Đối tượng Student vì phương thức instance thuộc về lớp Student ; nếu phương pháp này
Trang 26

thuộc về một lớp khác— Ví dụ: nhân viên — thì phương thức sẽ chấp nhận một địa chỉ
cho loại đối tượng đó. Các địa chỉ được tô bóng không được viết dưới dạng mã trong bất kỳ chương trình nào — chúng là
"Bí mật" được gửi và nhận ở hậu trường. Biến địa chỉ trong Hình 10-16 được gọi là
tài liệu tham khảo này . Một này tham khảo là một biến tự động tạo ra chứa địa chỉ của
một đối tượng và chuyển nó đến một phương thức thể hiện bất cứ khi nào phương thức này được gọi. Nó được gọi là cái này
452 tham chiếu vì nó đề cập đến “đối tượng cụ thể này” đang sử dụng phương thức vào lúc này. Trong
nói cách khác, một phương thức thể hiện nhận một tham chiếu này đến một cá thể lớp cụ thể. bên trong
ứng dụng trong Hình 10-16, khi oneSophomore sử dụng phương thức setGradePointAverage () ,
địa chỉ của đối tượng oneSophomore được chứa trong tham chiếu này . Sau đó trong
chương trình, khi đối tượng oneJunior sử dụng phương thức setGradePointAverage () , điều này
tham chiếu sẽ giữ địa chỉ của đối tượng Sinh viên đó.

Hình 10-16 hiển thị mỗi nơi này tham khảo được sử dụng trong sinh viên lớp. Nó được ngầm hiểu
được truyền dưới dạng tham số cho mỗi phương thức phiên bản. Bạn không bao giờ đề cập đến điều này một cách rõ ràng
tham chiếu khi bạn viết tiêu đề phương thức cho một phương thức thể hiện; Hình 10-16 chỉ cho thấy
nơi nó ngầm tồn tại. Trong mỗi phương thức phiên bản, tham chiếu này được ngụ ý bất kỳ
thời gian bạn tham chiếu đến một trong các trường dữ liệu lớp. Ví dụ, khi bạn gọi
setGradePointAverage () bằng
cách sử dụng đối tượng oneSophomore , lớpPointAverage được chỉ định
trong phương thức là “ this gradePointAverage ”, hoặc thuộc về
đối tượng oneSophomore . Cụm từ “này gradePointAverage ” thường được viết dưới dạng này ,
theo sau là dấu chấm, theo sau là tên trường— this.gradePointAverage .

Các này tham khảo tồn tại khắp mọi phương pháp dụ. Bạn có thể sử dụng cái này một cách rõ ràng
tham chiếu với các trường dữ liệu, nhưng nó không bắt buộc. Hình 10-17 cho thấy hai vị trí nơi
tham chiếu này có thể được sử dụng ngầm, hoặc nơi bạn có thể (nhưng không bắt buộc) sử dụng nó một cách rõ ràng.
Trong một phương thức phiên bản, hai số nhận dạng sau có nghĩa giống hệt nhau:
bất kỳ tên trường nào được xác định trong lớp

cái này , theo sau là một dấu chấm, theo sau là cùng một tên trường
Ví dụ, trong phương thức setGradePointAverage () , gradePointAverage và điều này.
điểm trung bình tham chiếu đến chính xác cùng một vị trí bộ nhớ.

sinh viên lớp


Tuyên bố
điểm số riêng tư

public void setGradePointAverage (num gpa)


this.gradePointAverage = gpa
trở về

Bạn có thể viết cái này


public num getGradePointAverage ()
trả lại this.gradePointAverage như một tài liệu tham khảo trong
endClass những địa điểm này.

Hình 10-17 Sử dụng điều này một cách rõ ràng trong lớp Sinh viên
Trang 27

Hiểu các phương pháp phiên bản

Các này tham khảo có thể được sử dụng với định danh là một phần của các lớp định nghĩa-đó
là, tên trường hoặc phương thức thể hiện. Bạn không thể sử dụng nó với các biến cục bộ là các tham số
để thể hiện các phương thức hoặc được khai báo bên trong các thân phương thức. Ví dụ, trong Hình 10-17 bạn
có thể tham khảo this.gradePointAverage , nhưng bạn không thể tham khảo this.gpa vì GPA không phải là một
trường lớp — nó chỉ là một biến cục bộ.
453
Cú pháp để sử dụng điều này khác nhau giữa các ngôn ngữ lập trình. Ví dụ: trong một lớp trong C ++, bạn
có thể tham chiếu đến giá trị Điểm trung bình của lớp Sinh viên như sau-> Điểm trung bình hoặc
(* this) .gradePointAverage, nhưng trong Java, bạn gọi nó là this.gradePointAverage. Trực quan
Về cơ bản, tham chiếu này được đặt tên là Tôi, vì vậy biến sẽ là Me.gradePointAverage.

Thông thường, bạn không cần phải sử dụng tham chiếu này một cách rõ ràng trong các phương thức bạn viết,
nhưng này tham chiếu là luôn luôn ở đó, làm việc đằng sau hậu trường, tiếp cận lĩnh vực dữ liệu cho
đối tượng chính xác.

Tổ chức của bạn có thể muốn bạn sử dụng tài liệu tham khảo này một cách rõ ràng mặc dù nó không
cần thiết để tạo một chương trình khả thi. Lập trình viên có trách nhiệm tuân theo các quy ước
được thành lập tại nơi làm việc hoặc bởi khách hàng.

Để làm ví dụ về thời điểm bạn có thể sử dụng tham chiếu này một cách rõ ràng, hãy xem xét những điều sau
phương thức setGradePointAverage () và so sánh nó với phiên bản trong lớp Sinh viên trong
Hình 10-17.
public void setGradePointAverage (num gradePointAverage)
this.gradePointAverage = gradePointAverage
trở về

Trong phiên bản này của phương pháp, lập trình viên đã sử dụng cấp định danhPointAverage
vừa là tham số cho phương thức vừa là trường cá thể trong lớp. Vì thế,
gradePointAverage là
tên của một biến cục bộ trong phương thức có giá trị được nhận
bằng cách đi qua; nó cũng là tên của một trường lớp. Để phân biệt cả hai, bạn sử dụng
tham chiếu này với bản sao của lớpPointAverage là một thành viên của lớp. Bỏ sót
các này tham khảo trong trường hợp này sẽ cho kết quả trong địa phương tham số gradePointAverage phúc
được gán cho chính nó, và biến thể hiện của lớp sẽ không được đặt. Bất kỳ lúc nào một biến cục bộ
trong một phương thức có cùng định danh với một trường, trường bị ẩn; bạn phải sử dụng cái này
tham chiếu để phân biệt trường với biến cục bộ.

Xem video Tham khảo này.

25/41
9/7/2021 Lập trình hướng đối tượng

Trang 28

CHƯƠNG 1 0 Lập trình hướng đối tượng

HAI SỰ THẬT & MỘT LỜI NÓI DỐI


Hiểu các phương pháp phiên bản

454 1. Một phương thức phiên bản hoạt động chính xác nhưng khác nhau cho từng
thể hiện của một lớp.

2. Một này tham chiếu là một biến bạn phải khai báo rõ ràng với mỗi lớp bạn
tạo nên.

3. Khi bạn viết một phương thức thể hiện trong một lớp, hai định danh sau trong
phương thức luôn có nghĩa giống hệt nhau: bất kỳ tên trường nào hoặc cái này
tiếp theo là một dấu chấm, tiếp theo là cùng một tên trường.

ly. plicit itex Chúng


tuyên
tôikhông
bố u phải
làmd.Yo can đảm
odis meth
các khôngkhi
baonào
giờ
od meth ce stan anin itto sses dpa ctan phản đối
Của một
bài luận
addr sthe giữ
cái đóchảy
varia
máu ted crea đồngmatic
minhTự động
mộteis renc giới thiệu
Là A#th2. Làent vật tổest giả dối
Các

Hiểu các phương pháp tĩnh


Một số phương pháp không yêu cầu tham chiếu này vì nó cũng không có ý nghĩa gì đối với chúng
ngầm định hoặc rõ ràng. Ví dụ, phương thức displayStudentMotto () trong Hình 10-18 có thể
được thêm vào lớp Sinh viên . Mục đích của nó là để hiển thị một phương châm mà tất cả các đối tượng Sinh viên sử dụng trong
theo cùng một cách. Phương thức không sử dụng bất kỳ trường dữ liệu nào từ lớp Sinh viên , vì vậy nó không
vấn đề mà đối tượng Sinh viên gọi nó. Nếu bạn viết một chương trình trong đó bạn khai báo 100 Student
các đối tượng, phương thức displayStudentMotto () thực thi theo cùng một cách cho mỗi
chúng; nó không cần biết phương châm của ai được hiển thị và nó không cần truy cập vào bất kỳ
địa chỉ đối tượng cụ thể. Trên thực tế, bạn có thể muốn hiển thị phương châm Sinh viên
mà không cần khởi tạo bất kỳ đối tượng Sinh viên nào . Do đó, phương thức displayStudentMotto () có thể
được viết dưới dạng một phương thức tĩnh thay vì một phương thức thể hiện.

public static void displayStudentMotto ()


đầu ra "Mỗi học sinh là một cá nhân"
đầu ra "theo đuổi kiến ​thức."
đầu ra "Mọi học sinh đều phấn đấu để trở thành"
đầu ra "một công dân biết chữ, có trách nhiệm."
trở về

Hình 10-18 Phương thức displayStudentMotto () của lớp sinh viên


© 2015 Cengage Learning
Trang 29

Hiểu các phương pháp tĩnh

Khi bạn viết một lớp, bạn có thể chỉ ra hai loại phương thức:
Phương thức tĩnh , còn được gọi là phương thức lớp , là những phương thức mà không có đối tượng nào cần tồn tại,
như phương thức displayStudentMotto () trong Hình 10-18. Các phương thức tĩnh không nhận được một
tham chiếu này như một tham số ngầm định. Thông thường, các phương thức tĩnh bao gồm từ
static trong tiêu đề phương thức, như được hiển thị trong Hình 10-18. (Sử dụng Java, C # và C ++ 455
từ khóa tĩnh . Trong Visual Basic, từ khóa Shared được sử dụng thay cho từ khóa tĩnh .)

Phương thức không phải là phương thức tồn tại để sử dụng với một đối tượng. Những trường hợp này
các phương thức nhận một tham chiếu này đến một đối tượng cụ thể. Trong hầu hết các ngôn ngữ lập trình,
bạn sử dụng từ static khi bạn muốn khai báo một thành viên lớp static, nhưng bạn lại
không sử dụng một từ đặc biệt khi bạn muốn một thành viên trong lớp không có trạng thái bất thường. Nói cách khác,
các phương thức trong một lớp là các phương thức thể hiện không tĩnh theo mặc định.

Trong ngôn ngữ hàng ngày, từ tĩnh có nghĩa là "tĩnh"; nó đối lập với động, có nghĩa là
"thay đổi." Nói cách khác, các phương thức tĩnh luôn giống nhau cho mọi trường hợp của một lớp, trong khi
các phương thức nonstatic hoạt động khác nhau tùy thuộc vào đối tượng được sử dụng để gọi chúng.

Trong hầu hết các ngôn ngữ lập trình, bạn sử dụng một phương thức tĩnh với tên lớp (nhưng không phải
tên đối tượng), như sau:
Student.displayStudentMotto ()

Nói cách khác, không có đối tượng nào là cần thiết với một phương thức tĩnh.

Trong một số ngôn ngữ, đáng chú ý là C ++, ngoài việc sử dụng một phương thức tĩnh với tên lớp, bạn cũng có thể sử dụng
phương thức tĩnh với bất kỳ đối tượng nào của lớp, như trong oneSophomore.displayStudentMotto ().

HAI SỰ THẬT & MỘT LỜI NÓI DỐI


Hiểu các phương pháp tĩnh

1. Các phương thức lớp không nhận được tham chiếu này .

2. Phương thức tĩnh không nhận được tham chiếu này .

3. Các phương thức không theo chủ đề không nhận được tham chiếu này .
Trang 30

Sử dụng các đối tượng


Một lớp là một kiểu dữ liệu phức tạp được định nghĩa bởi một lập trình viên, nhưng theo nhiều cách, bạn có thể sử dụng
các trường hợp khi bạn sử dụng các mục có kiểu dữ liệu đơn giản hơn. Ví dụ: bạn có thể chuyển một đối tượng cho một
, trả về một đối tượng từ một phương thức hoặc sử dụng các mảng đối tượng.
456 Hãy xem xét lớp InventoryItem trong Hình 10-19. Lớp đại diện cho các mục mà một công ty
sản xuất và giữ hàng tồn kho. Mỗi mặt hàng có một số, mô tả và giá cả. Các
lớp chứa một phương thức get và set cho mỗi trường trong số ba trường.

class InventoryItem
Tuyên bố
khoảng không quảng cáo chuỗi riêng
mô tả chuỗi riêng tư
giá num riêng

public void setInventoryNumber (chuỗi số)


kiểm kêNumber = số
trở về

public void setDescription (mô tả chuỗi)


this.description = mô tả
trở về

public void setPrice (num price)


nếu (giá <0)
Lưu ý việc sử dụng
this.price = 0
khác tài liệu tham khảo này đến
phân biệt giữa
this.price = giá
tham số phương thức
endif và trường lớp.
trở về

chuỗi công khai getInventoryNumber ()


trả lại hàng tồn kho

chuỗi công khai getDescription ()


trả lại mô tả

public num getPrice ()


giá trả lại

endClass

Hình 10-19 Lớp InventoryItem


© 2015 Cengage Learning

Truyền một đối tượng đến một phương thức


Bạn có thể truyền một đối tượng cho một phương thức giống như cách bạn có thể truyền một số hoặc chuỗi đơn giản
Biến đổi. Ví dụ, Hình 10-20 cho thấy một chương trình khai báo một đối tượng InventoryItem
và chuyển nó đến một phương thức để hiển thị. Mục hàng tồn kho được khai báo trong chương trình chính
và các giá trị được chỉ định. Sau đó, mục đã hoàn thành được chuyển đến một phương thức, nơi nó được hiển thị.
Hình 10-21 cho thấy quá trình thực thi chương trình.
Trang 31

Sử dụng các đối tượng

khởi đầu
Tuyên bố
InventoryItem oneItem
oneItem.setInventoryNumber ("1276")

oneItem.setDescription ("Rương gỗ gụ")


oneItem.setPrice (450,00) 457
displayItem (oneItem)
dừng lại

public static void displayItem (mục InventoryItem)


Tuyên bố
num TAX_RATE = 0,06
thuế num
num pr
tổng số
xuất "Item #", item.getInventoryNumber ()
output item.getDescription ()
pr = item.getPrice ()
thuế = pr * TAX_RATE
tổng = pr + thuế
đầu ra "Giá là $", pr, "cộng với $", thuế, "thuế"
đầu ra "Tổng là $", tổng cộng
trở về

Hình 10-20 Ứng dụng khai báo và sử dụng đối tượng InventoryItem
© 2015 Cengage Learning

Hình 10-21 Thực hiện ứng dụng trong Hình 10-20


© 2015 Cengage Learning

Mục hàng tồn kho được khai báo trong chương trình chính trong Hình 10-20 được chuyển đến
phương thức displayItem () giống như một biến số hoặc chuỗi. Các
phương thức nhận một bản sao của InventoryItem được mục định danh cục bộ biết đến .
Trong phương thức, các giá trị trường của mục cục bộ có thể được truy xuất, hiển thị và sử dụng trong
các câu lệnh số học giống như cách mà chúng có thể có trong chương trình chính, nơi
InventoryItem ban đầu được khai báo.

Trả lại một đối tượng từ một phương thức


Hình 10-22 cho thấy một ứng dụng thực tế hơn sử dụng các đối tượng InventoryItem . Trong chính
chương trình, một InventoryItem được khai báo và người dùng được nhắc nhập một số. Miễn là
người dùng không nhập giá trị QUIT , một vòng lặp được thực hiện trong đó mục hàng tồn kho đã nhập
số được chuyển đến phương thức getItemValues () . Trong phương pháp đó, một InventoryItem cục bộ
​​
Trang 32

đối tượng được khai báo. Đối tượng cục bộ này tập hợp và lưu giữ các giá trị đầu vào của người dùng. Người dùng là
được nhắc về mô tả và giá cả, sau đó là số mục đã chuyển và mới lấy được
mô tả và giá được gán cho đối tượng InventoryItem cục bộ thông qua các phương thức đã đặt của nó. Các
đối tượng hoàn thành được trả về chương trình, nơi nó được gán cho đối tượng InventoryItem .
Mục đó sau đó được chuyển sang phương thức displayItem () . Asinthepreviousexample, phương pháp
458 tính thuế và hiển thị kết quả. Hình 10-23 cho thấy một thực thi điển hình.

khởi đầu

Tuyên bố
InventoryItem oneItem
string itemNum
string QUIT = "0"
đầu ra "Nhập số mục hoặc", QUIT, "để thoát ..."
đầu vào itemNum
trong khi itemNum <> QUIT
oneItem = getItemValues (itemNum)
​​
displayItem (oneItem)
đầu ra "Nhập số mục tiếp theo hoặc", QUIT, "để thoát ..."
đầu vào itemNum
cuối cùng
dừng lại

public static InventoryItem getItemValues (chuỗi số)


​​
Tuyên bố
InventoryItem inItem
chuỗi mô tả
giá num
đầu ra "Nhập mô tả…"
đầu vào mô tả
đầu ra "Nhập giá…"
giá đầu vào
inItem.setInventoryNumber (số)
inItem.setDescription (mô tả)
inItem.setPrice (giá)
return inItem

public static void displayItem (mục InventoryItem)


Tuyên bố
num TAX_RATE = 0,06
thuế num
num pr
tổng số
xuất "Item #", item.getInventoryNumber ()
output item.getDescription ()
pr = item.getPrice ()
thuế = pr * TAX_RATE
tổng = pr + thuế
đầu ra "Giá là $", pr, "cộng với $", thuế, "thuế"
đầu ra "Tổng là $", tổng cộng
trở về

Hình 10-22 Ứng dụng sử dụng các đối tượng InventoryItem


© 2015 Cengage Learning
Trang 33

Hình 10-23 Thực hiện chương trình điển hình trong Hình 10-22
© 2015 Cengage Learning

459
Trong Hình 10-22, lưu ý rằng kiểu trả về cho phương thức getItemValues ​() là
Mục hàng tồn kho .
Một phương thức chỉ có thể trả về một giá trị duy nhất. Do đó, thật tiện lợi khi
Phương thức getItemValues ​() có thể đóng gói hai chuỗi và một số trong một
Đối tượng InventoryItem mà nó quay trở lại chương trình chính.

Sử dụng Mảng đối tượng


Trong Chương 6, bạn đã biết rằng khi bạn khai báo một mảng, bạn sử dụng kiểu dữ liệu, một mã định danh,
và một kích thước được chứa trong dấu ngoặc. Ví dụ, các câu lệnh sau khai báo num và
mảng chuỗi , tương ứng:
điểm số [10]
tên chuỗi [5]

Bạn có thể sử dụng cùng một cú pháp để khai báo mảng đối tượng: kiểu dữ liệu (lớp), mã định danh và
kích thước trong ngoặc. Ví dụ: bạn có thể khai báo một mảng gồm bảy đối tượng InventoryItem như
sau:
Mục hàng tồn kho [7]
Trang 34

CHƯƠNG 1 0 Lập trình hướng đối tượng

Bất kỳ phần tử mảng mục riêng lẻ nào cũng có thể được sử dụng theo cách giống như bất kỳ đối tượng đơn lẻ nào của
Loại hàng tồn kho . Ví dụ: phần tử thứ ba trong mảng có thể được chuyển cho
phương thức displayItem () trong Hình 10-22 sử dụng câu lệnh sau:
hiển thị (mục [2])

460 Toàn bộ mảng có thể được chuyển cho một phương thức xác định một mảng có kiểu chính xác là
tham số. Ví dụ, câu lệnh displayArray (items) có thể được sử dụng để gọi một phương thức
với tiêu đề sau:
public static void displayArray (danh sách InventoryItem [])

Trong phương thức này, mảng sẽ được gọi là danh sách .


Mọi thành viên công khai của lớp InventoryItem có thể được sử dụng với bất kỳ đối tượng nào trong mảng bằng cách
sử dụng chỉ số con để xác định phần tử. Ví dụ: phần tử thứ x trong mảng mục có thể
sử dụng phương thức public setInventoryNumber () của lớp InventoryItem bằng cách sử dụng
tuyên bố sau:
items [x] .setInventoryNumber (34);

Hình 10-24 cho thấy một chương trình hoàn chỉnh khai báo bảy đối tượng InventoryItem , thiết lập
và hiển thị chúng.
Trang 35

khởi đầu
Tuyên bố
num SIZE = 7
Mục hàng tồn kho [SIZE] 461
num phụ
phụ = 0
trong khi phụ <SIZE
items [sub] = getItemValues ()

​​
sub = sub + 1
cuối cùng
displayItems (mục, SIZE)
dừng lại

public static InventoryItem getItemValues ()


​​
Tuyên bố
Mục hàng tồn kho
num itemNum
chuỗi mô tả
giá num
đầu ra "Nhập số mặt hàng…"
đầu vào itemNum
đầu ra "Nhập mô tả…"
đầu vào mô tả
đầu ra "Nhập giá…"
giá đầu vào
item.setInventoryNumber (số)
item.setDescription (desc)

item.setPrice (giá)
trả lại hàng

public static void displayItems (InventoryItem [] item, num SIZE)


Tuyên bố
num TAX_RATE = 0,06
thuế num
num pr
tổng số
int x
x=0
trong khi x <SIZE
xuất ra "Item number #", items [x] .getInventoryNumber ()
các mục đầu ra [x] .getDescription ()
pr = items [x] .getPrice ()
thuế = pr * TAX_RATE
tổng = pr + thuế
đầu ra "Giá là $", pr, "cộng với $", thuế, "thuế"
đầu ra "Tổng là $", tổng cộng
x=x+1
cuối cùng
trở về

Hình 10-24 Ứng dụng sử dụng một mảng các đối tượng InventoryItem
© 2015 Cengage Learning
Trang 36

Trong chương trình ở Hình 10-24, một hằng số được khai báo cho kích thước của mảng, và sau đó
mảng được khai báo. Chương trình sử dụng một trong khi vòng lặp để gọi một phương thức có tên getItemValues ()
bảy lần. Phương thức không chấp nhận tham số. Nó khai báo một đối tượng InventoryItem và
sau đó nó sẽ nhắc người dùng nhập số mặt hàng, mô tả và giá cả. Những giá trị đó là
được gán cho đối tượng InventoryItem bằng cách sử dụng các phương thức công khai của nó. Đối tượng hoàn thành sau đó là
462 quay trở lại chương trình chính, chuyển mảng và kích thước của nó đến một phương thức có tên
displayItems () hiển thị dữ liệu cho tất cả các mục.
Chương trình trong Hình 10-24 có thể đã được viết để toàn bộ mảng được chuyển cho một
phương thức để lấy dữ liệu, và sau đó một vòng lặp có thể đã được sử dụng trong phương thức. Các
chương trình cũng có thể đã được viết để phương thức hiển thị chỉ chấp nhận một
Đối tượng InventoryItem thay vì toàn bộ mảng, và sau đó nó sẽ là cần thiết để
gọi phương thức bảy lần trong một vòng lặp. Như bạn đã học trong suốt cuốn sách này, có
thường có nhiều cách để hoàn thành cùng một mục tiêu. Một hỗn hợp các phương pháp đã được sử dụng cho
chương trình trong Hình 10-24 để chứng minh cách hoạt động của cả hai cách tiếp cận.

HAI SỰ THẬT & MỘT LỜI NÓI DỐI


Sử dụng các đối tượng

1. Bạn có thể truyền một đối tượng cho một phương thức.

2. Vì chỉ có thể trả về một giá trị từ một phương thức, bạn không thể trả về
đối tượng chứa nhiều hơn một trường.

3. Bạn có thể khai báo cục bộ một đối tượng trong một phương thức.

Tóm tắt chương


Các lớp là nền tảng cơ bản của lập trình hướng đối tượng. Một lớp mô tả một
bộ sưu tập đồ vật; mỗi đối tượng là một thể hiện của một lớp. Các trường hoặc phiên bản của một lớp
các biến, giữ dữ liệu của nó và mọi đối tượng là một thể hiện của một lớp đều có quyền truy cập vào
các phương pháp tương tự. Một chương trình hoặc lớp khởi tạo các đối tượng của một lớp được viết trước khác là một
khách hàng lớp hoặc người dùng lớp. Ngoài các lớp và đối tượng, ba tính năng quan trọng của
ngôn ngữ hướng đối tượng là đa hình, kế thừa và đóng gói.

Định nghĩa lớp là một tập hợp các câu lệnh chương trình liệt kê các trường và phương thức mỗi
đối tượng có thể sử dụng. Một định nghĩa lớp có thể chứa tên, dữ liệu và các phương thức. Lập trình viên
thường sử dụng biểu đồ lớp để minh họa các đặc điểm của lớp. Nhiều phương thức có trong một lớp
có thể được chia thành ba loại: phương thức thiết lập, phương thức nhận và phương thức làm việc.
Trang 37

Điều khoản quan trọng

Các lập trình viên hướng đối tượng thường chỉ định rằng các trường dữ liệu của họ sẽ có quyền truy cập riêng—
nghĩa là, dữ liệu không thể được truy cập bằng bất kỳ phương thức nào không phải là một phần của lớp. Các phương pháp
thường xuyên hỗ trợ truy cập công khai, có nghĩa là các chương trình và phương pháp khác có thể sử dụng
các phương pháp kiểm soát quyền truy cập vào dữ liệu cá nhân. Trong sơ đồ lớp, dấu trừ (-)
đứng trước mỗi mục là riêng tư; dấu cộng (+) đứng trước mỗi mục được công khai.
463
Khi các lớp ngày càng phức tạp, việc quyết định cách tổ chức chúng ngày càng trở nên
quan trọng. Tùy thuộc vào lớp, bạn có thể chọn lưu trữ các trường dữ liệu bằng cách liệt kê
trường trọng điểm đầu tiên. Bạn cũng có thể liệt kê các trường theo thứ tự bảng chữ cái, theo kiểu dữ liệu hoặc theo khả năng truy cập.
Các phương thức có thể được lưu trữ theo thứ tự bảng chữ cái hoặc theo cặp phương thức get và set.
Một phương thức thể hiện hoạt động chính xác nhưng khác nhau cho mọi đối tượng được khởi tạo từ một
lớp học. Khi một phương thức thể hiện được gọi, một tham chiếu này chứa bộ nhớ của đối tượng
địa chỉ được chuyển tự động và ngầm định cho phương thức.
Một lớp có thể chứa hai loại phương thức: phương thức tĩnh, còn được gọi là lớp
và không nhận tham chiếu này như một tham số ngầm định; và không ổn định
phương pháp, đó là phương pháp dụ và làm nhận này tham khảo ngầm.
Bạn có thể sử dụng các đối tượng theo nhiều cách giống như cách bạn sử dụng các mục có kiểu dữ liệu đơn giản hơn, chẳng hạn như
truyền chúng đến và đi từ các phương thức và tạo mảng.

Điều khoản quan trọng


Lập trình hướng đối tượng (OOP) là một mô hình lập trình tập trung vào một
các thành phần và dữ liệu của ứng dụng và các phương pháp bạn cần để thao tác chúng.

Một lớp mô tả một nhóm hoặc tập hợp các đối tượng có các thuộc tính chung.

Một đối tượng là một ví dụ hữu hình của một lớp; nó là một thể hiện của một lớp.

Một cá thể là một ví dụ hữu hình của một lớp; nó là một đối tượng.

Một thuyết minh của một lớp là một thể hiện hoặc đối tượng.

Để khởi tạo một đối tượng là tạo ra nó.


Thuộc tính là các đặc điểm xác định một đối tượng.

Một mối quan hệ là một tồn tại giữa một đối tượng và lớp của nó.

Các biến thể hiện của một lớp là các thành phần dữ liệu thuộc về mọi đối tượng được khởi tạo.

Trường là thuộc tính đối tượng hoặc dữ liệu.

Các trạng thái của một đối tượng là tập hợp của tất cả các giá trị hoặc nội dung của các biến cá thể của nó.

Máy khách lớp hoặc người dùng lớp là một chương trình hoặc lớp khởi tạo các đối tượng của một
lớp viết sẵn.
Trang 38

Tính đa hình thuần túy mô tả các tình huống trong đó một phương pháp được sử dụng với nhiều loại
tranh luận.

Kế thừa là quá trình tiếp thu những đặc điểm của người đi trước.

Đóng gói là quá trình kết hợp tất cả các thuộc tính và phương thức của một đối tượng thành một
464 gói đơn.

Ẩn thông tin (hoặc ẩn dữ liệu ) là khái niệm mà các lớp khác không nên thay đổi một
thuộc tính của đối tượng — chỉ các phương thức của lớp riêng của đối tượng mới có đặc quyền đó.

Một định nghĩa lớp là một tập hợp các báo cáo chương trình xác định các lĩnh vực và phương pháp cho một lớp.

Một kiểu người dùng định nghĩa , hoặc loại lập trình viên định nghĩa , là một loại không được xây dựng thành một ngôn ngữ
nhưng được tạo bởi lập trình viên của ứng dụng.

Một kiểu dữ liệu trừu tượng (ADT) là một loại lập trình viên xác định, chẳng hạn như là một lớp.

Kiểu dữ liệu nguyên thủy là các số và ký tự đơn giản không phải là kiểu lớp.

Một sơ đồ lớp bao gồm một hình chữ nhật được chia thành ba phần cho tên, dữ liệu,
và các phương thức của một lớp.

Một phương pháp thiết lập là một phương pháp dụ rằng bộ hoặc thay đổi giá trị của một trường dữ liệu định nghĩa trong một
lớp học.

Một phương pháp mutator là một phương pháp dụ rằng bộ hoặc thay đổi giá trị của một trường dữ liệu định nghĩa
trong một lớp học.

Một bất động sản cung cấp phương pháp cho phép bạn để có được và thiết lập một giá trị trường lớp bằng cách sử dụng đơn giản
cú pháp.

Một phương pháp get là một phương pháp dụ mà trả về một giá trị từ một lĩnh vực được xác định trong một lớp học.

Một phương pháp accessor là một phương pháp dụ mà trả về một giá trị từ một lĩnh vực được xác định trong một lớp học.

Một phương thức làm việc thực hiện các tác vụ trong một lớp.

Một phương pháp giúp đỡ hoặc điều phối là một phương pháp làm việc.

Quyền truy cập riêng tư chỉ định rằng dữ liệu hoặc phương thức không thể được sử dụng bởi bất kỳ phương thức nào không phải là một phần
của cùng một lớp.

Quyền truy cập công khai chỉ định rằng các chương trình và phương pháp khác có thể sử dụng dữ liệu được chỉ định hoặc
các phương thức trong một lớp.

Một chỉ định truy cập là tính từ xác định kiểu truy cập mà các lớp bên ngoài sẽ phải
thuộc tính hoặc phương thức.

Một phương thức thể hiện hoạt động chính xác nhưng khác nhau cho mỗi đối tượng. Một phương thức phiên bản là
nonstatic và ngầm nhận một tham chiếu này .

Một tài liệu tham khảo này là một biến tự động tạo ra chứa địa chỉ của một đối tượng và
chuyển nó đến một phương thức thể hiện bất cứ khi nào phương thức được gọi.
Trang 39

Phương thức tĩnh là những phương thức không có đối tượng nào cần tồn tại; chúng không phải là các phương thức thể hiện
và họ không nhận được tham chiếu này .

Một phương pháp lớp học là một phương pháp tĩnh; nó không phải là một phương pháp dụ và nó không nhận được này
tài liệu tham khảo.

Phương thức không phải là phương thức tồn tại để sử dụng với một đối tượng; họ là ví dụ 465

và nhận được một tham chiếu này .

Bài tập

Câu hỏi đánh giá

1. Phương tiện nào sau đây giống với đối tượng?


a. lớp học c. cánh đồng
b. ví dụ d. thể loại
2. Điều nào sau đây có nghĩa giống với biến thể hiện?
a. lớp học c. thể loại
b. ví dụ d. cánh đồng
3. Một chương trình khởi tạo các đối tượng của một lớp viết sẵn khác là a (n) .

a. khách hàng c. ví dụ
b. vật d. GUI
4. Mối quan hệ giữa một thể hiện và một lớp là a (n) mối quan hệ.
a. có một c. đa hình
b. là một d. Hostile
5. Cái nào trong số này không thuộc về những cái khác?
a. biến cá thể c. cánh đồng
b. thuộc tính d. vật
6. Quá trình tiếp thu những nét của người đi trước là .

a. đa hình c. di sản
b. sự đóng gói d. sự định hướng
7. Khi thảo luận về các lớp và đối tượng, tính đóng gói có nghĩa là .
a. tất cả các trường thuộc cùng một đối tượng
b. tất cả các lĩnh vực là riêng tư
c. tất cả các trường và phương thức được nhóm lại với nhau
d. tất cả các phương pháp là công khai

https://translate.googleusercontent.com/translate_f 36/41
9/7/2021 Lập trình hướng đối tượng

Trang 40

CHƯƠNG 1 0 Lập trình hướng đối tượng

8. Mọi định nghĩa lớp phải chứa .

a. một cái tên c. phương pháp


b. dữ liệu d. tất cả những điều trên
9. Giả sử rằng một chương trình đang làm việc có chứa câu lệnh sau:
466 myDog.setName ("Bowser")

Bạn biết điều nào sau đây?


a. setName () là một phương thức công khai.
b. setName () chấp nhận một tham số chuỗi.
c. cả hai ở trên
d. không có cái nào ở trên
10. Giả sử rằng một chương trình đang làm việc có chứa câu lệnh sau:
name = myDog.getName ()

Bạn biết điều nào sau đây?

a. getName () trả về một chuỗi.


b. getName () trả về một giá trị có cùng kiểu dữ liệu với tên .
c. cả hai ở trên
d. không có cái nào ở trên
11. Một sơ đồ lớp .

a. cung cấp tổng quan về dữ liệu và phương thức của một lớp
b. cung cấp chi tiết triển khai phương pháp
c. không bao giờ được sử dụng bởi những người không lập trình vì nó quá kỹ thuật
d. tất cả những điều trên
12. Trường hợp nào sau đây có khả năng xảy ra nhất đối với một lớp cụ thể?
a. Dữ liệu của nó là riêng tư và các phương pháp của nó là công khai.
b. Dữ liệu của nó là công khai và các phương pháp của nó là riêng tư.
c. Dữ liệu và phương pháp của nó đều được công khai.
d. Dữ liệu và phương pháp của nó đều là riêng tư.
13. Một phương thức thể hiện .
a. là tĩnh c. cả hai ở trên
b. nhận được một tài liệu tham khảo này d. không có cái nào ở trên

14. Giả sử rằng bạn đã tạo một lớp có tên Dog có chứa trường dữ liệu có tên
weight vàmột phương thức instance có tên setWeight () . Hơn nữa, giả định rằng
Phương thức setWeight () chấp nhận một tham số số có tên là weight . Cái nào trong số
các câu lệnh sau đặt đúng trọng lượng của Dog trong phương thức setWeight () ?
a. weight = trọng lượng c. weight = this.weight
b. this.weight = this.weight d. this.weight = trọng lượng

https://translate.googleusercontent.com/translate_f 37/41
9/7/2021 Lập trình hướng đối tượng

Trang 41

Bài tập

15. Một phương thức tĩnh còn được gọi là a (n) phương pháp.
a. ví dụ c. riêng tư
b. công cộng d. lớp học
16. Theo mặc định, các phương thức chứa trong một lớp là các phương pháp.
467
a. tĩnh c. lớp học
b. không ổn định d. công cộng
17. Giả sử rằng bạn đã tạo một lớp có tên MyClass và một chương trình hoạt động
chứa câu lệnh sau:
xuất ra MyClass.number

Bạn biết điều nào sau đây?


a. number là một trường số. c. number là một biến thể hiện.
b. số là một trường tĩnh. d. tất cả những điều trên
18. Giả sử rằng bạn đã tạo một đối tượng có tên là myObject và đang hoạt động
chương trình chứa câu lệnh sau:
xuất myObject.getSize ()

Bạn biết điều nào sau đây?


a. getSize () là một phương thức tĩnh.
b. getSize () trả về một số.
c. getSize () nhận được một tham chiếu này .
d. tất cả những điều trên
19. Giả sử rằng bạn đã tạo một lớp có chứa một trường riêng có tên là myField
và một phương thức công khai không tĩnh có tên myMethod () . Điều nào sau đây là đúng?

a. myMethod () có quyền truy cập vào myField và có thể sử dụng nó.


b. myMethod () không có quyền truy cập vào myField và không thể sử dụng nó.
c. myMethod () có thể sử dụng myField nhưng không thể chuyển nó cho các phương thức khác.
d. myMethod () chỉ có thể sử dụng myField nếu nó được truyền cho myMethod () dưới dạng tham số.
20. Một đối tượng có thể được .

a. được lưu trữ trong một mảng c. trả về từ một phương thức
b. chuyển cho một phương pháp d. tất cả những điều trên

Bài tập lập trình

1. Xác định ba đối tượng có thể thuộc mỗi lớp sau:


a. Xây dựng
b. Họa sĩ
c. Vay ngân hàng

Trang 42

https://translate.googleusercontent.com/translate_f 38/41
9/7/2021 Lập trình hướng đối tượng

CHƯƠNG 1 0 Lập trình hướng đối tượng

2. Xác định ba lớp khác nhau có thể chứa mỗi đối tượng sau:
a. William Shakespeare
b. Áo len đỏ yêu thích của tôi

468 c. Trường công lập 23 ở Thành phố New York


3. Thiết kế một lớp có tên TermPaper chứa tên tác giả, chủ đề của
giấy và một loại chữ cái được chỉ định. Bao gồm các phương pháp để đặt giá trị cho từng dữ liệu
và hiển thị các giá trị cho từng trường dữ liệu. Tạo sơ đồ lớp và viết
mã giả xác định lớp.
4. Thiết kế một lớp có tên là Ô tô chứa số nhận dạng của phương tiện,
chế tạo, mô hình và màu sắc của ô tô. Bao gồm các phương pháp để đặt các giá trị cho
mỗi trường dữ liệu và bao gồm một phương thức hiển thị tất cả các giá trị cho mỗi trường.
Tạo sơ đồ lớp và viết mã giả định nghĩa lớp.

5. Hoàn thành các nhiệm vụ sau:


a. Thiết kế một lớp có tên là Kiểm tra tài khoản chứa số tài khoản séc,
tên của chủ tài khoản và số dư. Bao gồm các phương pháp để đặt giá trị cho từng
trường dữ liệu và một phương pháp hiển thị tất cả thông tin tài khoản. Tạo
sơ đồ lớp và viết mã giả định nghĩa lớp.
b. Thiết kế một ứng dụng mà tuyên bố hai CheckingAccount đối tượng và bộ và
hiển thị các giá trị của chúng.
c. Thiết kế một ứng dụng khai báo một mảng số năm CheckingAccount đối tượng.
Nhắc người dùng về dữ liệu cho từng đối tượng, sau đó hiển thị tất cả các giá trị.

d. Thiết kế một ứng dụng khai báo một mảng số năm CheckingAccount đối tượng.
Nhắc người dùng về dữ liệu cho từng đối tượng, sau đó chuyển mảng cho một phương thức
xác định tổng các số dư.
6. Hoàn thành các nhiệm vụ sau:

a. Thiết kế một lớp có tên StockTransaction chứa một biểu tượng cổ phiếu (thường là
một đến bốn ký tự), tên cổ phiếu và giá mỗi cổ phiếu. Bao gồm các phương pháp để thiết lập
và nhận các giá trị cho từng trường dữ liệu. Tạo sơ đồ lớp và viết
mã giả định nghĩa lớp.
b. Thiết kế một ứng dụng khai báo hai đối tượng và bộ StockTransaction và
hiển thị các giá trị của chúng.

c. Thiết kế một ứng dụng khai báo một mảng gồm 10 đối tượng StockTransaction .
Nhắc người dùng về dữ liệu cho từng đối tượng, sau đó hiển thị tất cả các giá trị.

d. Thiết kế một ứng dụng khai báo một mảng gồm 10 đối tượng StockTransaction .
Nhắc người dùng về dữ liệu cho từng đối tượng, sau đó chuyển mảng cho một phương thức
xác định và hiển thị hai cổ phiếu có giá cao nhất và thấp nhất
mỗi chia sẻ.

Trang 43

Bài tập

https://translate.googleusercontent.com/translate_f 39/41
9/7/2021 Lập trình hướng đối tượng
7. Hoàn thành các nhiệm vụ sau:
a. Thiết kế một lớp học mang tên Pizza . Các trường dữ liệu bao gồm một trường chuỗi cho phần đầu
(chẳng hạn như pepperoni) và các trường số cho đường kính tính bằng inch (chẳng hạn như 12)
và giá (chẳng hạn như 13,99). Bao gồm các phương pháp để lấy và đặt giá trị cho từng
các lĩnh vực này. Tạo sơ đồ lớp và viết mã giả định nghĩa 469
lớp.

b. Thiết kế một ứng dụng khai báo hai đối tượng Pizza và thiết lập và hiển thị
giá trị của chúng.
c. Thiết kế một ứng dụng khai báo một mảng 10 đối tượng Pizza . Nhắc nhở
người dùng cho dữ liệu cho mỗi Pizza , sau đó hiển thị tất cả các giá trị.
d. Thiết kế một ứng dụng khai báo một mảng 10 đối tượng Pizza . Nhắc nhở
người dùng cho một lớp phủ và đường kính cho mỗi chiếc Pizza và chuyển từng đối tượng cho một
phương thức tính giá và trả về đối tượng Pizza hoàn chỉnh cho
chương trình chính. Sau đó, hiển thị tất cả các giá trị Pizza . Một chiếc bánh pizza 12 inch là $ 13,99, a
Pizza 14 inch là 16,99 đô la và bánh pizza 15 inch là 19,99 đô la. Bất kỳ kích thước đã nhập nào khác là
không hợp lệ và sẽ khiến giá được đặt thành 0.
8. Hoàn thành các nhiệm vụ sau:

a. Thiết kế một lớp có tên BaseballGame có các trường cho hai tên đội và
một số điểm cuối cùng cho mỗi đội. Bao gồm các phương pháp để đặt và nhận các giá trị cho
mỗi trường dữ liệu. Tạo sơ đồ lớp và viết mã giả
xác định lớp.

b. Thiết kế một ứng dụng khai báo ba đối tượng và bộ BaseballGame và


hiển thị các giá trị của chúng.
c. Thiết kế một ứng dụng khai báo một mảng gồm 12 đối tượng BaseballGame .
Nhắc người dùng về dữ liệu cho từng đối tượng và hiển thị tất cả các giá trị. Sau đó vượt qua
mỗi đối tượng cho một phương pháp hiển thị tên của đội chiến thắng hoặc "Tie" nếu
tỷ số là một hòa.

Thực hiện bảo trì

1. Tệp có tên MAINTENANCE10-01.txt được bao gồm trong tệp có thể tải xuống của bạn
hồ sơ sinh viên. Giả sử rằng chương trình này là một chương trình làm việc trong tổ chức của bạn
và nó cần sửa đổi như được mô tả trong các nhận xét (các dòng bắt đầu bằng
hai dấu gạch chéo) ở đầu tệp. Công việc của bạn là thay đổi chương trình để đáp ứng
các thông số kỹ thuật mới.

Trang 44

CHƯƠNG 1 0 Lập trình hướng đối tượng

Tìm lỗi

1. Các tệp sinh viên có thể tải xuống của bạn cho Chương 10 bao gồm DEBUG10-01.txt,
DEBUG10-02.txt và DEBUG10-03.txt. Mỗi tệp bắt đầu với một số nhận xét
https://translate.googleusercontent.com/translate_f 40/41
9/7/2021 Lập trình hướng đối tượng
470 mô tả vấn đề. Nhận xét là những dòng bắt đầu bằng hai dấu gạch chéo (//).
Sau các nhận xét, mỗi tệp chứa mã giả có một hoặc nhiều lỗi
bạn phải tìm và sửa lại.
2. Các tệp có thể tải xuống của bạn cho Chương 10 bao gồm một tệp có tên DEBUG10-04.jpg
chứa một sơ đồ lớp với các lỗi cú pháp và / hoặc lôgic. Kiểm tra lớp học
sơ đồ và sau đó tìm và sửa tất cả các lỗi.

Khu vực chơi game

1. a. Thẻ chơi được sử dụng trong nhiều trò chơi máy tính, bao gồm cả các phiên bản của
kinh điển như Solitaire, Hearts và Poker. Thiết kế một lớp Thẻ có chứa một chuỗi
trường dữ liệu để giữ một bộ đồ (quân bích, trái tim, kim cương hoặc câu lạc bộ) và dữ liệu số
trường cho giá trị từ 1 đến 13. Bao gồm các phương thức get và set cho mỗi trường. Viết một
ứng dụng chọn ngẫu nhiên hai thẻ chơi và hiển thị giá trị của chúng.
b. Sử dụng hai đối tượng Thẻ , thiết kế một ứng dụng phát phiên bản đơn giản của
trò chơi bài Chiến tranh. Chia hai lá bài — một cho máy tính và một cho người chơi.
Xác định thẻ cao hơn, sau đó hiển thị thông báo cho biết thẻ
bằng nhau, máy tính thắng, hoặc người chơi thắng. (Đánh bài được coi là
bằng nhau khi chúng có cùng giá trị, bất kể bộ đồ của chúng là gì.)
trò chơi, giả sử rằng quân Át (giá trị 1) thấp. Đảm bảo rằng hai lá bài được chia
không giống nhau Thẻ . Ví dụ: một bộ bài không thể chứa nhiều hơn một
Queen of Spades.

Lên cho cuộc thảo luận

1. Trong chương này, bạn đã biết rằng dữ liệu cá thể và phương thức thuộc về các đối tượng, nhưng
rằng dữ liệu tĩnh và các phương thức thuộc về một lớp nói chung. Xem xét cuộc sống thực
lớp có tên StateInTheUnitedStates . Đặt tên cho một số thuộc tính ngoài đời thực của lớp này
đó là các thuộc tính tĩnh và thuộc tính cá thể. Tạo một ví dụ khác về một thực-
life class và thảo luận về các thành viên static và instance của nó có thể là gì.
2. Một số lập trình viên sử dụng một quy ước gọi là ký hiệu Hungary khi đặt tên
các biến và các trường lớp của chúng. Ký hiệu Hungary là gì và tại sao nhiều ký hiệu
các lập trình viên hướng đối tượng cảm thấy nó không phải là một quy ước có giá trị để sử dụng?

https://translate.googleusercontent.com/translate_f 41/41

You might also like