1. Trang chủ
  2. » Luận Văn - Báo Cáo

Bài giảng: LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

261 2 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Lập Trình Hướng Đối Tượng
Tác giả Ths. Bùi Công Giao
Trường học Học Viện Công Nghệ Bưu Chính Viễn Thông
Chuyên ngành Công Nghệ Thông Tin
Thể loại Bài giảng
Năm xuất bản 2010
Thành phố Tp. Hồ Chí Minh
Định dạng
Số trang 261
Dung lượng 1,8 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Bài giảng: LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

Trang 1

CƠ SỞ TẠI TP HỒ CHÍ MINH

Bài gi ảng:

Tài liệu dùng cho hệ Đại học ngành Công Nghệ Thông Tin

Đã được Hội đồng khoa học khoa

Thông qua ngày 18/09/2010

LƯU HÀNH NỘI BỘ

Tp Hồ Chí Minh – Năm 2010

Trang 2

Lời nói đầu

Lập trình là một kỹ năng rất cần thiết cho sinh viên ngành Công nghệ thông tin Sau khi đã học qua lập trình căn bản với ngôn ngữ C, sinh viên sẽ được tiếp cận với một phương pháp lập trình theo tư duy mới, gần với thế giới thực hơn, phù hợp với các dự

án phần mềm lớn, đó là lập trình hướng đối tượng

Nội dung môn học này bao gồm những khái niệm, mô hình về đối tượng và phương pháp lập trình hướng đối tượng bằng ngôn ngữ lập trình Java Các đặc trưng quan trọng của lập trình hướng đối tượng như đóng gói, kế thừa, đa hình…và các quan hệ lớp; xử lý vào/ra, xử lý ngoại lệ, lập trình luồng xử lý và giao tiếp sẽ được thể hiện trong Java

Bài giảng này được biên soạn chủ yếu dựa vào hai quyển sách : Beginning Java

Objects: From Concepts to Code, Second Edition, Apress, 2005 của Jacquie Barker và

Bài giảng Lập trình Hướng đối tượng, Học viện Công nghệ Bưu chính Viễn thông của

Trần Đình Quế và Nguyễn Mạnh Hùng, Người soạn chân thành cảm ơn các tác giả

trên

Trang 3

Mục lục

Chương 1 Tổng quan về lập trình hướng đối tượng 1

1.1 Phương pháp tiếp cận của lập trình truyền thống 1

1.1.1 Lập trình tuyến tính 1

1.1.2 Lập trình cấu trúc 1

1.2 Phương pháp tiếp cận lập trình hướng đối tượng 3

1.3 Các đặc trưng của lập trình hướng đối tượng 3

1.3.1 Tính đóng gói dữ liệu 3

1.3.2 Tính kế thừa 4

1.3.3 Tính đa hình 4

1.4 Trừu tượng hóa 4

1.4.1 Tổ chức trừu tượng theo sự phân cấp lớp 4

1.4.2 Trừu tượng hóa – cơ sở của phát triển phần mềm 5

1.5 Xu hướng phát triển của lập trình hướng đối tượng 6

1.5.1 Lập trình hướng thành phần (Component-oriented programming-COP) 6

1.5.2 Lập trình hướng tác nhân 7

1.5.3 Lập trình hướng khía cạnh 7

Chương 2 Cơ bản ngôn ngữ lập trình Java 9

2.1 Đặc trưng của ngôn ngữ Java 9

2.2 Kiến trúc chương trình và cơ chế thực thi của Java 14

2.3 Các kiểu dữ liệu cơ bản và biến 18

2.3.1 Kiểu dữ liệu cơ bản 18

2.3.2 Biến 19

2.3.2.1 Khai báo biến 19

2.3.2.2 Phạm vi hoạt động của biến 20

2.3.2.3 Khởi tạo biến 20

2.3.2 4 Ép kiểu 20

2.4 Các toán tử và biểu thức 21

2.4.1 Các toán tử 21

Trang 4

2.5 Các cấu trúc lệnh 26

2.5.1 Lệnh if-else 26

2.5.2 Lệnh switch-case 27

2.5.3 Vòng lặp while 28

2.5.4 Vòng lặp do-while 29

2.5.5 Vòng lặp for 29

2.6 Phong cách lập trình 31

2.7 Case Study 33

Chương 3 Đối tượng và lớp 38

3.1 Phân rã phần mềm theo cách tiếp cận hướng đối tượng 38

3.2 Khái niệm đối tượng 39

3.3 Khái niệm lớp 42

3.4 Khái n iệm đóng gói 43

3.5 Biến tham chiếu 44

3.6 Khởi tạo đối tượng 45

Chương 4 Tương tác giữa các đối tượng 50

4.1 Cộng tác giữa các đối tượng 50

4.2 Thuộc tính 51

4.3 Phương thức 52

4.3.1 Khai báo phương thức 52

4.3.2 Biến this 53

4.3.3 Gọi phương thức 53

4.3.4 Nạp chồng phương thức 54

4.3.5 Phương thức xây dựng 54

4.3.6 Che dấu thông tin 56

4.4 Truyền thông điệp giữa các đối tượng 57

Chương 5 Quan hệ giữa các đối tượng 61

5.1 Kết hợp và liên kết 61

5.2 Kế thừa 63

5.3 Đa hình 64

Trang 5

5.5 Giao tiếp 73

5.6 Tính chất tĩnh 75

5.7 Kiểu liệt kê 78

5.8 Case Study 82

Chương 6 Tập đối tượng 94

6.1 Khái niệm tập đối tượng 94

6.2 Ba kiểu tập đối tượng cơ bản 94

6.3 Mảng 96

6.4 Các loại tập đối tượng thường gặp 99

6.4.1 LinkedList 99

6.4.2 HashMap 101

6.4.3 TreeMap 103

6.4.4 HashSet 105

6.4.5 TreeSet 106

6.5 Tạo kiểu tập hợp 107

6.6 Ph ương thức trả về kiểu tập hợp 109

Chương 7 Xử lý ngoại lệ 112

7.1 Giới thiệu ngoại lệ 112

7.2 Cơ chế xử lý ngoại lệ 114

7.2.1 Khối try 114

7.2.2 Khối catch 114

7.2.3 Khối finally 118

7.3 Bắt các ngoại lệ 120

7.4 Phân cấp lớp ngoại lệ 125

7 5 Các điểm cần lưu ý thêm về ngoại lệ 128

7.5.1 Bắt ngoại lệ tổng quát 128

7.5.2 Trình biên dịch Java yêu cầu phải có xử lý ngoại lệ 128

7.5.3 Tận dụng xử lý ngoại lệ để làm rõ lỗi phát sinh 130

7.5.4 try/catch lồng nhau 130

7.5.5 Kiểu ngoại lệ do người dùng định nghĩa 131

Trang 6

7.6 Case Study 133

Chương 8 Xử lý vào/ra 137

8.1 Luồng vào/ra 137

8.1.1 Giới thiệu luồng vào/ra 137

8.1.2 Luồng byte 138

8.1.3 Luồng ký tự 140

8.1.4 Luồng bộ đệm 141

8.2 Scanning và Formatting 143

8.2.1 Scanning 143

8.2.2 Formatting 146

