Giáo trình môn Lập trình hướng đối tượng

Lập trình hướng đối tượng đề cập đến dữ liệu và thủ tục xử lý dữ liệu theo

quan điểm là một đối tượng duy nhất. Lập trình hướng đối tượng xem xét dữ

liệu như là một thực thể hay là một đơn vị độc lập, với bản chất riêng và

những đặc tính của thực thể ấy. Bây giờ chúng ta hãy khảo sát những thuật

ngữ ‘đối tượng’ (object), ‘dữ liệu’ (data) và ‘phương thức’ (method).

Có nhiều loại đối tượng khác nhau. Chúng ta có thể xem các bộ phận khác

nhau trong một cơ quan là các đối tượng. Điển hình là một cơ quan có những

bộ phận liên quan đến việc quản trị, đến việc kinh doanh, đến việc kế toán,

đến việc tiếp thị Mỗi bộ phận có nhân sự riêng, các nhân sự được giao cho

những trách nhiệm rõ ràng. Mỗi bộ phận cũng có những dữ liệu riêng chẳng

hạn như thông tin cá nhân, bảng kiểm kê, những thể thức kinh doanh, hoặc

bất kỳ dữ liệu nào liên quan đến chức năng của bộ phận đó. Rõ ràng là một

cơ quan được chia thành nhiều bộ phận thì việc quản trị nhân sự và những

hoạt động doanh nghiệp dễ dàng hơn. Nhân sự của cơ quan điều khiển và xử

lý dữ liệu liên quan đến bộ phận của mình.

Chẳng hạn như bộ phận kế toán chịu trách nhiệm về lương bổng đối với cơ

quan. Nếu một người ở đơn vị tiếp thị cần những chi tiết liên quan đến lương

bổng của đơn vị mình, người ấy chỉ cần liên hệ với bộ phận kế toán. Một

người có thẩm quyền trong bộ phận kế toán sẽ cung cấp thông tin cần biết,

nếu như thông tin ấy có thể chia sẻ được. Một người không có thẩm quyền từ

một bộ phận khác thì không thể truy cập dữ liệu, hoặc không thể thay đổi

làm hư hỏng dữ liệu. Ví dụ này minh chứng rằng các đối tượng là hữu dụng

trong việc phân cấp và tổ chức dữ liệu

pdf 164 trang kimcuc 5080
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình môn Lập trình hướng đối tượng", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Giáo trình môn Lập trình hướng đối tượng

Giáo trình môn Lập trình hướng đối tượng
Chương 1: Lập Trình Hướng Đối Tượng 1 
Chương 1 
LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG 
Mục tiêu 
Kết thúc chương, học viên có thể: 
 Định nghĩa Lập trình hướng Đối tượng (Object-oriented Programming). 
 Nhận thức về Trừu tượng hóa Dữ liệu (Data Abstraction). 
 Định nghĩa một Lớp (Class). 
 Định nghĩa một Đối tượng (Object). 
 Nhận thức được sự khác biệt giữa Lớp và Đối tượng. 
 Nhận thức được sự cần thiết đối với phương thức Thiết lập 
(Construction) và Hủy (Destruction). 
 Định nghĩa tính Bền vững (Persistence). 
 Định nghĩa về tính đóng gói dữ liệu (Data Encapsulation) 
 Hiểu biết về tính Thừa kế (Inheritance). 
 Định nghĩa tính Đa hình (Polymorphism). 
 Liệt kê những ưu điểm của phương pháp hướng Đối tượng. 
