Giáo trình Lập trình Java được biên soạn để phục vụ cho công tác giảng dạy và học tập của giảng viên, học sinh, sinh viên chuyên ngành Công nghệ thông tin, và là tài liệu tham khảo cho các lập trình viên tại các doanh nghiệp. Cấu trúc của giáo trình gồm 6 chương với những nội dung chính sau: Lịch sử của Java, một số đặc trưng của java và công cụ để lập trình java; cấu trúc chương trình, các kiểu dữ liệu cơ bản, kiểu nhập xuất, cấu trúc rẽ nhánh, cấu trúc lặp, mảng 1 chiều, 2 chiều; các thành phần trong file mã nguồn, các class, viết chồng, viết đè, tính kế thừa, tính đa hình trong java;... Mời các bạn cùng tham khảo.
Trang 1TẬP ĐOÀN DỆT MAY VIỆT NAM TRƯỜNG CAO ĐẲNG CÔNG NGHỆ TPHCM
GIÁO TRÌNH MÔN HỌC/MÔ ĐUN: LẬP TRÌNH JAVA NGÀNH/NGHỀ: CÔNG NGHỆ THÔNG TIN
TRÌNH ĐỘ: 12/12
Ban hành kèm theo Quyết định số: /QĐ- ngày ………tháng năm……
……… của ………
…………, năm 2021
Trang 3LỜI GIỚI THIỆU
Giáo trình “Lập trình Java” được biên soạn để phục vụ cho công tác giảng
dạy và học tập của giảng viên, học sinh, sinh viên chuyên ngành Công nghệ thông tin,
và là tài liệu tham khảo cho các lập trình viên tại các doanh nghiệp Cấu trúc của giáo trình gồm 6 chương:
Chương 1 : Tổng quan về Java bao gồm xứ mệnh lịch sử của Java, một số đặc trưng của java và công cụ để lập trình java
Chương 2 : Ngôn ngữ Java bao gồm các cấu trúc chương trình, các kiểu dữ liệu
cơ bản, kiểu nhập xuất, cấu trúc rẽ nhánh, cấu trúc lặp, mảng 1 chiều, 2 chiều
Chương 3 : Hướng đối tượng trong Java bao gồm các thành phần trong file mã nguồn, các class, viết chồng, viết đè, tính kế thừa, tính đa hình trong java
Chương 4 : Lớp xử lý ứng dụng Java bao gồm xử lý loại trừ, xử lý toán học, xử
lý chuỗi trong Java, xử lý ngày tháng, xử lý tập hợp nâng cao
Chương 5 : Lập trình giao diện bao gồm các thành phần trong giao diện, các Gui, các Jframe, các Layout Manager
Chương 6 : Xây dựng ứng dụng Java bao gồm các thành phần ứng dụng, mô hình 2 lớp, cài đặt jdbc và một số kỹ thuật sử dụng Jdbc
Trong quá trình biên soạn, mặc dù đã có nhiều cố gắng nhưng không tránh khỏi những hạn chế và thiếu sót nhất định, tác giả rất mong nhận được những ý kiến đóng góp của quý đọc giả để giáo trình này ngày càng hoàn thiện hơn
Xin chân thành cảm ơn
Tp HCM, ngày……tháng……năm………
Biên soạn
BỘ MÔN TIN HỌC
Trang 4MỤC LỤC
Tên môn học: Lập trình Java 1
Chương 1 6
TỔNG QUAN VỀ JAVA 6
1 Xứ mệnh lịch sử của Java 6
2 Một số đặc trưng của Java 6
3 Sử dụng Java có thể xây dựng được ứng dụng gì? 7
4 Công cụ lập trình JDK 8
5 Chương trình HelloWord.java với JDK 9
Chương 2 10
NGÔN NGỮ JAVA 10
1 Cấu trúc chương trình 10
2 Kiểu dữ liệu cơ bản 11
3 Chuyển đổi kiểu dữ liệu 12
4 Nhập xuất console 12
5 Cấu trúc rẽ nhánh 12
6 Cấu trúc lặp 14
7 Mảng 1 chiều 15
8 Mảng 2 chiều 17
9 Break và Continue 18
10 Math 18
Chương 3 20
HƯỚNG ĐỐI TƯỢNG TRONG JAVA 20
1 Các thành phần trong file mã nguồn (*.java) 20
2 Khai báo class 20
3 Modifiers 20
4 Viết chồng và viết đè (Overloading & Overriding) 21
5 Giao tiếp (interface) 22
6 Kế thừa trong java 22
7 Tính đa hình trong java 25
Chương 4 28
LỚP XỬ LÝ ỨNG DỤNG JAVA 28
1 Xử lý loại trừ (ngoại lệ) 28
2 Xử lý toán học 30
3 Xử lý chuỗi trong java 31
4 Xử lý ngày tháng 34
5 Xử lý tập hợp nâng cao 35
Chương 5 39
LẬP TRÌNH GIAO DIỆN 39
1 Các thành phần giao diện 39
2 Java Gui Api 39
3 Jframe 41
4 Layout Manager 41
5 Điều khiển sự kiện 42
Chương 6 44
XÂY DỰNG ỨNG DỤNG JAVA 44
1 Các thành phần ứng dụng java 44
2 Mô hình 2 lớp 44
3 Cài đặt jdbc 44
Trang 54 Một số class và interface của Jdbc Api 45
5 Một số kỹ thuật sử dụng Jdbc 47
THỰC HÀNH 1: NGÔN NGỮ JAVA 49
THỰC HÀNH 2: JAVA + NETBEANS 51
BÀI TẬP TỔNG HỢP 1 70
BÀI TẬP TỔNG HỢP 2 71
BÀI TẬP TỔNG HỢP 3 72
BÀI TẬP TỔNG HỢP 4 73
BÀI TẬP TỔNG HỢP 5 74
BÀI TẬP TỔNG HỢP 6 75
BÀI TẬP TỔNG HỢP 7 76
Tài liệu tham khảo 77
Trang 6GIÁO TRÌNH MÔN HỌC/MÔ ĐUN Tên môn học: Lập trình Java
Mã môn học: MH 22
Thời gian thực hiện môn học: 75 giờ; (Lý thuyết: 15 giờ; Thực hành, thí nghiệm, thảo
luận, bài tập: 55 giờ ; Kiểm tra: 5 giờ)
I Vị trí, tính chất của môn học:
- Vị trí: học sau môn cấu trúc dữ liệu, Lập trình hướng đối tượng
- Tính chất: môn học chuyên môn bắt buộc
II Mục tiêu môn học:
- Về kiến thức:
+ Hiểu được cấu trúc và các thành phần cơ bản của ngôn ngữ Java
+ Làm quen với môi trường lập trình Java và các ứng dụng thực tế
+ Lập trình giao diện người dùng bằng ngôn ngữ Java
+ Hiểu và vận dụng công nghệ mới để xây dựng ứng dụng bằng ngôn ngữ Java
- Về kỹ năng:
+ Hình thành và phát triển khả năng giải quyết các bài toán lập trình
+ Xây dựng chương trình ứng dụng bằng ngôn ngữ Java
+ Rèn luyện kỹ năng lập trình, khả năng tư duy về lập trình hướng đối tượng
- Về năng lực tự chủ và trách nhiệm:
+ Hình thành niềm say mê lập trình, tin thần không ngừng học hỏi
+ Nhạy bén với cái mới, chủ động thích ứng với thay đổi
III Nội dung môn học:
1 Nội dung tổng quát và phân bổ thời gian:
2 Nội dung chi tiết:
Chương 1: Tổng quan về Java Thời gian: 5 giờ
1 Mục tiêu:
- Trình bày được các đặc trưng trong Java
- Nêu được các ứng dụng thường được viết bằng ngôn ngữ Java
- Tạo được chương trình đơn giản bằng Java
Thực hành, thí nghiệm, thảo luận, bài tập
Kiểm tra
1 Chương 1: Tổng quan về Java 5 1 4
2 Chương 2: Ngôn ngữ Java 15 3 11 1
3 Chương 3: Hướng đối tượng trong Java 15 3 10 2
4 Chương 4: Lớp xử lý ứng dụng Java 10 2 8
5 Chương 5: Lập trình giao diện 10 2 8
6 Chương 6: Xây dựng ứng dụng Java 20 4 14 2
Trang 72.5 Chương trình HelloWord.java với JDK
2.10 Math Thời gian: 1 giờ
Chương 3: Hướng đối tượng trong Java Thời gian: 15 giờ
1 Mục tiêu:
- Trình bày được các thành phần trong file mã nguồn Java
- Tạo được các Class có sử dụng Overloading , Overriding, Interface, kế thừa và đa hình trong Java
2 Nội dung chương:
2.1 Các thành phần trong file mã nguồn (*.java) Thời gian: 1 giờ
2.2 Khai báo Class Thời gian: 2 giờ
2.7 Tính đa hình trong Java Thời gian: 2 giờ
2 Nội dung chương:
2.1 Xứ mệnh lịch sử của Java
2.2 Một số đặc trưng của Java
2.3 Sử dụng Java có thể xây dựng được ứng dụng gì?
2.4 Công cụ lập trình JDK
Chương 2: Ngôn ngữ Java Thời gian: 15 giờ
1 Mục tiêu:
- Trình bày được các cấu trúc trong Java
- Xây dựng được chương trình bằng các cấu trúc Java như cấu trúc rẽ nhánh, cấu trúc lặp, mảng 1 chiều, mảng 2 chiều…
2 Nội dung chương:
2.1 Cấu trúc chương trình Thời gian: 1 giờ
2.2 Kiểu dữ liệu cơ bản Thời gian: 1 giờ
2.3 Chuyển đổi kiểu dữ liệu Thời gian: 1 giờ
2.4 Nhập xuất Console Thời gian: 1 giờ
2.5 Cấu trúc rẽ nhánh Thời gian: 2 giờ
2.6 Cấu trúc lặp Thời gian: 2 giờ
2.7 Mảng 1 chiều Thời gian: 2 giờ
2.8 Mảng 2 chiều Thời gian: 2 giờ
2.9 Break và Continue Thời gian: 1 giờ
2.3 Modifiers Thời gian: 2 giờ
2.4 Viết chồng và viết đè(Overloading & Overriding) Thời gian: 2 giờ
2.5 Giao tiếp (Interface) Thời gian: 2 giờ
2.6 Kế thừa trong Java Thời gian: 2 giờ
Trang 82.5 Xử lý tập hợp nâng cao Thời gian: 2 giờ
2.5 Điều khiển sự kiện Thời gian: 2 giờ
2.5 Một số kỹ thuật cơ bản sử dụng JDBC Thời gian: 3 giờ
IV Điều kiện thực hiện môn học:
1 Phòng học chuyên môn hóa/nhà xưởng: phòng lab tin học
2 Trang thiết bị máy móc: máy vi tính có phần mềm chuyên dụng
3 Học liệu, dụng cụ, nguyên vật liệu: sách, tập, máy tính có phần mềm chuyên dụng
4 Các điều kiện khác: không
V Nội dung và phương pháp đánh giá:
1 Nội dung:
- Kiến thức:
+ Nêu được cấu trúc và các thành phần cơ bản của ngôn ngữ Java
+ Nêu được hình thành và phát triển khả năng giải quyết các bài toán lập trình
- Kỹ năng:
Chương 4: Lớp xử lý ứng dụng Java Thời gian: 10 giờ
1 Mục tiêu:
- Tạo được xử lý loại trừ, xử lý toán học trong Java
- Tạo được chương trình Java có sử dụng các xử lý chuỗi, ngày tháng và tập hợp nâng cao trong Java
2 Nội dung chương:
2.1 Xử lý loại trừ Thời gian: 2 giờ
2.2 Xử lý toán học Thời gian: 2 giờ
2.3 Xử lý chuỗi trong Java Thời gian: 2 giờ
2.4 Xử lý ngày tháng Thời gian: 2 giờ
Chương 5: Lập trình giao diện Thời gian: 10 giờ
1 Mục tiêu:
- Nêu được các thành phần giao diện
- Sử dụng Java Gui Api, Jframe, điều khiển sự kiện,… trong ngôn ngữ Java
2 Nội dung chương:
2.1 Các thành phần giao diện Thời gian: 2 giờ
2.2 Java Gui Api Thời gian: 2 giờ
2.3 Jframe Thời gian: 2 giờ
2.4 Layout Manager Thời gian: 2 giờ
Chương 6: Xây dựng ứng dụng Java Thời gian: 20 giờ
1 Mục tiêu:
- Nêu được các thành phần trong ứng dụng Java
- Xây dựng được mô hình 2 lớp
- Cài đặt được JDBC và các Class và Interface thường dùng
2 Nội dung chương:
2.1 Các thành phần của một ứng dụng Java Thời gian: 2 giờ
2.2 Mô hình 2 lớp Thời gian: 5 giờ
2.3 Cài đặt JDBC Thời gian: 5 giờ
2.4 Một số Class và Interface của JDBC API thường dùng Thời gian: 5 giờ
Trang 9+ Sử dụng được các cú pháp trong môi trường lập trình Java và các ứng dụng thực tế
+ Lập trình giao diện người dùng bằng ngôn ngữ Java
+ Vận dụng công nghệ mới để xây dựng ứng dụng bằng ngôn ngữ Java
+ Xây dựng chương trình ứng dụng bằng ngôn ngữ Java
+ Rèn luyện kỹ năng lập trình, khả năng tư duy về lập trình hướng đối tượng
- Điểm trung bình các điểm kiểm tra là trung bình cộng của các điểm kiểm tra thường xuyên, điểm kiểm tra định kỳ và tự nghiên cứu theo hệ số của từng loại điểm Trong
đó, điểm kiểm tra thường xuyên và điểm tự nghiên cứu được tính hệ số 1, điểm kiểm tra định kỳ tính hệ số 2
- Hình thức thi: trắc nghiệm (60 phút) (được thông báo vào đầu mỗi học kỳ)
VI Hướng dẫn thực hiện môn học:
1 Phạm vi áp dụng môn học: Chương trình môn học được sử dụng để giảng dạy cho trình
độ Cao đẳng
2 Hướng dẫn về phương pháp giảng dạy, học tập môn học:
- Đối với giảng viên:
+ Trước khi giảng dạy cần phải căn cứ vào nội dung của từng bài học chuẩn bị đầy đủ các điều kiện cần thiết để đảm bảo chất lượng giảng dạy
+ Khi thực hiện chương trình môn học cần xác định những điểm kiến thức cơ bản, xác định rõ các yêu cầu về kiến thức, kỹ năng ở từng nội dung
+ Cần liên hệ kiến thức với thực tế sản xuất và đời sống, đặc biệt là các phần mềm thực tế sử dụng mạng Internet có hiệu quả
- Đối với người học:
+ Chủ động, tích cực tiếp thu kiến thức, tự nghiên cứu, chuẩn bị bài theo nội dung giảng viên hướng dẫn, yêu cầu trước khi đến lớp
+ Cần thực hiện tất cả các bài tập và tự nghiên cứu các bài toán thực tế về môn học đã
có sẵn nhằm mục đích củng cố, ghi nhớ, khắc sâu kiến thức đã học
+ Xây dựng kế hoạch tự học, tự nghiên cứu cho cá nhân
+ Tham dự ít nhất 70% thời gian học lý thuyết và đầy đủ các bài học tích hợp, bài học thực hành, thực tập và các yêu cầu của môn học được quy định trong chương trình môn học
Trang 104 Tài liệu tham khảo:
[1] Đề cương bài giảng Lập trình Java, Trường CĐ Kinh Tế - Kỹ Thuật Vinatex TP.HCM
[2] Phương Lan – Bước đầu làm quen Java – NXB Lao động xã hội, 2005
[3] Đỗ Quang Thái – Tự học ngôn ngữ lập trình Java, NXB Giáo dục, 2000 [4] Nguyễn Tiến Dũng–Giáo trình lý thuyết và bài tập Java–NXB Giáo dục,1999
- Lập trình giao diện
- Xây dựng ứng dụng Java
Trang 11Chương 1 TỔNG QUAN VỀ JAVA
1 Xứ mệnh lịch sử của Java
− Năm 1990, Nhóm lập trình do James Gosling dùng C++ để xây
dựng một phần mềm lập trình cho các mặt hàng gia dụng, nhưng
nhanh chóng nhận thấy rằng C++ không thích hợp, vì quá cồng
kềnh và đòi hỏi rất nhiều hỗ trợ như: bộ nhớ, đĩa … Nhóm của
Gosling đã quyết định xây dựng một ngôn ngữ mới và đặt tên là
Oak (nghĩa là cây sồi)
− Qua các dự án mà nhóm đã thực hiện, Oak đã phát triển và
trưởng thành nhanh chóng, và được đặt tên là Java
− Năm 1995, Sun MicroSystem chính thức công bố Java
− Java nhanh chóng được đón nhận như một công cụ mạnh mẽ cho việc phát triển các ứng dụng Internet, vì nó cung cấp tiến trình xử lý tương tác và cách dùng đồ họa và hoạt hình trên Internet
2 Một số đặc trưng của Java
− Đơn giản
Những người thiết kế mong muốn phát triển một ngôn ngữ dễ học và quen thuộc với đa
số người lập trình Java tựa như C++, nhưng đã lược bỏ đi các đặc trưng phức tạp, không cần thiết của C và C++ như: thao tác con trỏ, thao tác định nghĩa chồng toán tử (operator overloading),… Java không sử dụng lệnh “goto” cũng như file header (.h) Cấu trúc
“struct” và “union” cũng được loại bỏ khỏi Java Nên có người bảo Java là “C++ “, ngụ ý bảo java là C++ nhưng đã bỏ đi những thứ phức tạp, không cần thiết
− Hướng đối tượng
Có thể nói java là ngôn ngữ lập trình hoàn toàn hướng đối tượng, tất cả trong java đều
là sự vật, đâu đâu cũng là sự vật
− Độc lập với hệ nền
Mục tiêu chính của các nhà thiết kế java là độc lập với hệ nền hay còn gọi là độc lập phần cứng và hệ điều hành Đây là khả năng một chương trình được viết tại một máy nhưng có thể chạy được bất kỳ đâu
Tính độc lập với phần cứng được hiểu theo nghĩa một chương trình Java nếu chạy đúng trên phần cứng của một họ máy nào đó thì nó cũng chạy đúng trên tất cả các họ máy khác Một chương trình chỉ chạy đúng trên một số họ máy cụ thể được gọi là phụ thuộc vào phần cứng
Tính độc lập với hệ điều hành được hiểu theo nghĩa một chương trình Java có thể chạy được trên tất cả các hệ điều hành Một chương trình chỉ chạy được trên một số hệ điều hành được gọi là phụ thuộc vào hệ điều hành
Các chương trình viết bằng java có thể chạy trên hầu hết các hệ nền mà không cần phải thay đổi gì, điều này đã được những người lập trình đặt cho nó một khẩu hiệu ‘viết một lần, chạy mọi nơi’, điều này là không thể có với các ngôn ngữ lập trình khác
Đối với các chương trình viết bằng C, C++ hoặc một ngôn ngữ nào khác, trình biên dịch sẽ chuyển tập lệnh thành mã máy (machine code), hay lệnh của bộ vi xử lý Những
Trang 12lệnh này phụ thuộc vào CPU hiện tại trên máy bạn Nên khi muốn chạy trên loại CPU khác, chúng ta phải biên dịch lại chương trình
− Mạnh mẽ
Java là ngôn ngữ yêu cầu chặt chẽ về kiểu dữ liệu, việc ép kiểu tự động bừa bãi của C, C++ nay được hạn chế trong Java, điều này làm chương trình rõ ràng, sáng sủa, ít lỗi hơn
Java kiểm tra lúc biên dịch và cả trong thời gian thông dịch vì vậy Java loại bỏ một một
số loại lỗi lập trình nhất định Java không sử dụng con trỏ và các phép toán con trỏ Java kiểm tra tất cả các truy nhập đến mảng, chuỗi khi thực thi để đảm bảo rằng các truy nhập đó không ra ngoài giới hạn kích thước
Trong các môi trường lập trình truyền thống, lập trình viên phải tự mình cấp phát bộ nhớ Trước khi chương trình kết thúc thì phải tự giải phóng bộ nhớ đã cấp Vấn đề nảy sinh khi lập trình viên quên giải phóng bộ nhớ đã xin cấp trước đó Trong chương trình Java, lập trình viên không phải bận tâm đến việc cấp phát bộ nhớ Quá trình cấp phát, giải phóng được thực hiện tự động, nhờ dịch vụ thu nhặt những đối tượng không còn
sử dụng nữa (garbage collection)
Cơ chế bẫy lỗi của Java giúp đơn giản hóa quá trình xử lý lỗi và hồi phục sau lỗi
− Hỗ trợ lập trình đa tuyến
Đây là tính năng cho phép viết một chương trình có nhiều đoạn mã lệnh được chạy song song với nhau Với java ta có thể viết các chương trình có khả năng chạy song song một cách dễ dàng, hơn thế nữa việc đồng bộ tài nguyên dùng chung trong Java cũng rất đơng giản Điều này là không thể có đối với một số ngôn ngữ lập trình khác như C/C++, pascal …
− Thông dịch
Các chương trình java cần được thông dịch trước khi chạy, một chương trình java được biên dịch thành mã byte code mã độc lập với hệ nền, chương trình thông dịch java sẽ ánh xạ mã byte code này lên mỗi nền cụ thể, điều này khiến java chậm chạp đi phần nào
3 Sử dụng Java có thể xây dựng được ứng dụng gì?
− Applets: được tạo ra để sử dụng trên Internet thông qua các trình duyệt hỗ trợ Java như
IE hay Netscape Applet được nhúng bên trong trang web Khi trang web hiển thị trong trình duyệt, Applet sẽ được tải về để thực thi tại trình duyệt
Trang 13− Command Line: được chạy từ dấu nhắc lệnh và không sử dụng giao diện đồ họa
− GUI (Graphics User Interface): là chương trình chạy độc lập cho phép người dùng
tương tác qua giao diện đồ họa
− Servlets/JSP: Java thích hợp để phát triển ứng dụng nhiều lớp Applet là chương trình
đồ họa chạy trên trình duyệt tại máy trạm Ở các ứng dụng Web, máy trạm gửi yêu cầu tới máy chủ Máy chủ xử lý và gửi kết quả trở lại máy trạm Các Java API chạy trên máy chủ chịu trách nhiệm xử lý tại máy chủ và trả lời các yêu cầu của máy trạm Các Java API chạy trên máy chủ này mở rộng khả năng của các ứng dụng Java API chuẩn Các ứng dụng trên máy chủ này được gọi là các JSP/Servlet hoặc Applet tại máy chủ
Xử lý Form của HTML là cách sử dụng đơn giản nhất của JSP/Servlet Chúng còn có thể được dùng để xử lý dữ liệu, thực thi các giao dịch và thường được thực thi thông
qua máy chủ Web
− Database: cho phép quản lý CSDL quan hệ (SQL Server, Oracle, )
− Ứng dụng mạng: Java là ngôn ngữ rất thích hợp cho việc xây dựng các ứng dụng mạng
Với thư viện Socket bạn có thể lập trình với hai giao thức: UDP và TCP
− Ứng dụng nhiều tầng: Với Java bạn có thể xây dựng phân tán nhiều tầng với nhiều hỗ
trợ khác nhau như: RMI, CORBA, EJB, Web Service
− Ứng dụng cho các thiết bị di động: sử dụng các ứng dụng Java chạy trên các thiết bị di
động này
4 Công cụ lập trình JDK
Trong giới Java hiện nay có 4 công cụ được sử dụng nhiều nhất: JCreator, NetBeans, Eclipse, JBuilder và mỗi một công cụ có ưu và nhược điểm riêng
JCreator ▪ Ưu điểm: gọn nhẹ, dễ cài đặt, dễ sử dụng (như Turbo Pascal)
▪ Khuyết điểm: hỗ trợ về lập trình không tốt đặc biệt là thiết kế giao diện
▪ Khuyên dùng: chương trình này phù hợp với những bạn mới bắt đầu làm quen với java
NetBeans ▪ Ưu điểm: miễn phí, ngày càng được hỗ trợ nhiều tính năng hơn bởi
Sun
▪ Khuyết điểm: các plugin mở rộng không nhiều
▪ Khuyên dùng: phù hợp với những bạn sau một thời gian làm quen với java chuẩn bị chuyển sang phần java nâng cao
Eclipse ▪ Ưu điểm: miễn phí, nhiều plugin mở rộng, hỗ trợ lập trình tốt
▪ Nhược điểm: hơi nặng
▪ Khuyên dùng: các công ty lập trình chuyên nghiệp họ đang dùng chương trình này
Jbuilder ▪ Ưu điểm: hỗ trợ lập trình tốt
▪ Nhược điểm: không miễn phí và nặng
Trang 14▪ Cài đặt JDK
− Download JDK tại địa chỉ: http://java.sun.com/javase/downloads/index.jsp
− Chọn phiên bản JDK phù hợp, cài đặt JDK trước khi bắt đầu cài đặt NETBEAN
▪ Cài đặt Creator
− Download JCreator tại địa chỉ: http://www.jcreator.com/download.htm
− Cài đặt Jcreator + chạy file keygen để lấy serial number, nhập số serial khi chạy chương trình
▪ Cài đặt Netbean
− Download Netbean tại địa chỉ: http://netbeans.org/downloads/index.html, chọn phiên
bản mới nhất, nếu cần lập trình cho điện thoại j2me thì download phiên bản full
− Để bắt đầu làm việc với một ứng dụng Java: chọn New Project, nhấn next, chọn Java
Application, đặt tên cho dự án và nhấn Finish
5 Chương trình HelloWord.java với JDK
− Ví dụ : In ra màn hình Console: Welcome To Java
Tên file là Helloworld.java
(*) Chú ý :
+ Trong file phải có ít nhất một lớp và có duy nhất một lớp chính (public) và phải
có một hàm main
+ Câu lệnh : System.out.println thì phải ghi hoa chữ S đầu tiên
+ Tham số String args[] là tham số bắt buộc cho hàm main
public class Helloworld
Trang 15Chương 2 NGÔN NGỮ JAVA
1 Cấu trúc chương trình
1.1 Định danh:
- Dùng để đặt tên cho biến, hằng, phương thức, lớp gói
- Nguyên tắc sử dụng định danh :
• Chỉ bắt đầu bằng 1 ký tự chữ , 1 dấu gạch dưới _, hay 1 dấu dollar $
• Không có khoảng trắng trong tên biến
• Không trùng với các từ khóa
• Không chứa các toán tử +, - , *, /
• Có chiều dài tùy ý
- Chú ý : trong Java có phân biệt chữ thường với chữ hoa
- Ví dụ :
a_1234_5, $dhfi,1aws, _ahks, a sas, %ats
❖ Quy ước đặt tên :
- Đối với biến và phương thức: luôn dùng chữ thường Nếu tên có nhiều từ thì ghép tất cả thành 1, từ đầu tiên viết chữ thường, các từ còn lại viết hoa ký tự đầu tiên
- Đối với hằng : viết hoa toàn bộ các ký tự, nếu có nhiều từ thì dùng dấu _ để nối các từ (Ví dụ : MAX_VALUE)
1.2 Biến và khai báo biến:
- Biến : dùng để lưu dữ liệu
- Cú pháp : < kiểu dữ liệu> <tên biến>;
- Ví dụ : int x;
- Cách gán giá trị : x= 2
- Có thể vừa khởi tạo vừa khai báo : int x=2;
▪ Chú ý : tốt hơn nên vừa khai báo vừa khởi tạo luôn giá trị cho biến Vì nếu biến chưa có giá trị thì khi in ra sẽ bị báo lỗi (tốn thời gian kiểm tra, không như ngôn ngữ C thì khi khai báo, biến sẽ tự động được gán giá trị mặc nhiên chứ không bị báo lỗi)
▪ Đối với hằng : final <kiểu dữ liệu> <tên hằng> = <giá trị>;
▪ Biến phạm vi cục bộ là biến được khai báo bên trong một khối, phạm vi của biến tính từ điểm biến được khai báo cho đến cuối khối mà biến được khai báo
1.3 Chú thích trong chương trình:
Trong Java có 3 cách để ghi chú thích:
- Sử dụng cặp /* và */ để ghi chú thích trên nhiều dòng
- Sử dụng cặp // để ghi chú thích trên một dòng
Trang 16- Sử dụng cặp /** và */, đây là kiểu hcú thích tài liệu (không có trong C/C++), nó dùng
để tạo ra tài liệu chú thích cho chương trình
2 Kiểu dữ liệu cơ bản
2.1 Kiểu dữ liệu số:
Tên Kích thước Khoảng biến thiên Lớp bao hàm
(kiểu số nguyên) byte 8 bit -128 → 127 Byte
short 16 bit -32768 → 32767 Short
int 32 bit -231 → 231-1 Integer
long 64 bit -263 → 263-1 Long
(kiểu số thực) float 32 bit - 34*1038 → 34*1038 Float
double 64 bit - 17 * 10308 → 17 * 10308 Double
- Ví dụ :
Kiểu int: int a= 18; // hệ thập phân
int a= 022; // hệ bát phân : thêm số 0 đầu int a= 0x12 ; // hệ thập lục phân : thêm 0x đầu
Kiểu float: float f = 43.3f ; // thêm f hay F cuối Kiểu double: double d = 3.12d ; // hay d=3.12
\b : backspace \” : dấu nháy kép ”
\t : tab ngang \’ : dấu nháy đơn ‘
\n : xuống dòng \\ : dấu sổ ngược \
\r : dấu enter ‘\x’ : mã ký tự dạng ASCII
\f : đẩy trang ‘\u’ : mã ký tự dạng UNICODE
- Có thể chuyển đổi giữa số và ký tự :
int i = (int) ‘0’; //in ra mã ASCII của ký tự → i = 48
2.3 Kiểu boolean:
- Kích thước : 1 bit
- Nhận 2 giá trị : true, false
- Ví dụ : boolean b = true;
- Các phép toán so sánh cho kết quả thuộc kiểu boolean : = =, >, <, !=, >=, <=
- Các phép toán dùng cho kiểu boolean : &, |, !
2.4 Toán tử điều kiện:
Trang 17- Toán tử điều kiện (?:) là một loại toán tử đặc biệt vì nó gồm ba thành phần cấu thành biểu thức điều kiện, hay nói cách khác toán tử điều kiện là toán tử 3 ngôi
- Cú pháp : < điều kiện > ? <biểu thức 1> : < biểu thức 2>
- Trong đó :
• điều kiện là một biểu thức logic (True / False)
• biểu thức 1, biểu thức 2 có thể là 2 giá trị, 2 biểu thức hay 2 hành động
→ Nếu điều kiện đúng thì biểu thức 1 sẽ được thực hiện, ngược lại thì biểu thức
2 sẽ được thực hiện
- Ví dụ :
int max=(5>7) ? 5:7 ; String result = a%2==0? "a la so chan": "a la so le";
3 Chuyển đổi kiểu dữ liệu
- Chuyển kiểu tự động: số có kiểu độ chính xác thấp sang số có kiểu độ chính xác cao
byte ->short -> int -> long -> float -> double
- Chuyển kiểu không tường minh:
Ví dụ:
int two =2, three =3;
float result = 1.5 + three / two;
float result = 1.5 + (float)three / two;
float result = 1.5 + three / (float)two;
float result = 1.5 + (float)three / (float)two;
- Chuyển kiểu tường minh (ép kiểu) :
• Phép toán chuyển kiểu là phép toán có độ ưu tiên cao
• Khi chuyển một biểu thức kiểu dữ liệu có miền giá trị lớn sang một kiểu có
miền giá trị nhỏ hơn thì có thể bạn sẽ bị mất thông tin
4 Nhập xuất console
- Thư viện nhập xuất: java.util.Scanner; java.io.*;
- Câu lệnh xuất: System.print.out(“Chuỗi cần xuất ra màn hình”);
- Câu lệnh nhập: Scanner in =new Scanner(System.in);
int a = in.nextInt(); //chọn kiểu dữ liệu phù hợp
Trang 18- Dạng 3:
- Ví dụ :
import java.util.Date;
class thu {
public static void main(String args[]) {
Date today=new Date();
if (today.getDay() == 0) System.out.println("Hom nay la ngay chu nhat.");
else System.out.println("Hom nay khong phai la ngay chu nhat."); }
}
5.2 Câu lệnh switch:
switch (biểu_thức)
{
case giá_trị_1 : lệnh 1; [break];
case giá_trị_2 : lệnh 2; [break];
public class CaseOp {
public static void main(String args[]) {
System.out.print("Enter a number character: ");
int ch = System.in.read();
switch(ch) {
case '0': { System.out.print("Zero");break;}
case '1': { System.out.print("One"); break;}
case '2': { System.out.print("Two"); break;}
Trang 19case '4': { System.out.print("Four"); break;}
case '5': { System.out.print("Five"); break;}
case '6': { System.out.print("Six"); break;}
case '7': { System.out.print("Seven");break;}
case '8': { System.out.print("Eight");break;}
case '9': { System.out.print("Nine"); break;}
default: { System.out.print("I don't know"); break;} }
} catch(IOException ie) { System.out.print("Error "+ie);
} }
public static void main(String args[]) {
Trang 20class vong_lap_while {
public static void main(String args[]) {
} System.out.println("Tong s =" + s);
} }
} while (điều kiện == true);
- Ví dụ: Viết đoạn lệnh cho phép nhập vào bàn phím số có giá trị từ 0-100, nếu nhập
ngoài khoảng [0-100] yêu cầu nhập lại
class vong_lap_while {
public static void main(String args[]) { do
< kiểu dữ liệu > <tên biến > [ ];
< kiểu dữ liệu >[ ] <tên biến >;
- Có 2 cách khai báo : cặp ngoặc vuông để sau tên biến hay đặt sau kiểu dữ liệu
Trang 21- Cần nhớ rằng mọi hoạt động trong Java đều thông qua các đối tượng , nên ta cần dùng từ khóa new để định vị một mảng trong vùng nhớ :
int a[ ] = new int [5];
char [ ] char_array = {‘a’, ’b’, ’c’, ’d’};
String [ ] string_array = { “abc”, “A”, “DEF”, “aaaaaaa”};
7.2 Truy cập một mảng :
- Các phần tử trong mảng luôn được đánh số thứ tự từ 0
- Để tham khảo giá trị của một phần tử trong mảng, ta gán số thứ tự của phần tử giữa
2 cặp ngoặc vuông [ ]
Ví dụ : int a[ ] = { 1, 2, 3, 4, 5};
int b = a[2]; // b = 3 int c = a[0]; // c = 1
- Để lấy về số phần tử của mảng ta sử dụng thuộc tính length: Tên_mảng.length
System.out.print("a[" + i + "]=");
a[i]= sn.nextInt();
//In mảng ra màn hình System.out.println("Mảng vừa nhập là");
for (int i = 0; i < a.length; i++) System.out.print(a[i] + " ");
} }
- Ví dụ 2: Nhập vào một mảng số thực sau đó kiểm tra xem mảng có phải là một dãy
tăng hay không
Trang 22if(kt) System.out.println("Day tang dan");
else System.out.println("Day khong phai tang dan"); }
}
8 Mảng 2 chiều
- Khai báo :
<kiểu dữ liệu> <tên biến>[ ][ ];
Hay <kiểu dữ liệu>[ ][ ] <tên biến>;
//In mảng hai chiều ra màn hình for (int i = 0; i < a.length; i++) { for (int j = 0; j < a[i].length; j++) System.out.print(a[i][j] + " ");
} }
Trang 239 Break và Continue
- Lệnh break sẽ chấm dứt quá trình lặp mà không thực hiện nốt phần còn lại của cấu trúc lặp Nếu có nhiều vòng lặp lồng nhau, thì lệnh break sẽ thoát khỏi vòng lặp mà
nó được đặt
- Lệnh continue sẽ ngưng thực thi phần còn lại của thân vòng lặp và chuyển điều khiển
về điểm bắt đầu của vòng lặp, để thực hiện lần lặp tiếp theo
- Ví dụ: Tìm kết quả thực thi đoạn chương trình sau:
public class BreakAndContinue { public static void main(String[] args) { for(int i = 0; i < 100; i++) { if(i == 74) break;
10 Math
- Các hàm toán học như abs, max, min, sqrt được java viết sẵn trong lớp Math
- Lớp này nằm trong gói java.lang (gói mặc định) do vậy bạn không cần phải thêm
câu lệnh import ở đầu chương trình để có thể sử dụng lớp này Các hàm này được viết là các phương thức tĩnh do vậy ta không cần phải tạo ra thể hiện của lớp Math
- Bảng sau liệt kê một số phương thức tĩnh trong lớp Math:
Phương thức Mô tả ý nghĩa Kiểu tham số Kiểu trả về
abs(arg) Tính giá trị tuyệt đối int, long, float, double Kiểu tham số max(arg1,arg2) Tìm giá trị lớn nhất int, long, float, double Kiểu tham số min(arg1,arg2) Tìm giá trị nhỏ nhất int, long, float, double Kiểu tham số ceil(arg) Nhận về giá trị nguyên
nhỏ hơn hoặc bằng arg
float, double double
floor(arg) Nhận về giá trị nguyên
lớn hơn hoặc bằng arg float, double double round(arg) Trả về giá trị nguyên
gần arg nhất
float, double float -> int
double -> long rint(arg) Giống round(arg) double double
sqrt(arg) Tính căn bậc hai double double
pow(arg1,arg2) Tính lũy thừa double double
Trang 24log(arg) Tính logarit hàm số e double double random() Nhận về một số giả
ngẫu nhiên nằm trong khoản [0, 1)
Không có tham số double
Trang 25Chương 3 HƯỚNG ĐỐI TƯỢNG TRONG JAVA
Lớp (class) là khái niệm trọng tâm của lập trình hướng đối tượng, java là ngôn ngữ lập trình hướng đối tượng, một chương trình java gồm một tập các đối tượng, các đối tượng này phối hợp với nhau để tạo thành một ứng dụng hoàn chỉnh Các đối tượng được mô tả qua khái niệm lớp, lớp là sự mở rộng khái niệm record trong pascal, hay struct của C, ngoài các thành phần dữ liệu, lớp còn có các hàm (phương thức, hành vi), ta có thể xem lớp là một kiểu dữ liệu, vì vậy người ta còn gọi lớp là kiểu dữ liệu đối tượng Sau khi định nghĩa lớp ta có thể tạo ra các đối tượng (bằng cách khai báo biến) của lớp vừa tạo, do vậy có thể quan niệm lớp là tập hợp các đối tượng cùng kiểu
1 Các thành phần trong file mã nguồn (*.java)
▪ package : Định nghĩa gói
▪ imports : Chỉ định các gói cần sử dụng
▪ classes : Định nghĩa các lớp
▪ interfaces : Định nghĩa các interface
▪ Comments : Các loại ghi chú
2 Khai báo class
- Khai báo một class:
3 Modifiers
- Cú pháp : <modifier><datatype><variable name>[=<init value>];
- Tính chất bổ sung của dữ liệu vào phương thức:
▪ public : có thể truy cập dữ liệu hay phương thức từ bên ngoài lớp định nghĩa nó
▪ private : chỉ được truy cập dữ liệu hay phương thức trong bản thân lớp định nghĩa
▪ protected : chỉ được truy cập dữ liệu hay phương thức trong bản thân lớp định nghĩa và những lớp dẫn xuất (lớp con) của lớp đó
▪ static : một dữ liệu hay phương thức chung cho mọi thực thể của lớp
▪ abstract : không được cài đặt gì trong lớp (lớp ảo)
▪ final : không bị định nghĩa chồng ở các lớp dẫn xuất (hằng)
- Chú ý:
▪ Các thuộc tính nên để mức truy cập private để đảm bảo tính dấu kín và lúc đó để bên ngoài phạm vi của lớp có thể truy cập được đến thành phần private này ta phải
tạo ra các phương thức get và set
▪ Các phương thức thường khai báo là public, để chúng có thể truy cập từ bất cứ đâu
class className
{
type data1; //thuộc tính 1
type data1; //thuộc tính 2
return radius*radius*3.14;
} }
Trang 26▪ Trong một file chương trình chỉ (hay còn gọi là một đơn vị biên dịch) chỉ có một lớp
được khai báo là public, và tên lớp public này phải trùng với tên của file kể cả chữ
hoa, chữ thường
- Ví dụ: Tạo một hồ sơ của học sinh gồm: Họ tên học sinh và Tổng số học sinh sau khi
tạo xong đối tượng?
class hoso
{ static int tongHS;
String hoten;
hoso(String ht) {
tongHS++;
hoten = ht;
} static void tongket() {
System.out.println("Tong so hs: "+ tongHS);
} void xuatHS() {
System.out.println(""+hoten);
} }
public class HocSinh{
public HocSinh() { }
public static void main(String[] args) {
hoso hs1 = new hoso("Trinh Van Minh");
hoso hs2 = new hoso("Nguyen Nghiem");
hoso hs3 = new hoso("Nguyen Van Kien");
hoso hs4 = new hoso("Nguyen Khoa Diem");
4 Viết chồng và viết đè (Overloading & Overriding)
- Đa năng hóa phương thức là tạo ra nhiều phương thức có cùng tên và khác nhau ở tham
số (số lượng tam số và kiểu của tham số)
} static void test (int a, int b) { System.out.println(“Tham so la ca so nguyen :” + a + “ va ” + b);
Trang 27} static void test(double d) { System.out.println(“ Tham so la so thuc: ” + d );
} public static void main (String args[]) { test();
5 Giao tiếp (interface)
- Java không cho phép đa kế thừa, thay vào đó, chúng ta có thể ứng dụng giao diện (interface) để khắc phục hạn chế của kế thừa đơn
- Giao diện là một lớp đặc biệt trong Java: giao diện cũng được biên dịch thành file chứa
mã bytecode (file.class) như các lớp bình thường, nhưng không thể tạo thực thể
- Cấu trúc một giao diện :
Các dữ liệu là dữ liệu hằng (public static final)
Các phương thức đều là phương thức ảo
<modifier>interface< InterfaceName>
→ Giao diện cũng phải được đặt trong file <InterfaceName>.java
6 Kế thừa trong java
6.1 Khái niệm:
- Sự kế thừa là việc xây dựng một lớp mới dựa trên lớp đã có sẵn
- Khi đó, lớp mới sẽ có tất cả các thuộc tính, dữ liệu và phương thức của lớp cũ Và lớp mới có thể tái sử dụng hay thay đổi phương thức của lớp cũ, cũng như bổ sung thêm dữ liệu mới và phương thức mới
- Ta gọi lớp mới là lớp dẫn xuất hay lớp con (subclass) Lớp cũ là siêu lớp hay lớp cha (superclass)
- Để chỉ ra việc kế thừa, ta dùng từ khóa extends
- Ví dụ : class Cylinder extends Circle
Lớp Cylinder kế thừa lớp Circle
Lớp Circle gọi là lớp cha hay siêu lớp (superclass)
Lớp Cylinder gọi là lớp dẫn xuất hay lớp con (subclass)
6.2 Từ khóa "this":
- Dùng để tham chiếu đến các thuộc tính của đối tượng đó bên trong của một phương thức
- Trong một số tình huống đặc biệt như tên của tham số trùng với tên của thuộc tính,
lúc đó để chỉ các thành viên của đối tượng đó ta dùng từ khóa this, từ khóa this dùng
để chỉ đối tượng này
6.3 Từ khóa "final":
Trang 28- Trong java cách duy nhất để tạo ra một hằng là khai báo thuộc tính là final
- Ví dụ:
public class A {
// định nghĩa hằng tên MAX_VALUE giá trị 100
static final int MAX_VALUE = 100;
public static void main (String arg[] ){
• Khi đã khai báo một thuộc tính là final thì thuộc tính này là hằng, do vậy ta không
thể thay đổi giá trị của nó
• Khi khai báo một thuộc tính là final thì ta phải cung cấp giá trị ban đầu cho nó
• Nếu một thuộc tính vừa là final vừa là static thì nó chỉ có một vùng nhớ chung
duy nhất cho cả lớp
6.4 Hàm khởi tạo (contructor)
- Dùng để khởi tạo đối tượng mới, để khởi gián giá trị cho các thuộc tính của đối tượng
và có thể thực hiện một số công việc cần thiết khác nhằm chuẩn bị cho đối tượng mới
- Đặc điểm của hàm khởi tạo:
• Trùng tên với tên của lớp
• Không bao giờ trả về giá trị
• Nó được Java gọi tự động khi một đối tượng của lớp được tạo ra
• Hàm có thể có đối số như các phương thức thông thường khác
• Trong một lớp có thể có nhiều hàm tạo
- Ví dụ: Sử dụng hàm khởi tạo để in ra màn hình xâu "Creating Rock"
• Hàm khởi tạo không có đối số:
class Rock { Rock() { // Đây là hàm khởi tạo System.out.println("Creating Rock");
} } public class SimpleConstructor { public static void main(String[] args) { for(int i = 0; i < 10; i++) new Rock(); // gọi hàm khởi tạo }
}
• Hàm khởi tạo có đối số:
class Rock { Rock(int i) { System.out.println("Creating Rock number " + i);
} } public class SimpleConstructor { public static void main(String[] args) { for(int i = 0; i < 10; i++)
Trang 29new Rock(i);
} }
6.5 Từ khóa “super” :
- Dùng để tham chiếu đến lớp cha của lớp hiện hành (dùng tương tự từ khóa this)
- Có 2 cách để áp dụng từ khóa super :
• Gọi constructor của lớp cha (được gọi đầu tiên trong constructor của lớp con)
• Gọi phương thức của lớp cha
- Ví dụ: TestCylinder.java
public class TestCylinder
{
public static void main(String[] args) {
Cylinder myCylinder = new Cylinder(5.0, 2.0);
System.out.println("The length is " + myCylinder.getLength());
System.out.println("The radius is " + myCylinder.getRadius());
System.out.println("The volume of the cylinder is " + myCylinder.findVolume());
System.out.println("The area of the circle is " + myCylinder.findArea()); }
}
class Circle
{
private double radius;
private String color;
static double weight; //Bien lop
Trang 30public double findVolume() { // tính thể tích hình trụ
return findArea()*length; //phương thức findArea() kế thừa từ lớp cha
}
}
7 Tính đa hình trong java
- Tính đa hình trong lập trình hướng đối tượng đề cập đến khả năng quyết định trong lúc thi hành (runtime) mã nào sẽ được chạy, khi có nhiều phương thức trùng tên nhau nhưng
ở các lớp có cấp bậc khác nhau
- Tính đa hình cho phép các vấn đề khác nhau, các đối tượng khác nhau, các phương thức khác nhau, các cách giải quyết khác nhau theo cùng một lược đồ chung
- Các bước để tạo tính đa hình:
• (1) Xây dựng lớp cơ sở (thường là lớp cơ sở trừu tượng, hoặc là một giao diện), lớp này sẽ được các lớp con mở rộng (đối với lớp thường, hoặc lớp trừu tượng)
• (2) Xây dựng các lớp dẫn xuất từ lớp cơ sở vừa tạo trong lớp dẫn xuất này ta sẽ ghi đè các phương thức của lớp cơ sở (đối với lớp cơ sở thường), hoặc triển khai chi tiết nó (đối với lớp cơ sở trừu tượng hoặc giao diện)
- Ví dụ:
• Viết chương trình tính lương cho Nhân Viên gồm: HoTen, DiaChi, Lương
• Các phương thức: Xuất thông tin nhân viên, tính Lương
• Công ty có 2 phòng ban là NV_VP và NV_SX
- NV_VP : tính lương theo ngày công (Lương =(Số ngày công/22)*700000)
- NV_SX: tính luơng theo số sản phẩm (Lương =Số sản phẩm*20000)
• Ý tưởng:
Trang 31abstract class NHANVIEN
return (sonc/22 * 700);
} public void xuat_vp() {
xuat();
System.out.println("Tien luong la: " + tinhluong());
System.out.println(" -");
} }
class NV_SX extends Nhanvien
return (sosp * 200);
} public void xuat_sx() {
NV_SX
Thuộc tính: So_spPhương thức: Tinh_luong, Xuat
Trang 32} }
public class kt {
public static void main(String[] args) {
NV_VP a = new NV_VP("Nguyen xuan Nhut","Tien Giang",20); a.xuat_vp();
NV_SX sx = new NV_SX("Nguyen An","Can Tho",45);
sx.tinhluong();
sx.xuat_sx();
}
}
Trang 33Chương 4 LỚP XỬ LÝ ỨNG DỤNG JAVA
1 Xử lý loại trừ (ngoại lệ)
1.1 Khái niệm
- Đối với người lập trình họ có thể gặp một trong các lỗi sau:
• Lỗi cú pháp (syntac error)
• Lỗi logic thuật toán
• Lỗi lúc thực thi (runtime error)
- Đối với lỗi cú pháp người lập trình có thể phát hiện và sửa lỗi, dựa vào trình biên dịch, đây là lỗi dễ phát hiện và sửa chữa, tuy nhiên đây cũng là lỗi gây khó khăn và chán nản đối với người mới học lập trình
- Đối với lỗi thuật toán, đây là lỗi khó phát hiện và sửa chữa nhất, tuy nhiên trong bài này
ta không bàn luận về vấn đề này
- Đối với lỗi lúc thực thi, ta hoàn toàn có thể kiểm soát được chúng, thông thường lỗi runtime thường do nguyên nhân khách quan như: truy cập vào một ổ đĩa nhưng ổ đĩa này lại chưa sẵn sàng, hay thực hiện phép chia nhưng mẫu số lại bằng 0, kết nối với máy tính
ở xa nhưng máy đó lại không tồn tại…, khi một lỗi runtime xẩy ra JVM sẽ phát sinh một ngoại lệ, nếu một chương trình không cung cấp mã xử lý ngoại lệ thì chương trình có thể kết thúc không bình thường
- Là lỗi xuất hiện trong quá trình chương trình thực hiện của đoạn code Nếu không xử lý thì chương trình có thể bị dừng
1.2 Mục đích của việc xử lý ngoại lệ
- Một chương trình nên có cơ chế xử lý ngoại lệ thích hợp Nếu không, chương trình sẽ bị ngắt khi một ngoại lệ xảy ra Trong trường hợp đó, tất cả các nguồn tài nguyên mà hệ thống đã cấp không được giải phóng, điều này gây lãng phí tài nguyên Để tránh trường hợp này, tất cả các nguồn tài nguyên mà hệ thống cấp nên được thu hồi lại Tiến trình này đòi hỏi cơ chế xử lý ngoại lệ thích hợp
- Ví dụ, xét thao tác vào ra (I/O) trong một tập tin Nếu việc chuyển đổi kiểu dữ liệu không thực hiện đúng, một ngoại lệ sẽ xảy ra và chương trình bị hủy mà không đóng tập tin lại Lúc đó tập tin dễ bị hư hại và các nguồn tài nguyên được cấp phát cho tập tin không được trả lại cho hệ thống
1.3 Mô hình xử lý ngoại lệ của Java
Mô hình xử lý ngoại lệ của java dựa trên ba hoạt động chính: đặc tả ngoại lệ, ném ra
ngoại lệ, và bắt ngoại lệ
- Đặc tả ngoại lệ: là khai báo cho trình biên dịch biết là phương thức này có thể gây ra
ngoại lệ lúc thi hành Để khai báo ngoại lệ ta sử dụng từ khoá throws trong khai báo phương thức:
Ví dụ:
public void myMethod() throws IOException, RemoteException // từ khoá throws chỉ cho trình biên dịch java biết rằng phương thức này có thể ném ra ngoại lệ
Trang 34IOException và RemoteException, nếu một phương thức ném ra nhiều ngoại lệ thì các
ngoại lệ được khai báo cách nhau bởi dấu phẩy ‘,’
- Bắt ngoại lệ: là dấu hiệu chỉ ra rằng có sự xuất hiện một điều kiện không bình thường
catch (TypeException1 ex){
//Mã đựơc thực thi khi một ngoại lệ TypeException1
//đựơc phát sinh trong khối try
}
catch (TypeException2 ex){
//Mã đựơc thực thi khi một ngoại lệ TypeException2
//đựơc phát sinh trong khối try
}
catch ( TypeExceptionN ex){
// Mã đựơc thực thi khi một ngoại lệ TypeExceptionN
//đựơc phát sinh trong khối try
} finally{ //khối lệnh này là tùy chọn, có thể có hoặch không,
// nếu có thì khối lệnh này luôn được thực hiện cho dù
//ngoại lệ có xảy ra trong khối try hay không
}
- Khối finally: khi một ngoại lệ xuất hiện, phương thức đang được thực thi có thể bị dừng
mà không được hoàn thành Nếu điều này xảy ra, thì các đoạn mã phía sau sẽ không bao giờ được gọi Java cung cấp khối finally để giải quyết việc này Thông thường khối finally chứa các câu lệnh mang tính chất dọn dẹp như: đóng kết nối CSDL, đóng tệp tin,…
- Khối finally là tuỳ chọn, không bắt buộc phải có Khối này được đặt sau khối catch cuối cùng Chương trình sẽ thực thi câu lệnh đầu tiên của khối finally ngay sau khi gặp câu lệnh return hay lệnh break trong khối try
- Khối finally bảo đảm lúc nào cũng được thực thi, bất chấp có ngoại lệ xảy ra hay không
1.4 Một số lớp ngoại lệ:
Tên lớp ngoại lệ Ý nghĩa
Throwable Đây là lớp cha của mọi lớp ngoại lệ trong Java
Exception Đây là lớp con trực tiếp của lớp Throwable, nó
mô tả một ngoại lệ tổng quát có thể xẩy ra trong ứng dụng
RuntimeException Lớp cơ sở cho nhiều ngoại lệ java.lang
ArthmeticException Lỗi về số học, ví dụ như ‘chia cho 0’
IllegalAccessException Lớp không thể truy cập
Trang 35IllegalArgumentException Đối số không hợp lệ
ArrayIndexOutOfBoundsExeption Lỗi truy cập ra ngoài mảng
NullPointerException Khi truy cập đối tượng null
SecurityException Cơ chế bảo mật không cho phép thực hiện
ClassNotFoundException Không thể nạp lớp yêu cầu
NumberFormatException Việc chuyển đối từ chuỗi sang số không thành
công
FileNotFoundException Không thể định vị tập tin
NoSuchMethodException Phương thức yêu cầu không tồn tại
InterruptedException Khi một luồng bị ngắt
2 Xử lý toán học
- Lớp final class Math định nghĩa một tập các hàm tĩnh để thực hiện các chức năng chung
của toán học như các phép làm tròn số, sinh số ngẫu nhiên, tìm số cực đại, cực tiểu, v.v
- Lớp final class Math còn cung cấp những hằng số như số e (cơ số của logarithm), số pi
thông qua Math.E và Math.PI
2.1 Hàm abs()
• static int abs(int i);
• static long abs(long l);
• static float abs(float f);
• static double abs(double d);
Hàm abs() được nạp chồng để trả lại giá trị tuyệt đối của đối số
2.2 Các hàm làm tròn
• static double ceil(double d): trả lại giá trị nhỏ nhất kiểu double mà không nhỏ hơn
đối số và lại bằng số nguyên
Ví dụ: ceil(3.14) //4.0
• static double floor(double d): trả lại giá trị lớn nhất kiểu double mà không lớn
hơn đối số và lại bằng số nguyên
Ví dụ: floor(3.14) //3.0
• static int round(float f d)
• static long round(double d)
Hàm round() được nạp chồng để trả lại số nguyên gần nhất của đối số
2.3 Hàm max(); min()
• static int max(int a, int b)
• static long max(long a, long b)
• static float max(float a, float b)
• static double max(double a, double b)
Hàm max() được nạp chồng để trả lại giá trị cực đại của hai đối số
Trang 36• static int min(int a, int b)
• static long min(long a, long b)
• static float min(float a, float b)
• static double min(double a, double b)
Hàm min() được nạp chồng để trả lại giá trị cực tiểu của hai đối số
2.4 Các hàm lũy thừa
• static double pow(double d1, double d2)
Hàm pow() trả lại giá trị là lũy thừa của d1 và d2 (d1,d2)
• static double exp(double d): trả lại giá trị là luỹ thừa cơ số e và số mũ d (ed)
• static double log(double d): trả lại giá trị là lô-ga-rit tự nhiên (cơ số e) của d
• static double sqrt(double d):trả lại giá trị là căn bậc hai của d , hoặc giá trị NaN nếu đối số âm
2.5 Các hàm lượng giác
• static double sin(double d): trả lại giá trị sine của góc d dưới dạng radian
• static double cos(double d: trả lại giá trị là cose của góc d dưới dạng radian
• static double tan(double d): trả lại giá trị là tangent của góc d dưới dạng radian
2.6 Hàm sinh số ngẫu nhiên
• static double random(): cho lại giá trị là số ngẫu nhiên trong khoảng từ 0.0 đến
1.0
3 Xử lý chuỗi trong java
- Java được hỗ trợ bởi hai lớp String và StringBuffer để xử lý chuỗi
- Lớp String dùng cho những xâu ký tự bất biến, nghĩa là những xâu chỉ đọc và sau khi
dược khởi tạo giá trị thì nội dung bên trong xâu không thể thay đổi được
- Lớp StringBuffer được sử dụng đối với những xâu ký tự động, tức là có thể thay đổi
được nội dung bên trong của xâu
3.1 Lớp String:
- Chuỗi là một dãy các ký tự Lớp String cung cấp các phương thức để thao tác với
các chuỗi Nó cung cấp các phương thức khởi tạo (constructor) khác nhau:
String str1 = new String( ); //str1 chứa một chuỗi rỗng
String str2 = new String(“Hello World”); //str2 chứa xâu “Hello World”
Char ch[] = {‘A’,’B’,’C’,’D’,’E’};
String str3 = new String(ch); //str3 chứa “ABCDE”
String str4 = new String(ch,0,2); /*str4 chứa “AB” vì 0- tính từ ký tự bắt đầu, 2- là số lượng ký tự kể từ ký tự bắt đầu.*/
- Toán tử “+” được sử dụng để cộng chuỗi khác vào chuỗi đang tồn tại Toán tử “+” này được gọi như là “nối chuỗi”
- Các phương thức của lớp String:
• char CharAt(int index): trả về một ký tự tại vị trí index trong chuỗi
String name = new String(“Java Language”);
char ch = name.CharAt(5);
• boolean startsWith(String s): trả về giá trị kiểu logic (Boolean), phụ thuộc vào chuỗi có bắt đầu với một chuỗi con cụ thể nào đó không
Trang 37String strname = “Java Language”;
boolean flag = strname.startsWith(“Java”); //flag = true
• boolean endsWith(String s): trả về một giá trị kiểu logic (boolean), phụ thuộc
vào chuỗi kết thúc bằng một chuỗi con nào đó không
String strname = “Java Language”;
boolean flag = strname.endsWith(“Java”); //flag = true
• String copyValueOf(char data[], int offset, int count): trả về một chuỗi được rút
ra từ một mảng ký tự data được truyền như một đối số Tham số offset chỉ định
vị trí từ nơi các ký tự bắt đầu được rút ra, và tham số count chỉ định số ký tự được rút ra từ mảng data
Char name[] = {‘L’,’a’,’n’,’g’,’u’,’a’,’g’,’e’};
String subname = String copyValueOf(name,5,2); //subname = ag
• Char[] toCharArray( ): chuyển chuỗi thành một mảng ký tự
String text = new String(“Hello World”);
Char textArray[] = text.toCharArray( );
• int indexOf(String sunString ): trả về thứ tự của một ký tự nào đó, hoặc một
chuỗi trong phạm vi một chuỗi Các câu lệnh sau biểu diễn các cách khác nhau của việc sử dụng hàm
String day = new String(“Sunday”);
int index1 = day.indexOf(‘n’); //chứa 2 int index2 = day.indexOf(‘z’,2); //chứa –1 nếu “z”không tìm thấy tại vị trí 2 int index3 = day.indexOf(“Sun”);//chứa mục 0
• String toUpperCase( ): trả về chữ hoa của chuỗi
String lower = new String(“good morning”);
System.out.println(“Uppercase: ”+lower.toUpperCase( ));
• String toLowerCase( ): trả về chữ thường của chuỗi
String upper = new String(“JAVA”);
System.out.println(“Lowercase: “+upper.toLowerCase( ));
• String trim(): dùng để cắt bỏ khoảng trắng hai đầu chuỗi Hãy thử đoạn mã sau
để thấy sự khác nhau trước và sau khi cắt bỏ khoảng trắng
String space = new String(“ Spaces “);
System.out.println(space);
System.out.println(space.trim()); //Sau khi cắt bỏ khoảng trắng
• boolean equals(String s): so sánh nội dung của hai đối tượng chuỗi
String name1 = “Java”, name2 = “JAVA”;
boolean flag = name1.equals(name2); //flag = false
• Các phương thức valueOf
Được nạp chồng để cho phép chuyển một giá trị thành xâu:
- static String valueOf(Object obj): chuyển một đối tượng thành xâu, bẳng cách
gọi đến phương thức toString của đối tượng obj
- static String valueOf(Char[] Characters): chuyển mảng các ký tự thành xâu
- static String valueOf(boolean b): chuyển một giá trị logic thành xâu, xâu nhận
được là “true” hoặc “false” tương ứng với giá trị true hoặc false của b
- static String valueOf(Char c)//Chuyển kí tự thành xâu
- static String valueOf(int i) //chuyển một số nguyên thành xâu
- static String valueOf(long l) //Chuyển một giá trị long thành xâu
Trang 38- static String valueOf(float f) //chuyển một giá trị float thành xâu
- static String valueOf(Double d) //chuyển một giá trị Double thành xâu
- Ví dụ:
class chuoi {
public static void main(String args[])
String s, s1, s2 = new String();
s="1234567890";
for(int k=s.length()-1; k>=0; k ) { s1 =s.substring(k, k+1);
- Các phương thức của lớp StringBuffer:
• void append(): nối thêm một chuỗi hoặc một mảng ký tự vào cuối cùng của đối
tượng StringBuffer
StringBuffer s1 = new StringBuffer(“Good”);
s1.append(“evening”); //s1= Goodevening
• void insert(int, char): phương thức này có hai tham số Tham số đầu tiên là vị trí
chèn Tham số thứ hai có thể là một chuỗi, một ký tự (Char), một giá trị nguyên (int), hay một giá trị số thực (float) được chèn vào Vị trí chèn sẽ lớn hơn hay bằng 0, và nhỏ hơn hay bằng chiều dài của đối tượng StringBuffer Bất kỳ đối số
nào, trừ ký tự hoặc chuỗi, được chuyển sang chuỗi và sau đó mới được chèn vào
StringBuffer str = new StringBuffer(“Jva sion”);
str.insert(1,’a’); //str = Java sion
• Char CharAt(): trả về một giá trị ký tự trong đối tượng StringBuffer tại vị
trí được chỉ định
StringBuffer str = new StringBuffer(“James Gosling”);
Char letter = str.CharAt(6); //letter = “G”
• void setCharAt(int index, Char value): sử dụng để thay thế ký tự trong một StringBuffer bằng một ký tự khác tại một vị trí được chỉ định
StringBuffer name = new StringBuffer(“Java”);
name.setCharAt(2,’v’); //name = Java
• void setLength(): thiết lập chiều dài của đối tượng StringBuffer Nếu chiều
dài được chỉ định nhỏ hơn chiều dài dữ liệu hiện tại của nó, thì các ký tự thừa sẽ
bị cắt bớt Nếu chiểu dài chỉ định nhiều hơn chiều dài dữ liệu thì các ký tự
null được thêm vào phần cuối của StringBuffer
StringBuffer str = new StringBuffer(10);
str.setLength(str.length() +10);
• Char[] getChars(): được sử dụng để trích ra các ký tự từ đối tượng StringBuffer,
Trang 39và sao chép chúng vào một mảng Phương thức getChars() có bốn tham số sau:
o Chỉ số đầu: vị trí bắt đầu, từ nơi mà ký tự được lấy ra
o Chỉ số kết thúc: vị trí kết thúc
o Mảng: Mảng đích, nơi mà các ký tự được sao chép
o Vị trí bắt đầu trong mảng đích: Các ký tự được sao chép vào mảng đích từ
vị trí này
StringBuffer str = new StringBuffer(“Leopard”);
Char ch[] = new Char[10]; str.getChars(3,6,ch,0); //ch = par
• void reverse(): Phương thức này đảo ngược nội dung của một đối tượng
StringBuffer, và trả về một đối tượng StringBuffer khác
StringBuffer str = new StringBuffer(“devil”);
StringBuffer strrev = str.reverse(); //strrev = lived
public static void main(String args[]) {
Date today=new Date();
- Ví dụ 2: Kiểm tra có phải năm nhuận hay không?
public static bookean isLeapYear(int year) {
if((year%100!=0) && (year%400==0)){
public static void daysInMonth() {
TimeInJava tij = new TimeInJava();
Calendar c1 = Calendar.getInstance();
c1.set(2008, 6 , 20);
int year = c1.get(Calendar.YEAR);
int month = c1.get(Calendar.MONTH);
Trang 405 Xử lý tập hợp nâng cao
5.1 Vector
- Vector là mảng không giới hạn số phần tử
- Vector có cớ chế đồng bộ hóa dữ liệu vì thế chúng ta có thể cập nhật chúng tại nhiều uồng khác nhau
- Ứng dụng Vector : dữ liệu theo dạng tập hợp, làm nguồn dữ liệu cho List, ComboBox, Table
- Khai báo Vector: Vector <tên_vector> = new
• Vector: class Vector được cài đặt trong thư viện Java
• <tên_vector>: đặt theo quy tắc đặt tên biến
• new: từ khóa dùng để khai báo đối tượng
• Vector(): phương thức khởi tạo mặc định của Vector, có thể được thay thế bằng
Vector(int), Vector(int, int)
- Sử dụng Vector: <tên_vector>.<phương_thức>(tham số)
• <tên_vector>: được khai báo trước khi sử dụng
• <phương_thức>: được cài đặt trong thư viện java thuộc gói java.util.Vector
• Tham số: mỗi phương thức các tham số khác nhau
• Kiểu dữ liệu trả về : tùy thuộc vào kiểu dữ liệu trả về của phương thức để dùng
biến lưu trữ hay không
- Phương thức cho Vector:
Khai báo: Vector v = new Vector();
• void v.add(tham_so): thêm phần tử vào Vector v
• int v.size(): số phần tử của Vector v
• Object v.get(int i): lấy giá trị phần tử thứ i trong Vector
• int v.indexOf(“XYZ”) : trả về vị trí phần tử “XYZ” trong Vector v, nếu không tìm
thấy trả về -1
• void v.remove(“XYZ”) : xóa phần tử “XYZ” ra khỏi Vector v
• void v.clear() : xóa tất cả các phần tử trong Vector v
• Collection.sort(v) : sắp xếp các phần tử trong Vector v
- Ví dụ 1: Tạo ngẫu nhiên n số phần tử cho Vector (0<n<20), giá trị của các phần tử
được sinh ngẫu nhiên trong khoảng [0 – 100]
Vector vso=new Vector();
int sopt = (int)(Math.random()*20)+1;
for(int i=0 ; i<sopt ; i++)
vso.add((int)(Math.random()*100));
lstSo.setListData(vso);
- Ví dụ 2: Trò chơi đoán số: nhập 1 số nguyên dương bất kỳ, sinh ngẫu nhiên 100
nguyên dương bất kỳ, nếu số vừa nhập trùng với số sinh ngẫu nhiên thì đoán đúng, ngược lại thì đoán sai
Vector vso=new Vector();
int sophantu = (int)(Math.random()*20)+1;
int n=Integer.parseInt(this.txtSo.getText());