8.3 Vào ra từ chế độ dòng lệnh 148

8.3.1 Vào ra qua luồng chuẩn 148

8.3.2 Vào ra qua Console 154

8 4 Làm việc với CSDL 157

8.4.1 JDBC 157

8.4.1.1 Giới thiệu JDBC 157

8.4.1.2 Kiến trúc JDBC 157

8.4.2 MySQL và Java 158

8.4.2.1 Cài đặt Connector/J - JDBC Driver của MySQL 158

8.4.2.2 Kiểm tra Connector/J 159

8.4.2.3 Thực hiện các câu truy vấn 160

Chương 9 Lập trình giao diện 166

9.1 Giao diện với các đối tượng cơ bản 166

9.1.1 Các đối tượng container cơ bản 166

9.1.1.1 Frame 166

9.1.1.2 Panel 167

9.1.1.3 Dialog 168

9.1.2 Các đối tượng component cơ bản 169

9.1.2.1 Label 169

9.1.2.2 TextField và TextArea 170

9.1.2.3 Button 172

Trang 7

9.2 Giao diện với các đối tượng Multimedia 180

9.2.1 Ô đánh dấu và nút chọn 180

9.2.2 Lựa chọn 182

9.2.3 Danh sách 184

9.3 Các kỹ thuật trình bày 186

9.3.1 Trình bày Flow Layout 186

9.3.2 Trình bày Grid Layout 187

9.3.3 Trình bày Border Layout 189

9.3.4 Trình bày GridBag Layout 190

9.3.5 Trình bày Null Layout 192

9.4 Applet 193

9.4.1 Cấu trúc của một Applet 194

9.4.2 Sử dụng Applet 195

9.4.3 Truyền tham số cho Applet 199

9.5 SWING 200

9.5.1 Mở rộng các đối tượng component 201

9.5.2 Mở rộng các đối tượng container 202

9.6 Case Study 210

Chương 10 Luồng xử lý 219

10.1 Giới thiệu luồng 219

10.2 Tạo và quản lý luồng 220

10.2.1 Tạo luồng 220

10.2.2 Phương thức của lớp luồng 223

10.2.3 Quyền ưu tiên của luồng 224

10.2.4 Luồng ngầm 226

10.2.5 Đa luồng với JApplet 227

10.3 Nhóm luồng 229

10.3.1 Giới thiệu nhóm luồng 229

10.3.2 Sự đồng bộ luồng 233

10.3.3 Mã đồng bộ 233

10.3.4 Sử dụng khối đồng bộ 235

Trang 8

10.3.6 Sự bế tắt 241 10.4 Thu rác 242

Tham khảo 248

Trang 9

Hình 1.1 Sơ đồ phân cấp trừu tượng của các đối tượng tự nhiên 5

Hình 2.1 Cách biên dịch truyền thống 10

Hình 2.2 Dịch chương trình Java 11

Hình 2.3 Máy ảo Java thực hiện mã bytecode độc lập môi trường hoạt động 12

Hình 2.4 Cùng mã bytecode có thể được hiểu bởi hai máy ảo 13

Hình 2.5 Phân tích một chương trình Java đơn giản 14

Hình 3.1 Phân rã ứng dụng từ trên xuống 38

Hình 3.2 Gắn ứng dụng từ dưới lên 39

Hình 3.3 Sử dụng một biến tham chiếu để chỉ tới đối tượng trong bộ nhớ 45

Hình 3.4 Hai biến tham chiếu tới cùng một đối tượng 46

Hình 3.5 Chuyển y tham chiếu tới Student thứ hai 46

Hình 3.6 Chuyển x tham chiếu tới Student thứ hai 47

Hình 3.7 Đối tượng Student mồ côi 47

Hình 4.1 Các đối tượng trong hệ thống phải cộng tác với nhau để hoàn tất sứ mệnh SRS 51

Hình 4.2 Thông điệp được truyền qua lại giữa các đối tượng Course và Student 58

Hình 4.3 Người yêu cầu chỉ thấy chi tiết bên ngoài của việc trao đổi thông điệp 58

Hình 5.1 Kết hợp ba ngôi 62

Hình 5.2 Một thể hiện tương đương bằng ba kết hợp hai ngôi 62

Hình 6.1 Hầu hết tập hợp tự động co lại khi một phần tử bị lấy ra 95

Hình 6.2 Dùng khoá để truy cập trực tiếp đối tượng trong tập hợp từ điển 95

Hình 6.3 Các tập hợp không phải là bộ cho phép nhiều tham chiếu tới cùng một đối tượng 96

Hình 7.1 Khi máy ảo Java ném một ngoại lệ, như phát ra một pháo để thông báo cho ứng dụng một vấn đề phát sinh 113

Hình 7.2 Nếu không có ngoại lệ được ném ra trong khối try, tất cả các khối catch được bỏ qua 116

Hình 7.3 Nếu một ngoại lệ phát sinh, khồi catch đầu tiên chặn bắt, nếu có, được thực thi, và phần còn lại được bỏ qua 117

Hình 7.4 Máy ảo Java theo dõi việc thứ tự các phương thức được gọi bằng cách tạo chồng gọi (call stack) 122

Hình 7.5 Khi một phương thức chấm dứt, nó bị lấy ra khỏi chồng 122

Trang 10

trong mức hiện hành của chồng gọi 122

Hình 7.7 Ngoại lệ thoát khỏi p.methodY() và chuyển xuống s.methodX() xử lý 123

Hình 7.8 NullPointerException thông qua chồng gọi được chuyển tới phương thức main 124

Hình 7.9 Nếu ứng dụng bỏ qua xử lý ngoại lệ, máy ảo Java chấm dứt ứng dụng và báo cáo ngoại lệ tới cửa cửa sổ dòng lệnh cho người sử dụng để quan sát 125

Hình 7.10 Lớp java.lang.Exception có nhiều lớp con 126

Hình 7.11 Cây thừa kế của kiểu ngoại lệ java.sql.DataTruncation 126

Hình 7.12 Kết quả demo của NumberOfDigits.java 134

Hình 8.1 Đọc dữ liệu vào chương trình 137

Hình 8.2 Viết dữ liệu từ chương trình 138

Hình 8.3 Luồng byte vào ra đơn giản 139

Hình 8.4 Các thành phần đặc tả qui cách 148

Hình 9.1 Kết quả demo Frame 167

Hình 9.2 Kết quả demo Panel 168

Hình 9.3 Kết quả demo Dialog 169

Hình 9.4 Kết quả demo Label 170

Hình 9.5 Kết quả demo Text 172

Hình 9.6 Kết quả demo Button 173

Hình 9.7 Kết quả demo sự kiện 179

Hình 9.8 Kết quả demo Radio Button 182

Hình 9.9 Kết quả demo Choice Button 184

Hình 9.10 Kết quả demo Listbox 186

Hình 9.11 Kết quả demo Flow layout 187

Hình 9.12 Kết quả demo Grid layout 188

Hình 9.13 Kết quả demo Border layout 190

Hình 9.14 Kết quả demo Gridbag layout 192

Hình 9.15 Kết quả demo Null layout 193

Hình 9.16 Kết quả demo Applet 195

Hình 9.17 Kết quả demo Applet bảng tính 198