1.1 Giới thiệu về Lập trình hướng Đối tượng (Object-oriented 
Programming) 
Lập trình hướng Đối tượng (OOP) là một phương pháp thiết kế và phát triển 
phần mềm. Những ngôn ngữ OOP không chỉ bao gồm cú pháp và một trình 
biên dịch (compiler) mà còn có một môi trường phát triển toàn diện. Môi 
trường này bao gồm một thư viện được thiết kế tốt, thuận lợi cho việc sử 
dụng các đối tượng. 
Đối với một ngôn ngữ lập trình hỗ trợ OOP thì việc triển khai kỹ thuật lập 
trình hướng đối tượng sẽ dễ dàng hơn. Kỹ thuật lập trình hướng đối tượng 
cải tiến việc phát triển các hệ thống phần mềm. Kỹ thuật ấy đề cao nhân tố 
chức năng (functionality) và các mối quan hệ dữ liệu. 
OOP là phương thức tư duy mới để giải quyết vấn đề bằng máy tính. Để đạt 
kết quả, lập trình viên phải nắm vấn đề thành một thực thể quen thuộc với 
máy tính. Cách tiếp cận hướng đối tượng cung cấp một giải pháp toàn vẹn để 
giải quyết vấn đề. 
Hãy xem xét một tình huống cần được triển khai thành một hệ thống trên 
máy vi tính: việc mua bán xe hơi. Vấn đề vi tính hóa việc mua bán xe hơi bao 
gồm những gì? 
Những yếu tố rõ ràng nhất liên quan đến việc mua bán xe hơi là: 
1) Các kiểu xe hơi (model). 
2) Nhân viên bán hàng. 
2 Core Java 
3) Khách hàng. 
Những hoạt động liên quan đến việc mua bán: 
1) Nhân viên bán hàng đưa khách hàng tham quan phòng trưng bày. 
2) Khách hàng chọn lựa một xe hơi. 
3) Khách hàng đặt hóa đơn. 
4) Khách hàng trả tiền. 
5) Chiếc xe được trao cho khách hàng. 
Mỗi vấn đề được chia ra thành nhiều yếu tố, được gọi là các Đối tượng 
(Objects) hoặc các Thực thể (Entities). Chẳng hạn như ở ví dụ trên, khách 
hàng, xe hơi và nhân viên bán hàng là những đối tượng hoặc thực thể. 
Lập trình viên luôn luôn cố gắng tạo ra những kịch bản (scenarios) thật quen 
thuộc với những tình huống thực tiễn. Bước thứ nhất trong phương pháp này 
là làm cho máy tính liên kết với những đối tượng thế giới thực. 
Tuy nhiên, máy tính chỉ là một cỗ máy. Nó chỉ thực hiện những công việc 
được lập trình mà thôi. Vì thế, trách nhiệm của lập trình viên là cung cấp cho 
máy tính những thông tin theo cách thức mà nó cũng nhận thức được cùng 
những thực thể như chúng ta nhận thức. 
Đó chính là vai trò của kỹ thuật hướng đối tượng. Chúng ta sử dụng kỹ thuật 
hướng đối tượng để ánh xạ những thực thể chúng ta gặp phải trong đời sống 
thực thành những thực thể tương tự trong máy tính. 
Phát triển phần mềm theo kỹ thuật lập trình hướng đối tượng có khả năng 
giảm thiểu sự lẫn lộn thường xảy ra giữa hệ thống và lĩnh vực ứng dụng. 
Lập trình hướng đối tượng đề cập đến dữ liệu và thủ tục xử lý dữ liệu theo 
quan điểm là một đối tượng duy nhất. Lập trình hướng đối tượng xem xét dữ 
liệu như là một thực thể hay là một đơn vị độc lập, với bản chất riêng và 
những đặc tính của thực thể ấy. Bây giờ chúng ta hãy khảo sát những thuật 
ngữ ‘đối tượng’ (object), ‘dữ liệu’ (data) và ‘phương thức’ (method). 
Có nhiều loại đối tượng khác nhau. Chúng ta có thể xem các bộ phận khác 
nhau trong một cơ quan là các đối tượng. Điển hình là một cơ quan có những 
bộ phận liên quan đến việc quản trị, đến việc kinh doanh, đến việc kế toán, 
đến việc tiếp thị  Mỗi bộ phận có nhân sự riêng, các nhân sự được giao cho 
những trách nhiệm rõ ràng. Mỗi bộ phận cũng có những dữ liệu riêng chẳng 
hạn như thông tin cá nhân, bảng kiểm kê, những thể thức kinh doanh, hoặc 
bất kỳ dữ liệu nào liên quan đến chức năng của bộ phận đó. Rõ ràng là một 
cơ quan được chia thành nhiều bộ phận thì việc quản trị nhân sự và những 
hoạt động doanh nghiệp dễ dàng hơn. Nhân sự của cơ quan điều khiển và xử 
lý dữ liệu liên quan đến bộ phận của mình. 
Chẳng hạn như bộ phận kế toán chịu trách nhiệm về lương bổng đối với cơ 
quan. Nếu một người ở đơn vị tiếp thị cần những chi tiết liên quan đến lương 
Chương 1: Lập Trình Hướng Đối Tượng 3 
bổng của đơn vị mình, người ấy chỉ cần liên hệ với bộ phận kế toán. Một 
người có thẩm quyền trong bộ phận kế toán sẽ cung cấp thông tin cần biết, 
nếu như thông tin ấy có thể chia sẻ được. Một người không có thẩm quyền từ 
một bộ phận khác thì không thể truy cập dữ liệu, hoặc không thể thay đổi 
làm hư hỏng dữ liệu. Ví dụ này minh chứng rằng các đối tượng là hữu dụng 
trong việc phân cấp và tổ chức dữ liệu. 
Hình 1.1 Minh họa cấu trúc của một cơ quan điển hình. 
Hình 1.1 
Khái niệm về đối tượng có thể được mở rộng đến hầu hết các lãnh vực đời 
sống, và hơn nữa, đến thế giới lập trình. Bất kỳ ứng dụng nào đều có thể 
được định nghĩa theo thuật ngữ thực thể hoặc đối tượng để tạo ra tiến trình 
xử lý mô phỏng theo tiến trình xử lý mà con người nghĩ ra. 
Phương pháp giải quyết ‘top-down’ (từ trên xuống) cũng còn được gọi là 
‘lập trình hướng cấu trúc’ (structured programming). Nó xác định những chức 
năng chính của một chương trình và những chức năng này được phân thành 
những đơn vị nhỏ hơn cho đến mức độ thấp nhất. Bằng kỹ thuật này, các 
chương trình được cấu trúc theo hệ thống phân cấp các module. Mỗi một 
module có một đầu vào riêng và một đầu ra riêng. Trong mỗi module, sự 
điều khiển có chiều hướng đi xuống theo cấu trúc chứ không có chiều hướng 
đi lên. 
Phương pháp OOP cố gắng quản lý việc thừa kế phức tạp trong những vấn 
đề thực tế. Để làm được việc này, phương pháp OOP che giấu một vài thông 
tin bên trong các đối tượng. OOP tập trung trước hết trên dữ liệu. Rồi gắn kết 
các phương thức thao tác trên dữ liệu, việc này được xem như là phần thừa 
kế của việc định nghĩa dữ liệu. Bảng 1.1 minh họa sự khác biệt giữa hai 
phương pháp: 
Phương pháp Top-Down OOP 
Chúng ta sẽ xây dựng một khách 
sạn. 
Chúng ta sẽ xây dựng một tòa nhà 10 
tầng với những dãy phòng trung bình, 
sang trọng, và một phòng họp lớn. 
Chúng ta sẽ thiết kế các tầng lầu, 
các phòng và phòng họp. 
Chúng ta sẽ xây dựng một khách sạn với 
những thành phần trên. 
Bảng 1.1 Một ví dụ về hai phương pháp giải quyết OOP và Structured 
Phòng Nhân 
sự 
Phòng Kế toán 
Phòng Kinh 
doanh 
4 Core Java 
1.2 Trừu tượng hóa dữ liệu (Data Abstraction) 
Khi một lập trình viên phải phát triển một chương trình ứng dụng thì không 
có nghĩa là người ấy lập tức viết mã cho ứng dụng ấy. Trước hết, người ấy 
phải nghiên cứu ứng dụng và xác định những thành phần tạo nên ứng dụng. 
Kế tiếp, người ấy phải xác định những thông tin cần thiết về mỗi thành phần. 
Hãy khảo sát chương trình ứng dụng cho việc mua bán xe hơi nói trên. 
Chương trình phải xuất hóa đơn cho những xe hơi đã bán cho khách hàng. Để 
xuất một hóa đơn, chúng ta cần những thông tin chi tiết về khách hàng. Vậy 
bước thứ nhất là xác định những đặc tính của khách hàng. 
Một vài đặc tính gắn kết với khách hàng là: 
 Tên. 
 Địa chỉ. 
 Tuổi. 
 Chiều cao. 
 Màu tóc. 
