Professional Documents
Culture Documents
Bai 1-Mot So Khai Niem Co Ban
Bai 1-Mot So Khai Niem Co Ban
Bai 1-Mot So Khai Niem Co Ban
Mục tiêu:
Trong bài này, Anh/Chị cần đạt được những mục tiêu sau:
1. Đối tượng và các thành phần liên quan.
2. Các đặc trưng: đóng gói, che giấu, kế thừa, đa hình.
3. Giới thiệu các ngôn ngữ lập trình hướng đối tượng.
Nội dung:
cho bài toán, từ đó áp dụng phương pháp phân tích và thiết kế từ dưới lên (“bottom-
up”). Trong tài liệu này không đi sâu trình bày về phương pháp phân tích và thiết
hướng đối tượng, chúng ta sẽ làm quen với phương pháp thông qua ví dụ minh họa
so sánh giữa phương pháp dựa trên chức năng và phương pháp dựa trên đối tượng
như sau.
Để minh họa, chúng ta xem xét bài toán quản lý sinh viên chẳng hạn.
2. Các khái niệm, đặc trưng của lập trình hướng đối tượng
2.1. Các khái niệm cơ bản trong lập trình hướng đối tượng
- Đối tượng (objects): là các thể hiện trên bộ nhớ của một gói gồm các biến và
hàm trong chương trình phần mềm. Trong thực tế khái niệm này rất rộng, nó ám chỉ
đến mọi sự vật, hiện tượng của thế giới thực. Tuy nhiên, khái niệm đối tượng trong
lập trình (hay còn gọi là đối tượng phần mềm – software objects) sẽ hạn hẹp hơn
nhiều, chủ yếu đề cập đến khía cạnh thông tin của các đối tượng. Do đó, chúng ta sẽ
có các đối tượng trong không gian thực của bài toán, tương ứng là các đối tượng
trong không gian của chương trình.
Ví dụ về các đối tượng như các sinh viên, giáo viên, môn học, lớp học, hay đối
tượng là những chiếc xe máy, xe ô-tô, thậm chí là các bánh xe, cánh quạt,...
Chúng ta có thể phân loại gồm đối tượng vô hình và hữu hình. Trong ví dụ trên
thì môn học, lớp học là các đối tượng vô hình, còn sinh viên, giáo viên,… là các đối
tượng hữu hình.
- Thuộc tính (properties): là các thành phần (dưới dạng các biến - variables)
trong đối tượng để mô tả thông tin dữ liệu hay trạng thái (states) của đối tượng
(Hình vẽ 1.2). Ví dụ các đối tượng sinh viên có thuộc tính là họ và tên, ngày-tháng-
năm sinh, quê quán,... hay các đối tượng môn học có tên môn học, số tín chỉ, điều
kiện tiên quyết,...
- Phương thức (methods): là các thành phần (dưới dạng các hàm) trong đối
tượng để mô tả hành vi (behavior) hay khả năng xử lý của đối tượng (Hình vẽ 1.2).
Các phương thức khi thực hiện sẽ xử lý trên các thuộc tính và có thể sẽ làm biến đối
trạng thái của đối tượng, tức làm thay đổi giá trị trong các thuộc tính. Ví dụ các đối
tượng xe ô-tô có phương thức khởi động máy, tăng/giảm ga, chuyển số,... hay các
đối tượng sinh viên có phương thức nhận bài kiểm tra, làm bài kiểm tra, tham dự
buổi học...
Hình vẽ 1.2: Đối tượng và các thành phần của đối tượng.
- Thông điệp (messages): Chúng ta thấy rằng, các đối tượng phần mềm sẽ quan
hệ và tương tác với nhau nhằm để thực hiện mục tiêu của bài toán đặt ra. Khi một
đối tượng A muốn một đối tượng B thực hiện một phương thức trên B, thì đối tượng
A phải gửi một thông điệp tương ứng đến đối tượng B. Thực chất ở đây là việc đối
tượng A gọi thực hiện một phương thức trên đối tượng B. Hình vẽ 1.3 sau minh họa
cho thông điệp F(x) được gọi bởi đối tượng A đến đối tượng B.
để thực hiện yêu cầu đặt ra của bài toán. Vì thế, các kết quả đóng gói từ các biến và
các hàm để hình thành các lớp đối tượng sẽ đem lại hiệu quả thực hiện chương trình
tốt hơn. Mục tiêu đặt ra là đóng gói sao cho phản ánh được nội dung thông tin và
hành vi xử lý thông tin của các lớp đối tượng mà chương trình cần có.
Hình vẽ 1.6: Đóng gói nhằm che đi những chi tiết phức tạp bên trong
- Tính che giấu thông tin (data-hiding): các thành phần sau khi được đóng gói
chúng ta có thể thiết lập cơ chế về khả năng truy xuất xử lý đến các thành phần đó
hay được gọi là phạm vi tác động (scope). Rõ ràng, tính chất này có được là nhờ sự
đóng gói (Hình vẽ 1.8).
Hình vẽ 1.9: Minh họa sự kế thừa giữa các lớp đối tượng
Trong Hình vẽ 1.9, đối tượng “oHuman” và “oPet” đều kế thừa các đặc điểm từ
“oAnimal” tức chúng đều có não bộ (brain = true) và đều có chân, nhưng số chân
giữa “oHuman” và “oPet” khác nhau, tương tự giữa “oDog” và “oCat” với “oPet”.
- Tính đa hình (polymorphism): là một khái niệm khá phức tạp trong lập trình
hướng đối tượng, nó cho phép nhiều đối tượng xử lý, phản hồi cho cùng một thông
điệp. Một khía cạnh khác, đa hình tức là cùng một đối nhưng được khai thác, xử lý
dưới nhiều hình thức khác nhau. Tính đa hình được gắn liền với ngữ cảnh trong
chương trình, mỗi ngữ cảnh sẽ cho ra một hình thức khai thác, xử lý cụ thể phù hợp.
Chẳng hạn, Hình vẽ 1.9 cho thấy một con mèo có thể xem như là một vật nuôi, hoặc
một động vật, phụ thuộc vào ngữ cảnh khai thác.
Bốn tính chất của phương pháp lập trình hướng đối tượng là những tính chất
rất đặc trưng, các vấn đề về kỹ thuật và phương pháp sử dụng, khai thác những
tính chất này sẽ được trình bày kỹ ở những chương tiếp theo. Phần sau chúng
ta xem xét về ngôn ngữ lập trình hướng đối tượng.
Về cơ bản, một ngôn ngữ lập trình được gọi là hướng đối tượng nếu nó cung
cấp đủ 4 đặc trưng đã xem xét ở trên: tính đóng gói, tính che dấu thông tin, tính kế
thừa và tính đa hình.
Ngôn ngữ lập trình hướng đối tượng được phát triển cùng với sự hình thành và
phát triển của phương pháp lập trình hướng đối tượng (Hình vẽ 1.10). Phương pháp
này được khởi xướng vào những năm 1960 tại Na-uy, sau đó được các nhà nghiên
cứu, ứng dụng phát triển rất mạnh mẽ. Có thể xem ngôn ngữ Simula của Christian
Nygaard và cộng sự tại đại học Oslo là ngôn ngữ đầu tiên hỗ trợ hướng đối tượng.
Sau đó những năm 1970 và 1980 tiếp theo là sự phát triển các ngôn ngữ Smalltalk,
Eiffel và C++.
Ngôn ngữ Java được xây dựng và phát triển bởi James Gosling và cộng sự tại
hãng Sun Microsystems, nó trở nên phổ biến vào cuối những năm 1990. Khác với
C++ có sự kết hợp của cả lập trình cấu trúc và hướng đối tượng, Java là ngôn ngữ
thuần hướng đối tượng, tức mọi thành phần của chương trình đều phải được đóng
gói thành các lớp đối tượng, mọi hành động (actions) đều được thực hiện trên các
đối tượng và các lớp. Đặc điểm thứ hai của Java khác C++ đó là các đối tượng
không cần đến việc giải phóng bộ nhớ sau khi khai thác xử lý xong của người lập
trình do cơ chế tự động “thu gom rác” (garbage collection) được cung cấp sẵn bởi
Java, điều này giống với 2 ngôn ngữ Smalltalk và Eiffel.
Si Smal C J C
mula ltalk ++ ava #
1 1 1 1 2 2
960 970 980 990 000 010
Hình vẽ 1.10: Lịch sử phát triển các ngôn ngữ hướng đối tượng
Trong khuôn khổ tài liệu này, chúng ta tập trung khai thác sử dụng ngôn ngữ
Java để thể hiện cho các vấn đề của phương pháp lập trình hướng đối tượng. Các
phần tiếp sau sẽ trình bày cụ thể hơn về ngôn ngữ lập trình Java.
3.2. Ngôn ngữ lập trình Java
Java là ngôn ngữ lập trình được sử dụng khá phổ biến hiện nay, nó không chỉ
được dùng để phát các ứng dụng cho máy tính mà còn sử dụng để phát triển các ứng
dụng cho các thiết bị di động như điện thoại di động, điện thoại thông minh,... đặc
biệt là lập trình trên hệ điều hành Android.
Một số đặc điểm của ngôn ngữ Java:
- Cấu trúc cú pháp lệnh của ngôn ngữ hầu hết kế thừa từ C/C++ nên dễ tiếp cận
nếu đã biết ngôn ngữ C/C++, mềm dẻo và linh hoạt trong sử dụng nhưng cũng rất
chặt chẽ về cú pháp.
- Là ngôn ngữ lập trình thuần hướng đối tượng như đã đề cập ở trên.
- Java áp dụng cơ chế bộ nhớ động cho mọi đối tượng trong chương trình. Do
đó, một khai báo biến bất kỳ có kiểu lớp đều dưới dạng tham chiếu (con trỏ), tức là
một biến chứa địa chỉ của đối tượng.
Về phía hệ thống, các đối tượng khi tạo sẽ được cấp phát bộ nhớ trên vùng heap
(trên RAM), do đó mỗi đối tượng có một địa chỉ tương ứng. Để truy cập xử lý các
đối tượng này chúng ta phải khai báo các biến tham chiếu để lưu giữ địa chỉ của đối
tượng (Hình vẽ 1.11).
Hình vẽ 1.12: Sự độc lập với hệ nền của chương trình Java
Với đặc điểm này, giới lập trình Java thường sử dụng khẩu hiệu thể hiện là
“write one, run anywhere” để ám chỉ rằng chương trình Java được viết một lần và
chạy ở khắp mọi nơi.
Sự độc lập này được thực hiện nhờ cơ chế máy ảo (Java Virtual Machine -
JVM) để thực hiện chương trình. JVM là một hệ thống phần mềm được xây dựng
và đóng gói sẵn, sau đó cài đặt trên các thiết bị, máy tính với chức năng dùng để
thông dịch các câu lệnh của chương trình Java khi thực hiện. Quá trình lập trình,
biên dịch và chạy chương trình Java được thể hiện qua sơ đồ sau.
Hình vẽ 1.13: Quá trình biên dịch và chạy chương trình Java
Trong đó, chương trình Java được lập trình và lưu bằng tệp tin mã nguồn phần
mở rộng *.java (gọi là Java Source). Sau khi biên dịch (compiler) sẽ tạo thành
chương trình mã byte (Java Bytecodes) và lưu trữ thành tệp tin có phần mở rộng
*.class, phân phối đến các máy ứng dụng. Việc chạy chương trình Java trên một hệ
nền nào đó sẽ nhờ máy ảo (Java Virtual Machine) thông dịch các lệnh mã byte về
mã máy để thực thi.
3.3. Lập trình bằng ngôn ngữ Java
Để lập trình bằng Java, trước hết chúng ta phải cài đặt phần mềm phát triển ứng
dụng có tên là JDK (Java Development Kit) được cung cấp miễn phí tại địa chỉ
“http:// www.oracle.com/ technetwork/ java/ javase/ downloads/ index.html”. Sau
khi cài đặt thường có thư mục “Java” với hai thư mục con là “jdk<số hiệu phiên
bản>” chứa trình biên dịch và “jre<phiên bản>” chứa hệ thống thư viện và máy ảo
Java.
Java được cung cấp khá nhiều môi trường phần mềm để lập trình như JCreator,
Eclipse, NetBean... song để thuận tiện trong tài liệu chúng ta sẽ thực hiện trên môi
trường Eclipse, đây là phần mềm miễn phí và thuận tiện, chỉ cần copy vào máy để
chạy, không cần cài đặt hay cấu hình phức tạp (giao diện có dạng sau).
javac tên_tệp_chương_trình.java
Lệnh để chạy thử chương trình là:
java tệp_chương_trình
Quy tắc chung của một tệp chương trình bằng Java gồm các phần sau:
import tên_thư_viện1;
import tên_thư_viện2;
...
//các_nội_dung_của_lớp_chương_trình
//nội_dung_chương_trình_chính
Ví dụ một chương trình Java đơn giản (có tên tệp là “vidu.java”):
Kết quả dịch và chạy thử chương trình trên Eclipse (cửa sổ màn hình “Console”
để chứa kết quả chạy và các thông báo khi chạy chương trình) là:
Một số quy tắc/quy ước cần ghi nhớ khi lập trình Java:
- Sử dụng toán tử “new” để sinh đối tượng từ lớp cho việc sử dụng, khai thác và
xử lý, cụ thể: biến = new tên_lớp( tham_số_nếu_có );
- Các từ khóa lệnh viết thường, ví dụ: import, for, if, while, case, return, break,
continue...;
- Các tên lớp đối tượng viết dạng chuẩn (chữ cái đầu từ viết HOA, sau đó chữ
thường, các từ ghép thành tên hoặc viết tắt cũng theo quy ước này), ví dụ: Scanner,
System, JButton, JOptionPane...;
- Các tên hằng được viết chữ hoa, ví dụ: EXIT_ON_CLOSE, PI,
CLOSE_OPTION, QUESTION_MESSAGE...;
- Các tên biến (thuộc tính) viết chữ thường;
- Các tên hàm (phương thức) viết từ đầu (động từ) bằng chữ thường, các từ sau
đó theo dạng chuẩn, ví dụ: print, showMessageDialog, setText...
- Các lệnh không đứng độc lập, bắt buộc một lệnh cần thực hiện phải trên một
đối tượng hoặc trên một lớp nào đó, và thậm chí có thể trên nhiều lớp và đối tượng
khi chúng bao nhau. Quy tắc chung được viết theo kiểu phân cấp (dùng dấu chấm)
như sau:
cấp_1.cấp_2...cấp_n.lệnh_cần_gọi( tham_số );
trong đó cấp_i là thể hiện của một gói (package) hay một lớp (class) hay một
đối tượng (object).
Ví dụ: Lệnh sau để tính căn bậc hai của 2012 gán vào biến y
double y = Math.sqrt(2012);
hoặc lệnh sau sẽ in một dòng chữ lên màn hình,