Hình 9.18 Kết quả demo Applet có tham số 200

Hình 9.19 Kết quả demo JButton 202

Hình 9.20 Kết quả demo gắn các đối tượng vào các tầng 205

Hình 9.21 Kết quả demo JMenu 210

Trang 11

Hình 10.1 Vòng đời của luồng 220 Hình 10.2 Đa luồng với Applet 228

Trang 12

Danh sách bảng

Bảng 2.1 Các toán tử số học 22

Bảng 2.2 Các toán tử bit 23

Bảng 2.3 Các toán tử quan hệ 24

Bảng 2.4 Các toán tử logic 24

Bảng 2.5 Thứ tự ưu tiên các toán tử 25

Bảng 4.1 Phạm vi truy cập của các thành viên của lớp 52

Bảng 7.1 Danh sách một số ngoại lệ 127

Bảng 10.1 Các phương thức của một lớp luồng 224

Trang 13

Thuật ngữ viết tắt

API Application Programming Interface

CSDL Cơ sở dữ liệu

CTDL Cấu trúc dữ liệu

GUI Graphic User Interface

JDBC Java DataBase Connectivity

JFC Java Foundation Class

JVM Java Virtual Machine

LIFO Last in, First out

ODBC Open Database Connectivity

RDBMS Relational Database Management Systems

SRS Student Registration System

Trang 14

Chương 1 Tổng quan về lập trình hướng đối tượng

Nội dung chương này nhằm giới thiệu một cách tổng quan về cách tiếp cận hướng đối tượng Nội dung trình bày bao gồm:

• Giới thiệu về cách tiếp cận của lập trình truyền thống

• Giới thiệu cách tiếp cận của lập trình hướng đối tượng

• Sự trừu tượng hóa là cơ sở của phát triển phần mềm hướng đối tượng

• Nêu các đặc trưng của lập trình hướng đối tượng

• Xu hướng hiện nay của lập trình hướng đối tượng

1.1 Phương pháp tiếp cận của lập trình truyền thống

Lập trình truyền thống đã trải qua hai giai đoạn:

• Giai đoạn sơ khai, khi khái niệm lập trình mới ra đời, là lập trình tuyến tính

• Giai đoạn tiếp theo, là lập trình hướng cấu trúc

1.1.1 Lập trình tuyến tính

Đặc trưng cơ bản của lập trình tuyến tính là tư duy theo lối tuần tự Chương trình sẽ được thực hiện tuần tự từ đầu đến cuối, lệnh này kế tiếp lệnh kia cho đến khi kết thúc chương trình

Đặc trưng

Lập trình tuyến tính có hai đặc trưng:

• Đơn giản: chương trình được tiến hành đơn giản theo lối tuần tự, không phức tạp

• Đơn luồng: chỉ có một luồng (thread) công việc duy nhất, và các công việc được thực hiện tuần tự trong luồng đó

1.1.2 Lập trình cấu trúc

Trong lập trình hướng cấu trúc, chương trình chính được chia nhỏ thành các chương trình con và mỗi chương trình con thực hiện một công việc xác định Chương trình

Trang 15

chính sẽ gọi đến chương trình con theo một giải thuật, hoặc một cấu trúc được xác định trong chương trình chính

Các ngôn ngữ lập trình cấu trúc phổ biến là Pascal, C và C++ Riêng C++ ngoài việc

có đặc trưng của lập trình cấu trúc do kế thừa từ C, còn có đặc trưng của lập trình hướng đối tượng Cho nên C++ còn được gọi là ngôn ngữ lập trình nửa cấu trúc, nửa hướng đối tượng

Đặc trưng

Đặc trưng cơ bản nhất của lập trình cấu trúc thể hiện ở mối quan hệ:

Chương trình = CTDL + Giải thuật

Trong đó:

• CTDL là cách tổ chức dữ liệu, cách mô tả bài toán dưới dạng ngôn ngữ lập trình

• Giải thuật là một quy trình để thực hiện một công việc xác định

Trong chương trình, giải thuật có quan hệ phụ thuộc vào CTDL:

• Một CTDL chỉ phù hợp với một số hạn chế các giải thuật

• Nếu thay đổi CTDL thì phải thay đổi giải thuật cho phù hợp

• Một giải thuật thường phải đi kèm với một CTDL nhất định

• Các ngôn ngữ lập trình cấu trúc cung cấp một số cấu trúc lệnh điều khiển chương trình

Ưu điểm

• Chương trình sáng sủa, dễ hiểu, dễ theo dõi

• Tư duy giải thuật rõ ràng

Nhược điểm

• Lập trình cấu trúc không hỗ trợ việc sử dụng lại mã nguồn: Giải thuật luôn phụ thuộc chặt chẽ vào CTDL, do đó, khi thay đổi CTDL, phải thay đổi giải thuật, nghĩa

là phải viết lại chương trình

• Không phù hợp với các phần mềm lớn: tư duy cấu trúc với các giải thuật chỉ phù hợp với các bài toán nhỏ, nằm trong phạm vi một mô đun của chương trình Với dự án phần mềm lớn, lập trình cấu trúc tỏ ra không hiệu quả trong việc giải quyết mối quan hệ vĩ mô giữa các mô đun của phần mềm

Trang 16

Vấn đề

Vấn đề cơ bản của lập trình cấu trúc là bằng cách nào để phân chia chương trình chính thành các chương trình con cho phù hợp với yêu cầu, chức năng và mục đích của mỗi bài toán

1.2 Phương pháp tiếp cận lập trình hướng đối tượng

Xuất phát từ hai hạn chế chính của phương pháp lập trình cấu trúc:

• Không quản lý được sự thay đổi dữ liệu khi có nhiều chương trình cùng thay đổi một biến chung Vấn đề này đặc biệt nghiêm trọng khi các ứng dụng ngày càng lớn, người ta không thể kiểm soát được sự truy nhập đến các biến dữ liệu chung

• Không tiết kiệm được tài nguyên con người: Giải thuật gắn liền với CTDL, nếu thay đổi CTDL, sẽ phải thay đổi giải thuật, và do đó, phải viết lại mã chương trình

từ đầu

Để khắc phục được hai hạn chế này khi giải quyết các bài toán lớn, người ta xây dựng một phương pháp tiếp cận mới, là phương pháp lập trình hướng đối tượng, với hai mục đích chính:

• Đóng gói dữ liệu để hạn chế sự truy nhập tự do vào dữ liệu, không quản lý được

• Cho phép sử dụng lại mã nguồn, hạn chế việc phải viết lại mã từ đầu cho các chương trình

Ngôn ngữ lập trình hướng đối tượng phổ biến hiện nay là Java và C++ Tuy nhiên, C++ mặc dù cũng có những đặc trưng cơ bản của lập trình hướng đối tượng nhưng vẫn không phải là ngôn ngữ lập trình thuần hướng đối tượng Java thật sự là một ngôn ngữ lập trình thuần hướng đối tượng

1.3 Các đặc trưng của lập trình hướng đối tượng

1.3.1 Tính đóng gói dữ liệu

Dữ liệu luôn được tổ chức thành các thuộc tính của lớp đối tượng Việc truy nhập đến

dữ liệu phải thông qua các phương thức của đối tượng lớp