Từ danh sách kể trên, chúng ta xác định những đặc tính thiết yếu đối với ứng 
dụng. Bởi vì chúng ta đang đề cập đến những khách hàng mua xe, vì thế 
những chi tiết thiết yếu là: 
 Tên. 
 Địa chỉ. 
Còn những chi tiết khác (chiều cao, màu tóc ) là không quan trọng đối với 
ứng dụng. Tuy nhiên, nếu chúng ta phát triển một ứng dụng hỗ trợ cho việc 
điều tra tội phạm thì những thông tin chẳng hạn như màu tóc là thiết yếu. 
Bên cạnh những chi tiết về khách hàng, những thông tin sau cũng cần thiết: 
 Kiểu xe được bán. 
 Nhân viên nào bán xe. 
Bên cạnh những đặc tính của khách hàng, xe hơi và nhân viên bán hàng, 
chúng ta cũng cần liệt kê những hành động được thực hiện. 
Công việc xuất hóa đơn đòi hỏi những hành động sau: 
 Nhập tên của khách hàng. 
 Nhập địa chỉ của khách hàng. 
 Nhập kiểu xe. 
 Nhập tên của nhân viên bán xe. 
 Xuất hóa đơn với định dạng đòi hỏi. 
Khung thông tin bên dưới cho thấy những thuộc tính và những hành động 
Chương 1: Lập Trình Hướng Đối Tượng 5 
liên quan đến một hóa đơn: 
Các thuộc tính 
Tên của khách hàng 
Địa chỉ của khách hàng 
Kiểu xe bán 
Nhân viên bán xe 
Các hành động 
Nhập tên 
Nhập địa chỉ 
Nhập kiểu xe 
Nhập tên nhân viên bán 
xe 
Xuất hóa đơn 
Định nghĩa 
Sự trừu tượng hóa dữ liệu là quá trình xác định và nhóm các thuộc tính và 
các hành động liên quan đến một thực thể cụ thể, xét trong mối tương quan 
với ứng dụng đang phát triển. 
Tiếp theo, chúng ta muốn ứng dụng tính toán tiền hoa hồng cho nhân viên 
bán hàng. 
Những thuộc tính liên kết với nhân viên bán hàng có tương quan với ứng 
dụng này là: 
 Tên. 
 Số lượng xe bán được. 
 Tiền hoa hồng. 
Những hành động đòi buộc đối với công việc này là: 
 Nhập tên nhân viên bán xe. 
 Nhập số lượng xe bán được. 
 Tính tiền hoa hồng kiếm được. 
Những thuộc tính 
Tên 
Số lượng xe bán được 
Tiền hoa hồng 
Những hành động 
Nhập tên 
Nhập số lượng xe bán được 
Tính tiền hoa hồng 
6 Core Java 
Như thế, việc trừu tượng hóa dữ liệu tra đặt ra câu hỏi ‘Đâu là những thuộc 
tính và những hành động cần thiết cho một vấn đề đặt ra?’ 
1.2.1 Những ưu điểm của việc Trừu tượng hóa 
Những ưu điểm của việc Trừu tượng hóa là: 
 Tập trung vào vấn đề. 
 Xác định những đặc tính thiết yếu và những hành động cần thiết. 
 Giảm thiểu những chi tiết không cần thiết. 
Việc trừu tượng hóa dữ liệu là cần thiết, bởi vì không thể mô phỏng tất cả các 
hành động và các thuộc tính của một thực thể. Vấn đề mấu chốt là tập trung 
đến những hành vi cốt yếu và áp dụng chúng trong ứng dụng. 
Chẳng hạn như khách hàng hoặc nhân viên bán hàng cũng có thể thực hiện 
những hành động sau: 
 Người ấy đi lại. 
 Người ấy nói chuyện. 