Trong một đối tượng, dữ liệu hay thao tác hay cả hai có thể là riêng (private) hoặc chung (public) của đối tượng đó Thao tác hay dữ liệu riêng là thuộc về đối tượng đó

chỉ được truy cập bởi các thành phần của đối tượng, điều này nghĩa là thao tác hay dữ

liệu riêng không thể truy cập bởi các phần khác của chương trình tồn tại ngoài đối tượng Khi thao tác hay dữ liệu là chung, các phần khác của chương trình có thể truy cập nó mặc dù nó được định nghĩa trong một đối tượng Các thành phần chung của một đối tượng dùng để cung cấp một giao tiếp có điều khiển cho các thành thành riêng của đối tượng

Cơ chế đóng gói (encapsulation) là phương thức tốt để thực hiện cơ chế che dấu thông tin so với các ngôn ngữ lập trình cấu trúc

Trang 17

1.3.2 Tính kế thừa

Cho phép sử dụng lại mã nguồn Các lớp đối tượng có thể kế thừa (inheritance) từ các lớp đối tượng khác Khi đó, trong các lớp kế thừa, có thể sử dụng các phương thức hoạt động của các lớp bị kế thừa, mà không cần phải định nghĩa lại

Việc cho phép sử dụng lại mã nguồn được thực hiện thông qua cơ chế kế thừa trong lập trình hướng đối tượng Theo đó:

• Các lớp có thể được kế thừa nhau để tận dụng các thuộc tính, các phương thức của nhau

• Trong lớp dẫn xuất (lớp kế thừa) có thể sử dụng lại các phương thức của lớp cơ

sở (lớp bị lớp khác kế thừa) mà không cần thiết phải cài đặt lại mã nguồn

• Ngay cả khi lớp dẫn xuất định nghĩa lại các phương thức cho mình, lớp cơ sở cũng không bị ảnh hưởng và không phải sửa lại bất kỳ một đoạn mã nguồn nào

1.3.3 Tính đa hình

Khả năng để cho một thông điệp có thể thay đổi cách thực hiện của nó theo lớp cụ thể của đối tượng nhận thông điệp Khi một lớp dẫn xuất được tạo ra, nó có thể thay đổi cách thực hiện các phương thức nào đó mà nó thừa hưởng từ lớp cơ sở của nó Một thông điệp khi được gởi đến một đối tượng của lớp cơ sở, sẽ dùng phương thức đã định nghĩa cho nó trong lớp cơ sở Nếu một lớp dẫn xuất định nghĩa lại một phương thức thừa hưởng từ lớp cơ sở của nó thì một thông điệp có cùng tên với phương thức này, khi được gởi tới một đối tượng của lớp dẫn xuất sẽ gọi phương thức đã định nghĩa cho lớp dẫn xuất

Như vậy đa hình (polymorphism) là khả năng cho phép gởi cùng một thông điệp đến những đối tượng khác nhau có cùng chung một đặc điểm, nói cách khác thông điệp được gởi đi không cần biết thực thể nhận thuộc lớp nào, chỉ biết rằng tập hợp các thực

thể nhận có chung một tính chất nào đó Chẳng hạn, thông điệp vẽ hình được gởi đến

cả hai đối tượng hình hộp và hình tròn Trong hai đối tượng này đều có chung phương thức vẽ hình, tuy nhiên tuỳ theo thời điểm mà đối tượng nhận thông điệp, hình tương ứng sẽ được vẽ lên

1.4 Trừu tượng hóa

1.4.1 Tổ chức trừu tượng theo sự phân cấp lớp

Thậm chí mặc dù nảo con người giỏi ở sự trừu tượng các khái niệm như bản đồ đường

đi và cảnh quan, vẫn còn số lượng rất lớn các công việc trừu tượng hoá riêng lẻ mà chúng ta thường gặp trong cuộc sống Để đối phó sự phức tạp này con người phải sắp xếp thông tin một cách có hệ thống theo các tiêu chuẩn nào đó; Xử lý này gọi là sự phân lớp (classification)

Ví dụ như khoa học đã phân cấp theo lớp tất cả đối tượng tự nhiên thuộc về động vật, hoặc cây, hoặc khoáng sản Để được phân là động vật, nó phải thoả điều kiện sau:

Trang 18

Sau khi phân lớp đơn giản như trên ta có thể thêm vài qui luật để có các loại động vật

cụ thể hơn cho đến khi có một sự phân cấp theo sự trừu tượng từ cao (đỉnh) xuống thấp (đáy) Sơ đồ phân cấp trừu tượng của các đối tượng tự nhiên được thể hiện như hình 1.1

Hình 1.1 S ơ đồ phân cấp trừu tượng của các đối tượng tự nhiên

1.4.2 Trừu tượng hóa – cơ sở của phát triển phần mềm

Khi ghi nhận các yêu cầu cho một dự án phần mềm, chúng ta thường bắt đầu bằng cách thu thập thông tin chi tiết về tình hình thực tế mà trên đó hệ thống sẽ hoạt động Những chi tiết này thường là một sự tổng hợp của

• Thông tin từ những người sử dụng hệ thống được chúng ta phỏng vấn

• Những hoạt động mà chúng ta quan sát từ nghiệp vụ hàng ngày của người sử dụng hệ thống

Kế đến chúng ta phải chọn lọc ra những chi tiết nào liên quan tới mục đích sử dụng hệ thống Việc này là cần thiết vì chúng ta không thể tự động hoá tất cả hệ thống nghiệp

vụ bằng phần mềm! Việc bao gồm quá nhiều chi tiết sẽ làm hệ thống phức tạp và khó

Các đối tượng tự nhiên

Trang 19

khăn hơn trong việc thiết kế, kiểm tra chương trình, dò lỗi, tạo sưu liệu, bảo trì và mở rộng chương trình sau này

Sự trừu tưởng hoá sẽ giúp người phân tích hệ thống có được các nét đặc trưng của hệ thống trong miền (domain) bài toán, tập trung vào vấn đề của hệ thống dự định phát triển Như khi thể hiện một người trong chương trình, màu mắt của họ có quan trọng không? Về gien? Lương? Sở thích? Câu trả lời là bất kỳ đặc tính nào của người có thể liên quan hay không liên quan tuỳ thuộc vào hệ thống mà ta định phát triển là

• Chương trình tính lương

• Chương trình tiếp thị theo tuổi tác

• CSDL bệnh nhân nhãn khoa

• Hệ thống theo dõi những kẻ bị truy nã

Một khi đã xác định các đặc trưng quan trọng của một tình huống, ta cần chuẩn bị một

mô hình hoá cho nó Mô hình hoá là xử lý nhằm phát triển một khuôn mẫu để tạo ra một thứ gì đó; ví dụ như bản thiết kế ngôi nhà, sơ đồ mạch điện, một khuôn bánh Một

mô hình đối tượng của hệ thống phần mềm là một mẫu như vậy Mô hình hoá và trừu tượng hoá luôn đi với nhau vì một mô hình là sự mô tả đồ hoạ hay vật lý của trừu tượng; Trước khi mô hình vật gì đó một cách có hiệu quả, ta phải xác định các chi tiết

cần thiết của chủ thể cần được mô hình