Tuy nhiên, những hành động này không liên quan đến ứng dụng. Việc trừu 
tượng hóa dữ liệu sẽ loại bỏ chúng. 
1.3 Lớp (Class) 
Trong ứng dụng mua bán xe, chúng ta đã xác định các thuộc tính và các 
hành động cần có để xuất một hóa đơn cho một khách hàng. 
Các hành động và các thuộc tính này là chung cho mọi khách hàng mua xe. 
Ví thể, chúng có thể được nhóm lại trong một thực thể đơn nhất gọi là một 
‘lớp’. 
Hãy khảo sát lớp có tên là ‘khách hàng’ dưới đây. Lớp này bao gồm mọi 
thuộc tính và hành động đòi hỏi đối với một khách hàng. 
Lớp Khách hàng 
Tên khách hàng 
Địa chỉ khách hàng 
Kiểu xe được bán 
Nhân viên bán xe 
Nhập tên 
Nhập địa chỉ 
Nhập kiểu xe được bán 
Nhập tên nhân viên bán xe 
Xuất hóa đơn 
Chương 1: Lập Trình Hướng Đối Tượng 7 
Định nghĩa 
Một lớp định nghĩa một thực thể theo những thuộc tính và những hành động 
chung. Hoặc 
Những thuộc tính và những hành động chung của một thực thể được nhóm 
lại để tạo nên một đơn vị duy nhất gọi là một lớp. Hoặc 
Một lớp là một sự xác định cấp chủng loại của các thực thể giống nhau. 
Một lớp là một mô hình khái niệm về một thực thể. Nó mang tính cách tổng 
quát chứ không mang tính cách đặc thù. 
Khi định nghĩa một lớp, chúng ta muốn phát biểu rằng một lớp sẽ phải có 
một tập hợp các thuộc tính và các hành động riêng. Chẳng hạn như một định 
nghĩa lớp dưới đây: 
Lớp Con người 
Tên 
Chiều cao 
Màu tóc 
Viết 
Nói 
Lớp này định nghĩa thực thể ‘Con người’. Mọi thực thể thuộc kiểu ‘Con người’ 
sẽ đều có những đặc tính và những hành động như đã được định nghĩa. 
Một khi một lớp đã được định nghĩa, chúng ta biết được những thuộc tính và 
những hành động của những thực thể ‘trông giống’ như lớp này. Vì thế, tự 
bản chất một lớp là một nguyên mẫu (prototype). 
Một ví dụ khác về một lớp liên quan đến việc mua bán xe hơi như sau: 
Lớp Nhân viên bán hàng 
Tên 
Số lượng xe bán được 
Tiền hoa hồng 
Nhập tên 
Nhập số lượng xe bán được 
Tính tiền hoa hồng 
Lớp trên định nghĩa các thuộc tính và các hành động đặc trưng cho mọi nhân 
viên bán xe hơi. 
1.4 Đối tượng (Object) 
Một lớp là một nguyên mẫu phác họa những thuộc tính và những hành động 
có thể của một thực thể. Để có thể sử dụng thực thể mà lớp định nghĩa, 
chúng ta phải tạo một ‘đối tượng’ từ lớp đó. 
8 Core Java 
Lớp là một khái niệm, còn đối tượng là một thể hiện được định nghĩa bởi 
lớp. 
Hãy khảo sát lớp ‘Khách hàng’ được định nghĩa trên. Lớp này định nghĩa 
mọi thuộc tính và hành động gắn liền với một khách hàng. 
Khi một người mua một xe hơi ở một cửa hàng, cửa hàng ấy có một khách 
hàng mới. Vào thời điểm ấy, một đối tượng giống như lớp ‘Khách hàng’ được 
tạo ra. Đối tượng này sẽ phải có những giá trị thực đối với các thuộc tính 
‘Tên’, ‘Địa chỉ’, ‘Kiểu xe’  
Chẳng hạn như một khách hàng có tên là ‘Mark’, sống ở ‘London’ đã mua 
một xe kiểu ‘Honda Civic’ từ nhân viên bán hàng tên là ‘Tom’. Như thế, ‘Mark’ 
là một đối tượng của kiểu ‘Khách hàng’. 
Định nghĩa: Một đối tượng là một trường hợp của một lớp. 
Một đối tượng là một thực thể cụ thể (thông thường bạn có thể sờ chạm, xem 
thấy và cảm nhận). 
Kể từ lúc một đối tượng hiện hữu, những thuộc tính của nó là những giá trị 
xác định, và những hành động được định nghĩa cho đối tượng này được thực 
thi. 
Trong mỗi một đối tượng, các khía cạnh sau đây được xác định rõ: 
 Tình trạng (state). 
 Thái độ (behavior). 
 Chân tính (identity). 
Hình 1.2 trình bày hai đối tượng. 
Mỗi đối tượng có những đặc tính riêng mô tả đối tượng ấy là gì, hoặc hành 
động ra sao. 
Chẳng hạn như những thuộc tính của một đối tượng ‘Con người’ sẽ là: 
Con người 
Tên: Jack 
Tuổi: 28 
Trọng lượng: 65 
kgs 
Hành động: 
Đi 
Nói 
Suy nghĩ 
Xe hơi 
Kiểu: Ferrari 
Màu: Đỏ 
Năm: 1995 
Hành động: 
Khởi động 
Ngưng 
Chuyển động 
Hình 1.2: Một đối tượng Con người và một đối tượng Xe hơi 
Chương 1: Lập Trình Hướng Đối Tượng 9 
 Tên. 
 Tuổi. 
 Trọng lượng. 
Những thuộc tính của một đối tượng ‘Xe hơi’ sẽ là: 
 Màu sắc. 
 Kiểu xe. 
 Năm. 
Một đối tượng cũng thực hiện một số hành động. Một xe hơi có khả năng 
thực hiện những hành động sau: 
 Khởi động. 
 Ngưng. 
 Chuyển động. 
Để chuyển đổi giữa các đối tượng lập trình và các đối tượng đời thực, cần 
phải kết hợp các thuộc tính và các hành động của một đối tượng. 
1.4.1 Thuộc tính 
Chúng ta xác định các thuộc tính và các hành động để định nghĩa một lớp. 
Một khi các thuộc tính được gán cho các giá trị, chúng mô tả một đối tượng. 
Hãy khảo sát lớp sau: 
Các thuộc tính của lớp Khách 
hàng 
Tên của khách hàng 
Địa chỉ của khách hàng 
Kiểu xe được bán 
Nhân viên đã bán xe 
Khi thuộc tính ‘Tên’ được gán cho giá trị ‘Mark’ thì nó mô tả một đối tượng 
xác định được tạo từ lớp ‘Khách hàng’. 
Định nghĩa 
Một thuộc tính là một đặc tính mô tả một đối tượng. 
Như thế, các thuộc tính nắm giữ các giá trị dữ liệu trong một đối tượng, 
chúng định nghĩa một đối tượng cụ thể. 
Bởi vì một lớp là một nguyên mẫu cho nên các thuộc tính trong một lớp 
không thể nắm giữ các giá trị. Một thuộc tính có thể được gán một giá trị chỉ 
sau khi một đối tượng dựa trên ... Bảng 10.1 Công cụ jar 
Một file chứng thực chứa thông về các file lưu trữ. File này là một tuỳ chọn. 
Thậm chí file không xác định thì JAR cũng tự động tạo ra. File jar được dùng 
như các lưu trữ. File này phải có phần mở rộng là ‘.jar’ được xác định tại 
dòng lệnh. File đầu vào (input-file) là danh sách file phân cách bở dấu phẩy. 
Netscape Navigator và Internet Explorer hỗ trợ file JAR. 
Câu lệnh sau lưu trữ tất cả các file class và file java bao gồm trong một thư 
mục hiện hành vào một file jar gọi là ‘pack’ 
 jar cf pack.jar *.class *.java 
Hình 10.1 lệnh jar 
Dùng lệnh sau tại dấu nhắc liệt kê các file trong file ‘pack.jar’ 
 jar tf pack.jar 
Hình 10.2 Liệt kê các file trong file pack.jar 
Để gộp file lưu trữ ‘pack.jar vào trong một applet, mở trang HTML, và thêm 
thuộc tính ARCHIVE=’pack.jar’ vào thẻ applet, như sau: 
<applet code=”exr7.class” ARRCHIVE=”pack.jar” height=125 
width=350> 
Thuộc tính sẽ chỉ cho trình duyệt nạp lưu trữ ‘pack.jar’ để tìm file ‘exr7.class’ 
Câu lệnh sau trích rút các file được nén trong file pack.jar: 
 jar xvf pack.jar 
Mục chọn ‘x’ cho phép bạn trích rút nội dung của file. 
10.3 Chữ ký điện tử (Digital Signature) để định danh các 
applet 
Tạo một lưu trữ 
Lệnh jar 
Xác định lưu trữ 
Tên file 
Các file được lưu trữ 
Tuỳ chọn này được sử dụng cho bảng nội dung lưu trữ 
Tuỳ chọn xác định tên file lưu trữ 
156 Core Java 
Trong java, bảo mật applet trên web là phần rất quan trọng. Hacker có thể 
viết các applet nguy hiểm xuyên thủng hàng rào bảo mật. Vì thế, applet hạn 
chế sự can thiệp của các ngôn ngữ. Applet không hỗ trợ một số thao tác sau: 
 Đọc và ghi file từ hệ thống nơi applet đang chạy. 
 Lấy thông tin từ file của hệ thống 
 Xoá file của hệ thống. 
Java 2 có thể thực hiện tất cả các thao tác trên, với các applet cung cấp từ 
một nhà cung cấp applet tin cậy, và được ký chữ ký điện tử (digitally signed). 
Hình sau minh họa quá trình mã hoá khoá 
Hình 10.3. Mã hoá dựa trên các khoá 
Trong hình trên, khoá công khai (public keys) được dùng mã hoá và giải mã. 
Cùng ý tưởng được sử dụng cho chữ ký diện tử cộng thêm các tính năng bổ 
sung. 
Một chữ ký điện tử là một file mã hoá đi cùng với chương trình để giúp nhận 
dạng chính xác nguồn gốc của file. Khóa bí mật tính giá trị từ file applet. 
Người giữ khoá bí mật kiểm tra nội dung của đối tượng. 
Trong chữ ký điện tử, một khóa riêng (private key) được sử dụng để mã hóa, 
và khoá công khai, được dùng để giải mã. Trong khi ký (sign) trên một đối 
tượng, phía ký dùng thuật toán Message Digest (như MD5) để tính giá trin 
digest của đối tượng. Giá trị digest được dùng như là 'dấu vân tay' của đối 
tượng. Digest sau đó được mã hoá dùng khóa riêng, để tạo ra chử ký điện tử 
của đối tượng. Khoá công khai được sử dụng để giải mã và kiểm tra chúng. 
Kết quả của sự giải mã, giá trị digest được đưa ra. Giá trị digest của đối 
tượng được tính và so sánh với giá trị digest được giải mã. Nếu giá trị digest 
của đối tượng và giá trị digest được mã hoá khớp với nhau, chữ ký được được 
xác nhận. Tài liệu mô tả chữ ký được gọi là “Chứng thực” (Certificate) 
Thiết lập sự tin cậy, nhận dạng applet được chứng nhận. Chứng nhận các 
thực thể khác sử dụng khóa công khai để giả mạo. Nhà chứng thực (a 
certificate authority) được dùng để thực hiện chứng nhân. Nhận được được 
chứng thực từ một CA (Certificate Authority), applet phải đệ trình tài liệu 
chứng thực sự nhận dạng của nó. 
Chương 1: Lập Trình Hướng Đối Tượng 157 
Hiện giờ các công ty đưa ra các dịch vụ xác nhận chứng thực sau: 
 VeriSign 
 Thawte Certification 