1.5 Xu hướng phát triển của lập trình hướng đối tượng

1.5.1 Lập trình hướng thành phần (Component-oriented programming-COP)

Xuất phát từ lập trình hướng đối tượng, tư duy lập trình hướng thành phần theo ý tưởng:

• Giải quyết bài toán bằng cách xây dựng một tập các thành phần (component) có tính độc lập tương đối với nhau Mỗi thành phần đảm nhiệm một phần công việc nhất định

• Sau đó, người ta ghép các thành phần với nhau để thu được một phần mềm thoả mãn một tập các yêu cầu xác định

Với lập trình hướng thành phần, người ta có thể tiến hành lập trình theo phương pháp sau:

• Xây dựng một thư viện các thành phần, mỗi thành phần thực hiện một công việc xác định

• Khi cần phát triển một phần mềm cụ thể, người ta chỉ cần chọn những thành phần có sẵn trong thư viện để ghép lại với nhau Người lập trình chỉ phải phát triển thêm các thành phần mình cần mà chưa có trong thư viện

Trang 20

Phương pháp này có những ưu điểm rất lớn:

• Lập trình viên có thể chia sẻ với nhau những thành phần mình đã xây dựng cho nhiều người khác dùng chung

• Khi cần, lập trình viên có thể lắp ghép các thành phần có sẵn khác nhau để tạo thành các chương trình có chức năng khác nhau Tất cả chỉ cần dựa trên công nghệ lắp ghép thành phần, tiết kiệm được rất nhiều công sức lập trình

Trong xu hướng lập trình hướng thành phần, một số phương pháp lập trình khác đã nảy sinh và đang phát triển mạnh mẽ:

• Lập trình hướng tác nhân (Agent-Oriented Programming)

• Lập trình hướng khía cạnh (Aspect-Oriented Programming-AOP)

• Thứ nhất là khả năng tự chủ của mỗi agent để hoàn thành nhiệm vụ riêng của

ví dụ lưu vết thao tác và lỗi (error logging)

Với AOP, chúng ta có thể cài đặt các mối quan tâm chung cắt ngang hệ thống bằng các

mô đun đặc biệt gọi là aspect thay vì dàn trải chúng trên các mô đun nghiệp vụ liên quan Các aspect sau đó được tự kết hợp với các mô đun nghiệp vụ khác bằng quá trình gọi là đan (weaving) bằng bộ biên dịch đặc biệt

AspectJ là một công cụ AOP cho ngôn ngữ lập trình Java Trình biên dịch AspectJ sẽ đan xen chương trình Java chính với các aspect thành các tập tin bytecode chạy trên máy ảo Java

TỔNG KẾT CHƯƠNG 1

Nội dung chương 1 đã trình bày các vấn đề tổng quan liên quan đến phương pháp tiếp cận hướng đối tượng trong lập trình:

Trang 21

• Các phương pháp tiếp cận truyền thống: lập trình tuyến tính và lập trình cấu trúc

• Phương pháp tiếp cận hướng đối tượng với các đặc trưng cơ bản: đóng gói dữ liệu, tính đa hình và sử dụng lại mã nguồn

• Lập trình hướng đối tượng trên nền tảng là trừu tượng hoá là cơ sở lập trình hiện đại

• Hiện nay, lập trình hướng thành phần, lập trình hướng agent và lập trình hướng aspect tiến hoá từ lập trình hướng đối tượng đang là xu hướng phát triển mạnh mẽ

❖ B ÀI TẬP

1 Vẽ một sơ đồ phân cấp lớp cho các lớp sau đây: táo, chuối, thịt bò, nước giải khát, phó mát, thứ có thể ăn uống, sản phẩm bơ sửa, đồ ăn, trái cây, đậu xanh, thịt, sửa, thịt heo, rau muống, rau

2 Những đặc điểm nào của tivi mà chúng cần thiết để được trừu tượng từ góc nhìn của

Trang 22

Chương 2 Cơ bản ngôn ngữ lập trình Java

Trước khi tìm hiểu ngôn ngữ Java người đọc cần biết về lịch sử hình thành ngôn ngữ lập trình này Java được khởi đầu bởi James Gosling và bạn đồng nghiệp ở Sun Microsystems năm 1991 Ban đầu ngôn ngữ này được gọi là Oak (có nghĩa là cây sồi;

do bên ngoài cơ quan của ông Gosling có trồng nhiều loại cây này), họ dự định ngôn ngữ đó thay cho C++ Java được sử dụng chủ yếu trên môi trường mạng, Internet và lập trình Game trên thiết bị di động Không nên lẫn lộn Java với JavaScript, hai ngôn ngữ đó chỉ giống tên và loại cú pháp như C Công ty Sun Microsystems đang giữ bản quyền và phát triển Java thường xuyên

Java được tìm hiểu trong chương này như sau:

• Kiến trúc tổng quát một chương trình xây dựng trên Java

• Các toán tử và các CTDL cơ bản trên Java

• Các cấu trúc lệnh của Java

2.1 Đặc trưng của ngôn ngữ Java

Java có những đặc trưng cơ bản sau:

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 Do vậy Java loại bỏ các đặc trưng phức tạp của C và C++ như:

• Loại bỏ thao tác con trỏ, thao tác định nghĩa chồng toán tử (operator

overloading)…

• Không cho phép đa kế thừa (multi-inheritance) mà sử dụng các giao tiếp

(interface)

• Không sử dụng lệnh goto cũng như file header (.h)

• Loại bỏ cấu trúc struct và union

Hướng đối tượng

Trang 23

Java là ngôn ngữ lập trình hoàn toàn hướng đối tượng:

• Mọi thực thể trong hệ thống đều được coi là một đối tượng, tức là một thể hiện

cụ thể của một lớp xác định

• Tất cả các chương trình đều phải nằm trong một lớp nhất định

• Không thể dùng Java để viết một chức năng mà không thuộc vào bất kỳ một lớp nào Tức là Java không cho phép định nghĩa dữ liệu và hàm tự do trong chương

ấy Do vậy, khi chạy trên một nền phần cứng khác, bắt buộc phải biên dịch lại mã nguồn

trường hoạt động

Trang 24

Hình 2.2 Dịch chương trình Java

Đối các chương trình viết bằng Java, trình biên dịch javac sẽ biên dịch mã nguồn thành dạng mã bytecode Sau đó, khi chạy chương trình trên các nền phần cứng khác nhau, máy ảo Java (JVM) dùng trình thông dịch Java để chuyển mã bytecode thành dạng chạy được trên các môi trường tương ứng Do vậy, khi thay đổi môi trường (phần cứng hoặc hệ điều hành), không phải biên dịch lại mã bytecode Hình 2.2 minh hoạ quá trình biên dịch mã nguồn Java

Máy ảo Java là một chương trình đặc biệt để thông dịch và thực hiện mã nguồn Java Khi chương trình Java chạy nó sẽ nằm dưới sự quản lý của máy ảo này, và máy ảo thì chịu sự quản lý của hệ điều hành của một loại máy tính cụ thể Máo ảo sẽ thông dịch

mã bytecode thành ngôn ngữ máy mà máy tính có thể hiểu được Như vậy sẽ có nhiều máy ảo Java cho từng môi trường cụ thể Hình 2.3 minh hoạ quá trình thực thi của mã nguồn Java