Bạn có thể thiết lập các mức bảo mật khác nhau. Một applet có thể đưa ra sự 
uỷ thác hoàn toàn, hoặc không uỷ thác, với sự giúp đỡ của tập các lớp gọi là 
permissions. Nhưng nhìn chung, các applet bị giới hạn một các tối đa, trừ khi 
nhà phát triển ký trên applet. Điều này xác định nhà phát triển là tin cậy. 
10.4 Khoá bảo mật Java (Java Security key). 
Chúng ta cần tạo 3 công cụ, tên là, ‘jar’, ‘jarsigner’, và ‘keytool’, trước khi 
dùng các applet được ký. Chúng ta cần tạo cặp khóa công public/private, và 
làm cho nó trở nên sẵn sàng với công cụ jarsigner. 
Bây giờ, chúng ta sẽ sử dụng các công cụ để tạo keystore. 
 Keystore (Lưu trữ khoá) 
Keystore là một cơ sở dữ liệu khoá, chứa các chứng thực số dùng để nhận 
dạng các giá trị khoá công khai (public). 
 Keytool (Công cự khoá) 
Keytool là công cụ khoá bảo mật của java, tạo và quản lý khóa công khai, 
khoá riêng (private), và các chứng thực bảo mật. Nó cũng có thể thực hiện: 
o Quản lý cặp khoá công public/private 
o Lưu trữ các khoá công khai 
o Dùng các chứng thực để xác thực chứng thực khác. 
o Xác thực (Authenticate) dữ liệu nguồn. 
Tất cả thông tin mà keytool quản lý được lưu trữ trong cơ sở dữ liệu gọi là 
keystore. Sun có một keystore mặc định dùng định dạng file mới gọi là JKS 
(java key store Lưu trữ khoá java). Để kiểm tra xem hệ thống bạn có một 
keystore dưới định dạng này hay chưa hãy thực hiện câu lệnh sau tại dấu 
nhắc lệnh: 
keytool –list 
Thông báo lỗi sau xuất hiện nếu bạn không có gì trong keystore của bạn. 
keytool error: keystore file does not exist: c:\windows\.keystore 
JDK tìm keystore chính trong thư mục C:\windows\. Đây là một vị trí chung 
cho các file hệ thống quan trọng trên windows 95, 98 và NT systems. 
Tuỳ chọn keystore cũng có thể được sử dụng trong lệnh keytool, như sau: 
keytool –list keystore c:\java\try 
Câu lệnh này chỉ cho JDK tìm keystore trong file được gọi là ‘try’ trong thư 
mục ‘C:\java\try’. Nếu không tìm thấy, sẽ hiển thị thông báo lỗi như trên. 
158 Core Java 
Lựa chọn ‘-genkey’ có thể được sử dụng cùng với câu lệnh keytool để tạo cặp 
khoá công public/private. Bạn cũng có thể dùng một số các tuỳ chọn khác. 
Dạng đơn giản nhất như sau: 
keytool –genkey –alias “I” 
Bí danh (alias) có thể được dùng lưu trữ, thay thế hoặc xoá cặp khoá. Các bí 
danh keytool không phân biệt chữ hoa, thường. Trong lệnh trên, chúng ta 
không sử dụng tuỳ chọn keystore. Nếu cùng câu lệnh sử dụng tuỳ chọn 
keystore, sẽ được viết lại như sau: 
keytool –genkey –alias “I” –keystore “store” 
Trong lệnh trên, cặp khoá sẽ được lưu trữ trong keystore tên là ‘store’, và 
không lưu trong keystore mật định của hệ thống. 
Sau khi nhập lệnh trên vào, và nhấn phím enter, keytool nhắc bạn nhập vào 
mật khẩu (password) cho keystore, như sau: 
Enter keystore password: 
Nhập vào ‘password’ là mật khẩu như yêu cầu. 
Tiếp theo, keytool nhắc bạn nhập vào các thông tin bổ sung như: 
What is your first and last name? (Tên và họ) 
[unknown] 
what is the name of your organization unit? 
[unknown]: software Development. 
What is the name of your organization? (Tên của tổ chức) 
[Unknown]: ABC Consultants (tư vấn ABC) 
What is the name of your city or Locality? (tên thành phố hoặc địa 
phương của bạn) 
[Unknown]: California 
What is the name of your State or Province? (tên bang hoặc tỉnh của 
bạn) 
[Unknown]:United States of America 
What is the two-letter country code for this unit?(Mã quốc gia với 2 
ký tự) 
[Unknown]: US 
Khi bạn đã nhập vào các thông tin, keytool hiển thị thông tin sau: 
Is <CN=Bob Fernandes, OU=Software Development, O=ABC 
Consultants, L=California, ST=United States of America, 
C=US>correct? 
[no]: 
Cuối cùng, keystool nhắc bạn nhập vào mật khẩu cho khoá riêng của bạn, 
Chương 1: Lập Trình Hướng Đối Tượng 159 
như: 
Enter key password for 
(RETURN if same as keystore password): 
Thông tin trên được sử dụng để kết hợp sự phân biệt tên (name) với bí danh 
(alias). Thông tin trên cũng có thể được đưa vào trực tiếp từ mục chọn ‘-
dname’ 
Mật khẩu sau cùng phần biệt với mật khẩu keystore. Nó được dùng truy cập 
khoá riêng của cặp khoá. Mật khẩu có thể trực tiếp chỉ rõ bằng cách sử dụng 
tuỳ chọn ‘-keypass’. Nếu mật khẩu không chỉ rõ, mật khẩu keystore được sẽ 
được dùng. Tuỳ chọn ‘-keypasswd’ dùng thay đổi mật khẩu. Tuỳ chọn ‘-
keyalg’ chỉ rõ thuật toán tạo cặp khoá. 
Khi bạn tạo một khoá và bổ sung nó vào trong keystore, bạn có thể dùng tuỳ 
chọn ‘-list’ của keytool để xem khoá có trong keystore hay không. 
Để xoá cặp khoá từ cơ sớ liệu, dùng lệnh sau: 
keytool –delete –alias aliasName 
‘aliasName’ chỉ tên của khoá được xoá. 
Bây giờ, chúng ta tạo cặp khoá riêng/công cộng cho file JAR, chúng ta hãy ký 
danh nó. Lệnh jarsigner dùng để ký danh một file JAR. Nhập lệnh sau vào 
dấu nhắc DOS: 
jarsigner –keystore keyStore –storepass storePassword –keypass 
keyPassword 
Bảng sau cung cấp danh sách của JARFileNames và bí danh: 
Tuỳ chọn Mô tả 
keyStore Tên keystore sử dụng 
storePassword Mật khẩu keystore 
keyPassword Mật khẩu khoá riêng 
JARFileName Tên của file JAR được ký danh 
Alias Bí danh của bộ ký danh 
Bảng 10.2 JARFileNames và bí danh 
Để ký danh file JAR ‘pack.jar’, với keystore ‘store’, và mật khẩu để lưu trữ và 
các khoá riêng là ‘password’, dùng lệnh sau: 
jarsigner –keystore store –storepass password –keypass password 
pack.jar pk 
‘pk’ nghĩa là tên bí danh. 
160 Core Java 
Nếu tuỳ chọn ‘-keystore’ không chỉ rõ, thì keystore mặc định được dùng. 
Để chỉ rõ chữ ký của file JAR được định danh, dùng tuỳ chọn ‘-verify’. 
jarsigner –verify pack.jar 
‘pack.jar’ chỉ tên file JAR. Nếu chữ ký không hợp lệ, thì ngoại lệ sau được tạo 
ra. 
Jarsigner:java.util.zip.ZipException:invalid entry size (expected 900 
but got 876 bytes) 
Ngược lại, xuất hiện thông báo “jar verified” (jar được xác minh) 
Quá trình xác thực kiểm tra theo các bước sau: 
 Có file ‘.DSA’ chứa chữ ký hợp lệ cho file chữ ký .SF không. 
 Có các mục trong file chữ ký là các digest cho mỗi mục tương ứng 