Do chương trình Java phải chạy dưới máy ảo nên tốc độ thực hiện của nó hợi chậm hơn các chương trình được biên dịch và chạy trực tiếp trên hệ điều hành Tuy nhiên tốc

độ máy tính ngày càng cao thì sự chênh lệch về tốc độ không đáng kể

// Chương trình Java

public class Hello {

public static void main( String[ ] args) {

System.out.println(“Hello!”);

}

}

Mã nguồn Java độc lập môi trường hoạt động

Trình biên dịch

Java cho Solaris

Trình biên dịch Java cho Windows

Trình biên dịch Java cho Linux

Mã bytecode độc lập môi trường hoạt động

… tạo ra

Trang 25

Khi chuyển mã bytecode từ môi trường này sang môi trường khác như từ Windows sang Linux thì ta không cần phải biên dịch lại chương trình Hình 2.4 minh hoạ điều này

Hình 2.3 Máy ảo Java thực hiện mã bytecode độc lập môi trường hoạt động

Mạnh mẽ

Java là ngôn ngữ yêu cầu chặt chẽ về kiểu dữ liệu:

• Kiểu dữ liệu phải được khai báo tường minh

• Java không sử dụng con trỏ và các phép toán con trỏ

• Java kiểm tra việ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 mảng

• Quá trình cấp phát, giải phóng bộ nhớ cho biến được thực hiện tự động, nhờ dịch vụ thu rác những đối tượng không còn sử dụng nữa

• 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

Mã nhị phân đã được

biên dịch viết bằng C hay

C++ chạy trực tiếp trên

hệ điều hành)

Mã bytecode độc lập môi trường hoạt động chạy dưới

sự quản lý của máy ảo

Trang 26

Hình 2.4 Cùng mã bytecode có thể được hiểu bởi hai máy ảo

Máy ảo Java phụ thuộc

môi trường hoạt động

A

Trang 27

Phân tán

Java được thiết kế để hỗ trợ các ứng dụng chạy trên mạng bằng các lớp mạng (java.net) Hơn nữa, Java hỗ trợ nhiều nền chạy khác nhau nên chúng được sử dụng rộng rãi như là công cụ phát triển trên Internet, nơi sử dụng nhiều nền khác nhau

tượng lúc chạy Điều này cho phép khả năng liên kết động mã

2.2 Kiến trúc chương trình và cơ chế thực thi của Java

Dạng cơ bản của một tập tin mã nguồn Java có cấu trúc như hình 2.5 sau :

Hình 2.5 Phân tích một chương trình Java đơn giản Một tập tin chứa mã nguồn Java có thể có ba phần chính:

o Phần khai báo tên gói (khối) bằng từ khoá package

o Phần khai báo thư viện tham khảo bằng từ khoá import

o Phần khai báo nội dung lớp bằng từ khoá class

Khai báo package

Package được dùng để đóng gói các lớp trong chương trình lại với nhau thành một khối Đây là một cách hữu hiệu để lưu trữ các lớp gần giống nhau hoặc có cùng một

mô đun thành một khối thống nhất

Cú pháp khai báo tên gói bằng từ khoá package:

package <Tên gói>;

// Một chương trình Java đơn giản package packageName;

Trang 28

Ưu điểm của package:

▪ Cho phép nhóm các lớp vào với nhau thành các đơn vị nhỏ hơn Việc thao tác trên các đơn vị khối sẽ gọn hơn thao tác trên một tập các lớp

▪ Tránh việc xung đột khi đặt tên lớp Vì các lớp không cùng gói có thể đặt tên trùng nhau Khi số lượng lớp của chương trình quá lớn ta có thể tránh phải đặt tên khác nhau cho các lớp bằng cách đặt chúng vào các gói khác nhau

▪ Cho phép bảo vệ các lớp Khi chương trình lớn, việc chia nhỏ chương trình thành các gói sẽ thuận lợi hơn cho việc quản lý và phát triển

▪ Tên gói còn được dùng để định danh lớp trong ứng dụng

Lưu ý:

▪ Dòng lệnh khai báo tên gói phải được đặt đầu tiên trong tập tin mã chương trình

▪ Chỉ được khai báo tối đa một tên gói đối với mỗi tập mã nguồn Java

▪ Các tập tin của các lớp nằm cùng gói ứng dụng phải được lưu trong cùng một thư mục (tên thư mục là tên gói) theo cấu trúc của dự án

▪ Tên gói nên đặt theo chữ thường vì tên gói sẽ là tên thư mục tương ứng trong ổ đĩa, tránh nhầm lẫn với tên các tập tin là tên các lớp của chương trình

▪ Khi không nhóm các lớp trong gói (do chương trình đơn giản), thì không cần thiết phải khai báo tên gói ở đầu tập tin Khi đó lớp ở gói mặc định không có tên

Khai báo thư viện

Khai báo thư viện để chỉ ra những thư viện đã được định nghĩa sẵn mà chương trình sẽ

tham khảo tới Cú pháp khai báo thư viện với từ khoá import như sau:

import <Tên thư viện>;

Java chuẩn cung cấp một số thư viện như sau:

▪ java.lang: cung cấp các hàm thao tác trên các kiểu dữ liệu cơ bản, xử lý lỗi và ngoại lệ, xử lý vào ra trên các thiết bị chuẩn như bàn phím và màn hình

▪ java.applet: cung cấp các hàm cho xây dựng các applet (sẽ trình bày trong Chương 9)

▪ java.awt: cung cấp các hàm cho xây dựng các ứng dụng đồ hoạ với các thành phần giao tiếp multimedia (sẽ trình bày trong Chương 9)

▪ java.io: cung cấp các hàm xử lý vào/ra trên các thiêt bị chuẩn và các thiết bị ngoại vi (sẽ trình bày trong Chương 8)

▪ java.util: cung cấp các hàm tiện ích trong xử lý liên quan đến các kiểu dữ liệu

có cấu trúc như ArrayList, HashMap, TreeMap,… (sẽ trình bày trong Chương 6)

Trang 29

▪ Nếu không tham khảo thư viện nào, không cần thiết phải khai báo các tham khảo với từ khoá import

Lớp có ba tính chất đặc trưng bởi ba từ khoá:

▪ public: lớp có thể được truy cập từ các gói khác Nếu không khai báo public thì ngầm định lớp chỉ có thể được truy xuất trong cùng một gói

▪ final: khai báo lớp hằng, lớp này không thể tạo dẫn xuất; Tức là không có lớp nào kế thừa được từ các lớp có tính chất final

▪ abstract: khai báo lớp trừu tượng, lớp này chứa các phương thức trừu tượng Không thể tạo các thể hiện của các lớp trừu tượng bằng toán tử new như các lớp

thông thường

Lưu ý:

• Chỉ có tính chất public hoặc không khai báo tính chất (package) có thể sử dụng cho lớp và lớp này có cùng tên tập tin Ví dụ nếu tập tin là Xyz.java thì phải có lớp Xyz trong tập tin này

Nếu có nhiều hơn một lớp public trong một tập tin, trình biên dịch sẽ báo lỗi

• Để sử dụng lớp từ một gói khác, ta phải viết tên gói trước tên lớp Ví dụ

Ghi chú truyền thống: ghi chú bắt đầu bằng /* kết thúc là */ như

/* Giải phương trình bậc hai

Trang 30

ax2+bx+c=0 */

Ghi chú kết thúc dòng: ghi chú bắt đầu bằng // như

// Giải phương trình bậc hai

// ax2+bx+c=0

Ghi chú sưu liệu Java : ghi chú được tạo ra bởi tiện ích javadoc

Phương thức main bắt buộc phải có với mọi chương trình Java và là điểm bắt đầu

thực hiện chương trình, cú pháp của phương thức này:

public static void main( String [ ] args) {

// các câu lệnh

}

Đây là phương thức chính, từ đây chương trình bắt đầu việc thực thi của mình Tất cả các ứng dụng Java đều sử dụng một phương thức main này

Từ khoá public là một chỉ định truy xuất Nó cho biết thành viên của lớp có thể

được truy xuất từ bất cứ đâu trong chương trình

• Từ khoá static cho phép main được gọi tới mà không cần tạo ra một thể hiện (instance) của lớp Nó không phụ thuộc vào các thể hiện của lớp được tạo ra

Từ khoá void thông báo cho máy tính biết rằng phương thức sẽ không trả lại bất

cứ giá trị nào khi thực thi chương trình

args là danh sách tham số cho chương trình

Ví dụ sau minh hoạ cách sử dụng tham số

class PassArgument {

public static void main(String args[ ]) {

System.out.println(“Danh sách tham số phương thức main nhận được:”);

System.out.println(args[0]);

System.out.println(args[1]);

System.out.println(args[2]);

} }

Phương thức in ra màn hình có thể sử dụng System.out.println (in xong xuống dòng)

và System.out.print(in không xuống dòng)

T hực thi của Java

Chương trình Java có được soạn thảo bằng notepad trong Windows, vi trong Linux hay các IDE như eclipse, Netbean, Jcreator Pro, Jbuilder… Nếu chạy trong cửa sổ dòng lệnh của Windows, ta có thể biên dịch chương trình Java ra mã bytecode như sau:

javac sourcecode_filename

Trang 31

Nếu biên dịch thành công các tập tin class chứa mã bytecode

Để chạy mã bytecode dùng lệnh sau:

java bytecode_filename (bỏ qua đuôi tập tin.class)

ví dụ

java PassArgument

sẽ cho kết quả như sau:

Đây là danh sách tham số phương thức main nhận được A

123

B1

Chú ý khi chạy trong một IDE, việc biên dịch và chạy chương trình Java được thực hiện bằng cách chọn lệnh trong menu

2.3 Các kiểu dữ liệu cơ bản và biến

2.3.1 Kiểu dữ liệu cơ bản

▪ byte: Dùng để lưu dữ liệu kiểu số nguyên có kích thước một byte (8 bit) Phạm vi biểu diễn giá trị từ -128 đến 127 Giá trị mặc định là 0

▪ char: Dùng để lưu dữ liệu kiểu kí tự hoặc số nguyên không âm có kích thước 2 byte (16 bit) Phạm vi biểu diễn giá trị từ \u0000 đến \uFFFF Giá trị mặc định là 0

▪ boolean: Dùng để lưu dữ liệu chỉ có hai trạng thái đúng hoặc sai (độ lớn chỉ có 1 bit) Phạm vi biểu diễn giá trị là true, false Giá trị mặc định là false

▪ short: Dùng để lưu dữ liệu có kiểu số nguyên, kích cỡ 2 byte (16 bit) Phạm vi biểu diễn giá trị từ - 32768 đến 32767 Giá trị mặc định là 0

▪ int: Dùng để lưu dữ liệu có kiểu số nguyên, kích cỡ 4 byte (32 bit) Phạm vi biểu diễn giá trị từ -2,147,483,648 đến 2,147,483,647 Giá trị mặc định là 0

▪ float: Dùng để lưu dữ liệu có kiểu số thực, kích cỡ 4 byte (32 bit) Giá trị mặc định

Trang 32

2.3.2 Biến

2.3.2.1 Khai báo biến

Cú pháp khai báo biến:

dataType varName;

Trong đó, dataType là kiểu dữ liệu của biến, varName là tên biến Trong Java, việc đặt tên biến phải tuân theo các quy tắc sau:

• Chỉ được bắt đầu bằng một kí tự (chữ), hoặc một dấu gạch dưới, hoặc một kí tự $

• Không có khoảng trắng giữa tên

• Bắt đầu từ kí tự thứ hai, có thể dùng các kí tự (chữ), chữ số, dấu $, dấu gạch dưới

• Không trùng với các từ khoá

Dòng lệnh sau không biên dịch vì public là một từ khoá Java:

• Có phân biệt chữ hoa chữ thường

Cách đặt tên biến nên theo kiểu camel (ký tự đầu tiên là chữ thường, các ký tự đầu

tiên của từ kế tiếp là chữ in) như

Trang 33

int foo-bar;

int plus+sign;

int x@y;

int dot.notation;

2.3.2.2 Phạm vi hoạt động của biến

Một biến có phạm vi hoạt động trong toàn bộ khối lệnh mà nó được khai báo Một khối lệnh bắt đầu bằng dấu { và kết thúc bằng dấu }

• Nếu biến được khai báo trong một cấu trúc lệnh điều khiển, biến đó có phạm vi hoạt động trong khối lệnh tương ứng

• Nếu biến được khai báo trong một phương thức (không nằm trong khối lệnh nào), biến đó có phạm vi hoạt động trong phương thức tương ứng: có thể được sử dụng trong tất cả các khối lệnh của phương thức

• Nếu biến được khai báo trong một lớp (không nằm trong trong một phương thức nào), biến đó có phạm vi hoạt động trong toàn bộ lớp tương ứng: có thể được sử

dụng trong tất cả các phương thức của lớp

2.3.2.3 Khởi tạo biến

Không nhất thiết phải gán giá trị cho biến khi nó vừa được khai báo, nhưng biến phải

có giá trị xác định khi chúng lần đầu được sử dụng Ví dụ sau hai biến nguyên được khai báo, biến foo được gán giá trị, biến bar thì không

int foo;

int bar;

foo = 3;

foo = foo + bar; // Dòng lệnh này không biên dịch

Trình biên dịch sẽ báo lỗi đoạn lệnh sau:

variable bar might not have been initialized

foo = foo + bar;

^

2.3.2.4 Ép kiểu

Ví dụ, nhiều khi gặp tình huống cần cộng một biến có dạng int với một biến có dạng

float Để xử lý tình huống này, Java sử dụng tính năng ép kiểu (type casting) của

C/C++ Đoạn mã sau đây thực hiện phép cộng một giá trị dấu phẩy động với một giá trị nguyên

float c = 35.8f;

int b = (int)c + 1;

Đầu tiên giá trị dấu phảy động c được đổi thành giá trị nguyên 35 Sau đó nó được cộng với 1 và kết quả là giá trị 36 được lưu vào b

Trang 34

Trong Java có hai loại ép kiểu dữ liệu:

• Nới rộng (widening): quá trình làm tròn số từ kiểu dữ liệu có kích thước nhỏ hơn sang kiểu có kích thước lớn hơn Kiểu biến đổi này không làm mất thông tin Ví dụ