trong file kê khai (manifest file) 
10.5 Chữ ký điện tử (Digital Certificates) 
Cho đến bây giờ, chúng ta đã học cách tạo và ký một file JAR. Bây giờ, chúng 
ta sẽ học cách xuất các chữ ký điện tử (digital certificates), nó được sử dụng 
để xác thực chữ ký của các file JAR. Chúng ta cũng sẽ học cách nhập chữ ký 
điển tử từ file khác vào. 
Chữ ký điện tử là một file, một đối tượng, hoặc một thông báo được ký bởi 
quyền chứng thực (certificate authority). The CA (Certificate authority) cấp 
chứng nhận giá trị các khoá công khai. Chứng nhận X.509 của tổ chức 
International Standards Organization là một dạng chứng nhận số phổ biến. 
Keytool hổ trợ những chứng nhận này. 
Keytool ở bước đầu tiên cần nhận được một chứng nhận (certificate). Chúng 
ta dùng chứng nhận đó tạo cặp khoá private/public. Keytool nhập vào các 
chứng nhận đã được tạo và được ký. Keytool tự động gắn khoá công khái mới 
với một chứng nhận mới. Cùng thực thể đã tạo khoá công khai ký chứng 
nhận này. Đó được gọi là ‘self-signed certificates’ (Chứng nhận tự ký). 
Các chứng nhận này không phải là chứng nhận đáng tin cậy cho định danh. 
Tuy nhiên, chúng cần để tạo các yêu cầu ký danh chứng nhận (certificate-
signing request). 
Keytool và tuỳ chọn được sử dụng để tạo các chứng nhận trên. Câu lệnh sau 
giúp tạo các chứng nhận trên: 
keytool –keystore store –alias mykey –certreq –file mykey.txt 
Chương 1: Lập Trình Hướng Đối Tượng 161 
Cặp khoá được tạo là ‘mykey’. Tuỳ chọn ‘-file’ chỉ tên file để lưu cerrtificate-
signing. 
Dùng tuỳ chọn ‘-export’ xuất các chứng nhận này như sau: 
keytool –export –keystore store –alias pk –file mykey 
Câu lệnh trên hiển thị dấu nhắc sau: 
Enter keystore password 
Chứng nhận đã lưu trữ trong 
Để nhập các chứng nhận khác vào keystore của bạn, nhập câu lệnh sau: 
keytool -import –keytool keystore –alias alias –file filename 
Tên được chỉ như là tên file chứa chứng nhận được nhập vào (imported 
certificate). 
Câu lệnh sau chỉ tên bí danh là ‘alice’ để nhập chứng nhận trong file ‘mykey’ 
vào keystore ‘MyStore’: 
keytool –import –keystore MyStore –alias alice –file mykey 
Câu lệnh trên hiển thị dấu nhắc sau: 
Enter keystore password: (Nhập vào mật khẩu keystore) 
Kết quả xuất ra hiển thị hai tuỳ chọn –Owner và Issuer. Nó hiển thị tên công 
ty, nghề nghiệp, tổ chức, địa điểm, bang và tiền tệ. Nó cũng hiển thị số serial 
và thời gian có giá trị. Cuối cùng, nó hỏi là tin cậy chứng nhận này không. 
Chứng nhận được chấp thuận dựa vào sự tin tưởng cá nhân bạn. 
Dùng lệnh ‘-list’ liệt kê nội dung của keystore như sau: 
keystool –list –keystore Store 
Câu lệnh trên yêu yều password keystore 
Dùng tuỳ chọn ‘-alias’ liệt kê một mục. Dùng lệnh -delete để xoá bí danh 
trong keystore, như sau: 
keytool –delete –keystore Store –alias alias 
Dùng lệnh ‘-printcert’ in chứng nhận được lưu trữ trong file, theo cách sau: 
keytool –printcert –file myfile 
162 Core Java 
Dùng lệnh ‘-help’ nhận về danh sách tất cả các tuỳ chọn mà keytool hổ trợ: 
keytool -help 
10.6 Các gói bảo mật java (JAVA Security packages) 
Các gói bảo mật Java bao gồm: 
 java.security 