chuyển từ int sang float Chuyển kiểu loại này có thế được thực hiện ngầm định bởi

Kiểu chuổi trong Java là String Nếu khai báo

string s = "foo"; // báo lỗi

Thông báo lỗi

cannot find symbol symbol: string

Để ghép chuỗi với nhau hay chuỗi với số i nhau dùng toán tử +

Trang 35

• Toán tử gán

Toán tử số học

Các toán hạng của các toán tử số học phải ở dạng số Các toán hạng kiểu boolean không sử dụng được, song các toán hạng ký tự cho phép sử dụng loại toán tử này Một vài kiểu toán tử được liệt kê trong bảng dưới đây

% Lấy số chia dư, ví dụ 10%3=1

++ Tăng giá trị biến lên 1

Giãm giá trị biến lên 1

+= Cộng và gán giá trị

Cộng các giá trị của toán hạng bên trái vào toán hạng bên phải và gán giá trị trả về vào toán hạng bên trái Ví dụ c += a tương đương c = c + a -= Trừ và gán giá trị

Trừ các giá trị của toán hạng bên trái vào toán toán hạng bên phải và gán giá trị trả về vào toán hạng bên trái Ví dụ c -= a tương đương với

Chia giá trị của toán hạng bên trái cho toán toán hạng bên phải và gán

giá trị số dư vào toán hạng bên trái Ví dụ c %= a tương đương với

Trang 36

Toán tử Mô tả

~ Phủ định bit (NOT)

Trả về giá trị phủ định của một bit

& Toán tử AND bit

Trả về giá trị là 1 nếu các toán hạng là 1 và 0 trong các trường hợp khác

| Toán tử OR bit

Trả về giá trị là 1 nếu một trong các toán hạng là 1 và 0 trong các trường hợp khác

^ Toán tử Exclusive OR bit

Trả về giá trị là 1 nếu chỉ một trong các toán hạng là 1 và trả về 0 trong

các trường hợp khác

>> Dịch sang phải bit

Chuyển toàn bộ các bit cuả một số sang phải một vị trí, giữ nguyên dấu của số âm Toán hạng bên trái là số bị dịch còn số bên phải chỉ số vị trí

mà các bit cần dịch

<< Dịch sang trái bit

Chuyển toàn bộ các bit cuả một số sang trái một vị trí, giữ nguyên dấu cuả số âm Toán hạng bên trái là số bị dịch còn số bên phải chỉ số vị trí

Trang 37

Kiểm tra giá trị của toán hạng bên phải có lớn hơn hoặc bằng toán hạng bên trái hay không

Trả về giá trị true nếu và chỉ nếu chỉ một trong các giá trị là true, các

trường hợp còn lại cho giá trị false

! Toán hạng đơn tử NOT Chuyển giá trị từ true sang false và ngược lại

Bảng 2.4 Các toán tử logic

Các toán tử điều kiện

Toán tử điều kiện là một loại toán tử đặc biệt vì nó bao gồm ba thành phần cấu thành biểu thức điều kiện

Cú pháp:

<biểu thức 1> ? <biểu thức 2> : <biểu thức 3>;

• biểu thức 1: biểu thức logic Trả về giá trị true hoặc false

• biểu thức 2: là giá trị trả về nếu <biểu thức 1> xác định là true

• biểu thức 3: là giá trị trả về nếu <biểu thức 1> xác định là false

Toán tử gán

Toán tử gán (=) dùng để gán một giá trị vào một biến và có thể gán nhiều giá trị cho

nhiều biến cùng một lúc Ví dụ đoạn lệnh sau gán một giá trị cho biến var và giá trị

này lại được gán cho nhiều biến trên một dòng lệnh đơn

Trang 38

Thứ tự ưu tiên của các toán tử

Các biểu thức được viết ra nói chung gồm nhiều toán tử Thứ tự ưu tiên quyết định trật

tự thực hiện các toán tử trên các biểu thức Bảng dưới đây liệt kê thứ tự thực hiện các toán tử trong Java

Thứ tự Toán tử

1 Các toán tử đơn như +, -, ++,

2 Các toán tử số học và các toán tử dịch như *, /, +, -, <<, >>

3 Các toán tử quan hệ như >, <, >=, <=, ==, !=

4 Các toán tử logic và bit như &&, ||, &, |, ^

5 Các toán tử gán như =, *=, /=, +=, -=

Bảng 2.5 Thứ tự ưu tiên các toán tử

Thay đổi thứ tự ưu tiên

Để thay đổi thứ tự ưu tiên trên một biểu thức, ta có thể sử dụng dấu ngoặc đơn ():

• Phần được giới hạn trong ngoặc đơn được thực hiện trước

• Nếu dùng nhiều ngoặc đơn lồng nhau thì toán tử nằm trong ngoặc đơn phía trong sẽ thực thi trước, sau đó đến các vòng phía ngoài

• Trong phạm vi một cặp ngoặc đơn thì quy tắc thứ tự ưu tiên vẫn giữ nguyên tác dụng

• Một chuỗi: “foo”, “Java”

• Tên của biến: myString, x

Trang 39

• Sự kết hợp của hai toán hạng bởi một toán tử hai ngôi: x + 2

• Một biến và toán tử một ngôi đi kèm: i++

• Biểu thức trong cặp dấu (): (x + 2)

Biểu thức có thể là sự kết hợp của các biểu thức khác được lồng nhau trong các cặp (): ((((4/x) + y) * 7) + z)

Kiểu của biểu thức là kiểu giá trị trả về sau khi lượng giá biểu thức

Cú pháp:

if (điều kiện) {

khối lệnh 1;

} else {

Trang 40

khối lệnh 2;

}

điều kiện: Biểu thức boolean như toán tử so sánh

khối lệnh 1: Khối lệnh được thực thi khi giá trị điều kiện là true

khối lệnh 2: Khối lệnh được thực thi nếu điều kiện trả về giá trị false

Đoạn chương trình sau kiểm tra xem các số có chia hết cho 5 hay không

int num=10;

If (num%5 == 0)

System.out.println (num + “chia hết cho 5!”);

else

System.out.println (num + ”không chia hết cho 5!”);

Ở đoạn chương trình trên num được gán giá trị nguyên là 10 Trong câu lệnh if-else

điều kiện num%5 trả về giá trị 0 và điều kiện thực hiện là true Thông báo 10 chia hết cho 5 được in ra Lưu ý rằng vì chỉ có một câu lệnh được viết trong đoạn if và else, bởi vậy không cần thiết phải được đưa vào dấu ngoặc móc { và }

biểu thức : Biến chứa một giá trị xác định

giá trị 1, giá trị 2, … giá trị N: Các giá trị hằng số phù hợp với giá trị trên biểu thức

khối lệnh 1, khối lệnh 1… khối lệnh N: Khối lệnh được thực thi khi trường hợp tương ứng có giá trị true

break: Từ khoá được sử dụng để bỏ qua tất cả các câu lệnh sau đó và chuyển điều khiển tới cấu trúc sau switch

Ngày đăng: 12/04/2023, 17:21

🧩 Sản phẩm bạn có thể quan tâm