Đây là gói API bảo mật chính. Chứa các lớp và giao diện hỗ trợ mã hoá, 
digest và chữ ký điện tử. 
 java.security.acl 
Chứa các giao diện dùng cài đặt các chính sách điều khiển truy cập 
 java.security.cert 
Cung cấp sự hổ trợ cho chứng nhận X.509 
 java.security.interfaces 
Định nghĩa các giao diện truy nhập Digital Signature Algorithm 
 java.security.spec 
Cung cấp các lớp độc lập và phụ thuộc vào thuật toán mã hoá sử dụng khoá. 
Tóm tắt: 
 Nếu khả năng bảo mật trong applet không đảm bảo, các dữ liệu nhạy 
cảm có thể được sữa đổi hoặc phơi bày. 
 Mục đích chính của JAR là kết nối các file mà applet sử dụng trong một 
file nén duy nhất. Điều này cho phép các applet nạp vào trình duyệt 
một cách hiệu quả. 
 Một file kê khai (manifest file) chứa thông tin về các file lưu trữ. 
 Chữ ký điện tử là một mã hoá kèm với chương trình để nhận diện 
chính xác nguồn gốc của file. 
 Keystore là một cơ sở dữ liệu khoá. 
 Keytool là công cụ khoá bảo mật của java. 
 chứng nhận điện tử là một file, hoặc một đối tượng, hoặc một thông 
báo được ký bởi quyền chứng nhận (certificate authority) 
Chương 1: Lập Trình Hướng Đối Tượng 163 
Kiểm tra kiến thức: 
1. File ________là file lưu trữ được nén. 
2. Tuỳ chọn _____, khi dùng với công cụ jar, trích rút tên file từ một lưu 
trữ (.jar) 
3. JAR tự động tạo file kê khai, thậm chí nó không được chỉ ra 
 Đúng/Sai 
4. Thuộc tính______,khi dùng trong thẻ applet, chỉ cho trình duyệt nạp 
file jar, và tìm file class của applet. 
5. Trong chữ ký điện tử, _______được dùng cho mã hoá và 
_________được dùng cho giải mã. 
6. Tất cả các thông tin keytool quản lý, được lưu trữ trong một cơ sở dữ 
liệu gọi là _______ 
7. keytool ở bước đầu tiên cần thiết để nhận được một chứng nhận 
 Đúng/Sai 
8. Gói _______chứa giao diện dùng cài đặt các chính sách điều khiển 
truy nhập. 
164 Core Java 
Bài tập 
Sử dụng các câu lệnh java thực hiện các hành động sau: 
1. Tạo một file jar ‘core-java.jar’ chứa các file lớp (.class) và các file 
nguồn. 
2. Liệt kê nội dung của file jar. 
3. Tạo file html nhúng applet CardLayoutDemo.class, file lớp được chứa 
trong file jar. 
4. Trích rút nội dung file jar. 
5. Dùng lệnh keytool với tên bí danh và keystore để tạo ra cặp khoá 
public/private mới. 
6. Ký danh file jar mới được tạo. 
7. Xác minh chữ ký (signature). 
8. Xuất các chứng nhận (certificate) 
9. Liệt kê nội dung của keystore. 
10.In các chứng nhận được lưu trong file. 

File đính kèm:

  • pdfgiao_trinh_mon_lap_trinh_huong_doi_tuong.pdf