Tải bản đầy đủ (.pdf) (187 trang)

BÀI GIẢNG MÃ HỌC PHẦN: NGÔN NGỮ LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (4.4 MB, 187 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

TRƯỜNG ĐẠI HỌC QUẢNG NAM KHOA TOÁN - TIN

  

<b>BÀI GIẢNG </b>

MÃ HỌC PHẦN: 21031641

NGÀNH ĐÀO TẠO: ĐẠI HỌC CÔNG NGHỆ THÔNG TIN

<b>1. Giảng viên biên soạn: Th.S TRẦN THỊ DIỆU HIỀN </b>

</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

<b>MỤC LỤC </b>

CHƯƠNG 1TỔNG QUAN VỀ CÁCH TIẾP CẬN HƯỚNG ĐỐI TƯỢNG ... 5

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

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

1.5. Câu hỏi và bài tập ... 10

CHƯƠNG 2NHỮNG KHÁI NIỆM CƠ BẢN CỦA LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG ... 12

2.1. Đối tượng (Object) ... 12

2.2. Lớp đối tượng (Class) ... 13

<i>2.3. Trừu tượng hóa dữ liệu (Abstraction) ... 13 </i>

<i><b>2.4. Khái niệm kế thừa (Inheritance) ... 14 </b></i>

<i><b>2.5. Khái niệm đóng gói (Encapsulation) ... 15 </b></i>

<i>2.6. Khái niệm đa hình (Polymorphism) ... 17 </i>

2.7. Câu hỏi và bài tập ... 18

CHƯƠNG 3NGÔN NGỮ LẬP TRÌNH JAVA ... 19

3.1. Giới thiệu và cài đặt ngôn ngữ Java ... 19

3.1.1. Lịch sử của Java ... 19

3.1.2. Đặt trưng của ngôn ngữ Java ... 19

3.1.3. Cài đặt, cấu hình các phần mềm và biên dịch chương trình Java ... 20

3.2. Kiến trúc chương trình Java ... 24

3.2.1. Các thành phần cơ bản của Java ... 25

3.2.2. Chương trình Java đầu tiên ... 26

3.5. Hàm – Phương thức (Fuction – Method) ... 52

3.5. Câu hỏi và bài tập ... 54

CHƯƠNG 4KẾ THỪA VÀ ĐA HÌNH TRÊN JAVA ... 57

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

4.6. Câu hỏi và bài tập ... 80

CHƯƠNG 5LẬP TRÌNH GIAO DIỆN TRÊN JAVA ... 84

5.1. Mở đầu ... 84

5.2. Giới thiệu AWT và Swing ... 84

5.3. Khái niệm các đối tượng cơ bản ... 85

5.3.1. Container (Thùng chứa) ... 85

5.3.2. Component (Thành phần) ... 87

5.3.3. Layout Manager: trình quản lý cách trình bày ... 98

5.4. Thiết kế GUI cho chương trình ... 99

5.4.1.Tạo khung chứa cửa sổ chương trình ... 99

5.4.2. Tạo hệ thống thực đơn ... 99

5.4.3. Gắn Component vào khung chứa ... 101

5.4.4. Trình bày các Component trong khung chứa ... 102

5.4.5. Các đối tượng khung chứa Container ... 109

5.7. Lập trình giao diện với WindowBuilder trong Eclipse ... 138

5.7.1. tải và cài đặt WindowBuilder ... 138

5.7.2. Lập trình ... 139

CHƯƠNG 6NHẬP XUẤT DỮ LIỆU ... 144

6.1. Tổng quát ... 144

6.1.1. Đường dẫn (Path) ... 144

6.1.2. Đường dẫn tương đối và tuyệt đối ... 145

6.1.3. Giới thiệu lớp java.io.File ... 145

6.1.4. Lấy đường dẫn đến thư mục đang làm việc ... 146

6.1.5. Tạo thư mục ... 147

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

7.4. Kết nối cơ sở dữ liệu với JDBC ... 163

7.4.1. Đăng ký trình điều khiển... 165

7.4.2. Thực hiện kết nối ... 167

7.5. Kiểu dữ liệu SQL và kiểu dữ liệu java... 174

7.6. Các thao tác cơ bản trên cơ sở dữ liệu ... 178

7.6.1. Hướng dẫn kết nối java với mysql – Chuẩn bị ... 178

7.6.2. Hướng dẫn kết nối java với mysql – Tạo database ... 178

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

<b>CHƯƠNG 1 </b>

<b>TỔNG QUAN VỀ CÁCH TIẾP CẬN HƯỚNG ĐỐI TƯỢNG </b>

<i>Chương này giới thiệu đến các bạn một số vấn đề liên quan đến lập trình truyền thống, lập trình hướng đối tượng; so sánh những ưu nhược điểm đối với 2 cách tiếp cận. Xu hướng phát triển của lập trình hướng đối tượng trong giai đoạn hiện nay và tương lai. </i>

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

Máy tính đầu tiên được lập trình bằng mã nhị phân, sử dụng các cơng tắt cơ khí để nạp chương trình. Cùng với sự xuất hiện của các thiết bị lưu trữ lớn và bộ nhớ máy tính có dung lượng lớn nên các ngơn ngữ lập trình cấp cao đầu tiên được đưa vào sử dụng . Thay vì phải suy nghĩ trên một dãy các bit và byte, lập trình viên có thể viết một loạt lệnh gần với tiếng Anh và sau đó chương trình dịch thành ngơn ngữ máy.

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

Lập trình tuyến tính là một phương pháp, kỹ thuật lập trình truyền thống. Trong lập trình tuyến tính, chương trình sẽ chỉ có một hàm và được thực hiện tuần tự từ đầu tới cuối. Đặc trưng của lập trình tuyến tính là: đơn giản và đơn luồng. Ví dụ ngơn ngữ Assembly …

<small> Ưu điểm: Đơn giản, chương trình đơn giản, dễ hiểu </small>

<small> Nhược điểm: Không thể áp dụng cho các chương trình phức tạp, khơng thể sử </small> dụng lại code.

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

Lập trình hướng cấu trúc hay cịn gọi là lập trình hướng thủ tục (Procedure Oriented Programming – POP): là một kỹ thuật lập trình, trong đó chương trình được chia thành các hàm (chương trình con)

Mỗi chương trình cịn có thể được chia ra nhiều chương trình con khác để đơn giản hóa cơng việc của chúng. Q trình này được gọi là quá trình làm mịn.

– Ví dụ chương trình nhập và hiển thị thơng tin người dùng sẽ chia thành hai chương trình con là chương trình nhập và xuất, nếu việc nhập thơng tin phức tạp thì chương trình nhập thơng tin có thể chia ra nhiều chương trình con khác nhau…

Trong lập trình hướng cấu trúc ta thường quan tâm đến việc phát triển các hàm mà ít quan tâm tới dữ liệu – thứ mà chúng dùng để xử lý công việc. Điều này khiến cho dữ liệu khó kiểm sốt.

Để liên kết giữa các hàm với nhau ta thường dùng biến toàn cục hoặc con trỏ. Các tính chất cơ bản của lập trình hướng cấu trúc là:

– Tập chung vào công việc cần thực hiện (thuật tốn) – Chương trình lớn được chia thành các hàm nhỏ hơn – Phần lớn các hàm sử dụng dữ liệu chung

– Dữ liêu trong hệ thống được chuyển động từ hàm này sang hàm khác.

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

– Hàm biến đổi dữ liệu từ dạng này sang dạng khác

– Sử dụng cách tiếp cận top-down trong thiết kế chương trình - Ví dụ: Các ngơn ngữ lập trình hướng cấu trúc: Pascal, C…

1.2. Phương pháp tiếp cận hướng đối tượng 1.2.1. Phương pháp 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:

<small></small> 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 sốt được sự truy nhập đến các biến dữ liệu chung.

<small></small> Không tiết kiệm được tài nguyên con người: Giải thuật gắn liền với cấu trúc dữ liệu, nếu thay đổi cấu trúc dữ liệu, 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.

Việc đóng gói dữ liệu được thực hiện theo phương pháp trừu tượng hoá đối tượng thành lớp từ thấp lên cao như sau:

• Thu thập các thuộc tính của mỗi đối tượng, gắn các thuộc tính vào đối tượng tương ứng.

• Nhóm các đối tượng có các thuộc tính tương tự nhau thành nhóm, loại bỏ bớt các thuộc tính cá biệt, chỉ giữ lại các thuộc tính chung nhất. Đây được gọi là q trình trừu tượng hố đối tượng thành lớp.

• Đóng gói dữ liệu của các đối tượng vào lớp tương ứng. Mỗi thuộc tính của đối tượng trở thành một thuộc tính của lớp tương ứng.

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

• Việc truy nhập dữ liệu được thực hiện thông qua các phương thức được trang bị cho lớp. Không được truy nhập tự do trực tiếp đến dữ liệu.

• Khi có thay đổi trong dữ liệu của đối tượng, ta chỉ cần thay đổi các phương thức truy nhập thuộc tính của lớp, mà khơng cần phải thay đổi mã nguồn của các chương trình

• Trong lớp dẫn xuất (lớp được 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.

Ngôn ngữ lập trình hướng đối tượng phổ biến hiện nay là Java, C++, 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.

<b>Đặc trưng </b>

Lập trình hướng đối tượng có hai đặc trưng cơ bản:

• Đó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.

• Sử dụng lại mã nguồn: việc sử dụng lại mã nguồn được thể hiện thông qua cơ chế kế thừa. Cơ chế này cho phép các lớp đối tượng có thể kế thừa 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 (mã nguồn) của các lớp bị kế thừa, mà không cần phải định nghĩa lại.

<b>Ưu điểm </b>

Lập trình hướng đối tượng có một số ưu điểm nổi bật:

• Khơng cịn nguy cơ dữ liệu bị thay đổi tự do trong chương trình. Vì dữ liệu đã được đóng gói vào các đối tượng. Nếu muốn truy nhập vào dữ liệu phải thông qua các phương thức cho phép của đối tượng.

• Khi thay đổi cấu trúc dữ liệu của một đối tượng, không cần thay đổi các đổi mã nguồn của các đối tượng khác, mà chỉ cần thay đổi một số hàm thành phần của đối tượng bị thay đổi.

Điều này hạn chế sự ảnh hưởng xấu của việc thay đổi dữ liệu đến các đối tượng khác trong chương trình.

• Có thể sử dụng lại mã nguồn, tiết kiệm tài nguyên. Vì nguyên tắc kế thừa cho phép các lớp kế thừa sử dụng các phương thức được kế thừa từ lớp khác như những phương thức của chính nó, mà khơng cần thiết phải định nghĩa lại.

<b>• Phù hợp với các dự án phần mềm lớn, phức tạp. </b>

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

1.2.2. Phương pháp phân tích và thiết kế hướng đối tượng

Một vấn đề cơ bản đặt ra cho phương pháp hướng đối tượng là từ một bài toán ban đầu, làm sao để thu được một tập các đối tượng, với các chức năng được phối hợp với nhau, đáp ứng được yêu cầu của bài tốn đặt ra?

Phương pháp phân tích thiết kế hướng đối tượng ra đời nhằm trả lời cho câu hỏi này. Mục đích là xây dựng một tập các lớp đối tượng tương ứng với mỗi bài toán, phương pháp này tiến hành theo hai pha chính:

Pha phân tích: Chuyển đổi u cầu bài tốn từ ngơn ngữ tự nhiên sang ngơn ngữ mơ hình.

Pha thiết kế: Chuyển đổi đặc tả bài tốn dưới dạng ngơn ngữ mơ hình sang một mơ hình cụ thể có thể cài đặt được.

Hai pha phân tích và thiết kế này bao gồm nhiều bước khác nhau(gồm 6 bước): • Mơ tả bài tốn

<b>Phương pháp mơ hình bài toán </b>

Hai cách này khác nhau ở cách tiếp cận và mơ hình bài tốn.

Phương pháp hướng đối tượng tiến hành theo phương pháp từ dưới lên trên, từ thấp lên cao, từ cụ thể đến trừu tượng. phương pháp hướng đối tượng bắt đầu bằng những đối tượng cụ thể, tập hợp thuộc tính của từng đối tượn, sau đó nhóm các đối tượng tương tự lại thành nhóm, loại bỏ các thuộc tính cá biệt, giữ lại những thuộc tính chung nhất, nhóm thành lớp. Cho nên quá trình hình thành lớp là quá trình đi từ thấp lên cao, từ cụ thể ở mức thấp đến trừu tượng hóa ở mức cao.

Phương pháp cấu trúc trong lập trình truyền thống tiếp cận theo phương pháp từ trên xuống dưới, từ tổng quan đến chi tiết. Phương pháp bắt đầu từ một bài toán tổng quan, ở mức khái quát cao, chia nhỏ dần, làm mịn dần cho đến khi thu được một tập các bài toán con, nhỏ hơn, cụ thể hơn, chi tiết hơn.

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

<b>Đặc trưng về đóng gói </b>

Phương pháp hướng đối tượng có đặc trưng là dữ liệu được đóng gói để hạn chế truy cập tự do trực tiếp vào dữ liệu. Đóng gói cho phép sử dụng lại mã nguồn để tiết kiệm tài ngun và cơng sức lập trình.

Phương pháp cấu trúc là cấu trúc dữ liệu và giải thuật, mối quan hệ phụ thuộc chặc chẽ của giải thuật vào cấu trúc dữ liệu.

<b>Ưu, nhược điểm </b>

Phương pháp hướng đối tượng có ưu iểm là bảo vệ được dữ liệu tránh bị truy cập tự do trực tiếp từ bên ngoài cho phép sử dụng lại mã nguồn để tiết kiệm tài nguyên và công sức lập trình. Tuy nhiên, phương pháp này lại khá phức tạp, khó theo dõi được luồng dữ liệu và giải thuật không phải là vấn đề trọng tâm của phương pháp này.

Phương pháp hướng cấu trúc có ưu điểm là tư duy giải thuật rõ ràng, dễ theo dõi luồng dữ liệu, chương trình đơn giản và dễ hiểu. Tuy nhiên khơng bảo vệ được an toàn dữ liệu trong chương trình và sự phụ thuộc chặc chẽ của dữ liệu và giải thuật do đó việc kế thừa khó khăn.

<b>Lĩnh vực ứng dụng </b>

Phương pháp hướng đối tượng thường áp dụng cho những bài toán lớn, phức tạp, có nhiều luồng dữ liệu khác nhau, khơng thể quản lí bằng phương pháp cấu trúc.

Phương pháp cấu trúc thường phù hợp với những bài tốn nhỏ, có luồng dữ liệu rõ ràng và người lập trình có khả năng tự quản lí được mọi truy nhập đến dữ liệu của chươ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

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ểnthêm các thành phần mình cần mà chưa có trong thư viện.

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

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

- 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.

<b>Lập trình hướng tác nhân (Agent-oriented programming) </b>

Lập trình hướng agent có thể xem là một mức trừu tượng cao hơn của lập trình hướngthành phần.

Trong đó, các agent là các thành phần có khả năng hoạt động độc lập, tự chủ để hồn thành cơng việc của mình. Hơn nữa, các agent có khả năng chủ động liên lạc với các agent khác để có thể phối hợp, cộng tác hay cạnh tranh nhau để hồn thành nhiệm vụ.

Lập trình hướng agent có hai đặc trưng cơ bản:

- 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 nó. - Thứ hai là tính tổ chức xã hội giữa các agent, cho phép các agent phối hợp,cộng tác, cạnh tranh nhau để hoàn thành nhiệm vụ chung của tồn hệ thống.

<b>Lập trình hướng khía cạnh (Aspect-oriented programming-AOP) </b>

Phương pháp lập trình hướng khía cạnh là phương pháp lập trình phát triển tư duy tách biệt các mối quan tâm khác nhau thành các mô đun khác nhau. Ở đây, một mối quantâm thường không phải một chức năng nghiệp vụ cụ thể và có thể đóng gói mà là mộtkhía cạnh (thuộc tính) chung mà nhiều mô đun phần mềm trong cùng hệ thống nên có,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ácmô đ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ênquan. 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.

1.5. Câu hỏi và bài tập

<b>Bài 1. Nêu các đặc trưng cơ bản trong cách tiếp cận lập trình hướng chức năng và lập </b>

trình hướng đối tượng.

<b>Bài 2. 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 </b>

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.

<b>Bài 3. 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 </b>

của Một khách hàng? Một kỹ sư thiết kế? Người bán?

Nhà sản xuất?

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

<b>Bài 4. Chọn một bài tốn mà bạn muốn mơ hình hố từ cách tiếp cận hướng đối tượng. </b>

Bạn nên chọn các lĩnh vực mà bạn quan tâm hay bạn thường gặp trong công việc hàng ngày.

Giả sử bạn sẽ viết một chương trình để tự động vài chức năng của bài tốn. Đầutiên viết một trang giấy mô tả yêu cầu của chương trình. Đoạn văn đầu tiên mơ tả tổng quát hệ thống dự định. Kế đến nêu rõ yêu cầu chức năng mà người sử dụng bìnhthường mơ tả hệ thống, tránh dùng các từ kỹ thuật như, “Hệ thống này phải chạy trên môi trường Windows NT, và dùng giao thức TCP/IP để . . .”

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

<b>CHƯƠNG 2 </b>

<b>NHỮNG KHÁI NIỆM CƠ BẢN CỦA LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG </b>

<i>Nội dung chương giới thiệu tới người đọc những khái niệm trong lập trình hướng đối tượng như: Đối tượng (Object); Lớp đối tượng (Class); Kế thừa (Inhenrritan); Đóng </i>

gói (Encapsulation); …

2.1. Đối tượng (Object)

<i>Đối tượng là khái niệm cơ sở quan trọng nhất của cách tiếp cận hướng đối tượng. </i>

Theo nghĩa thông thường thì đối tượng là người, vật hay hiện tượng mà con người nhằm vào trong suy nghĩ, trong hành động; là bất kỳ cái gì nhìn thấy, sờ mó được. Trong

<i>phương pháp hướng đối tượng thì Đối tượng là một khái niệm, một sự trừu tượng hoá hay một sự vật có nghĩa trong bài tốn đang khảo sát. </i>

<i>Đối tượng là thực thể của hệ thống, của cơ sở dữ liệu (CSDL) và được xác định </i>

thông qua định danh (IDentifier) của chúng.

<i><b>Mỗi đối tượng có tập các đặc trưng bao gồm: tên đối tượng nhằm xác định một thực thể, dữ liệu thành phần (thuộc tính của đối tượng) nhằm mơ tả đối tượng, các hàm thành phần (hành động/phương thức: Method) trên dữ liệu để mô tả hành vi của đối tượng. </b></i>

Đối tượng là những thực thể được xác định trong thời gian hệ thống hướng đối tượng hoạt động. Như vậy đối tượng có thể biểu diễn cho người, vật, hay một bảng dữ liệu, … cần xử lý trong chương trình. Nhiệm vụ của lập trình hướng đối tượng (LTHĐT) là phân tích bài tốn thành các đối tượng và xác định bản chất của sự trao đổi thơng tin giữa chúng. Đối tượng trong chương trình cần phải được chọn sao cho nó thể hiện được một cách gần nhất với những thực thể có trong hệ thống thực.

Hệ thống xem như tập các đối tượng được trao đổi với nhau thông qua việc gửi và nhận thơng điệp.

 Các ví dụ về đối tượng

+ Mô tả đối tượng: Các đối tượng cụ thể được mơ tả bằng hình sau:

+ Trao đổi thông tin giữa các đối tượng: Xét các đối tượng:

- Phịng kế tốn: chịu trách nhiệm lương các nhân sự, phương thức chi trả lương

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

- Phòng nhân sự: chịu trách nhiệm các thông tin nhân sự, một nhân sự yêu cầu phịng kế tốn chi trả lương cho mình, gọi phương thức từ đối tượng khác.

2.2. Lớp đối tượng (Class)

Tập các đối tượng có cùng tính chất và cách ứng xử chung (thuộc tính, hàm): Lớp người, lớp đa giác…Lớp được hiểu như một bản mẫu, đối tượng là thể hiện (Instance) của một lớp xác định. Trong lập trình hướng đối tượng, lớp được xem là đồng nhất với kiểu dữ liệu trừu tượng (ADT- Abstract Data Type).

Khai báo lớp: Bao gồm các thuộc tính cùng với kiểu dữ liệu, các giá trị cụ thể của thuộc tính sẽ được gán sau khi đã tạo ra đối tượng. Trong khai báo lớp có những phương thức trong lớp đó. Lớp được mơ tả như sau:

2.3. Trừu tượng hóa dữ liệu (<i>Abstraction</i>)

Trừu tượng hóa là cách biểu diễn những đặc tính chính và bỏ qua những chi tiết. Trừu tượng hóa là sự mở rộng kiểu dữ liệu và cho phép định nghĩa những phép toán trừu tượng trên những dữ liệu trừu tượng.

Để xây dựng cách lớp, chúng ta phải sử dụng khái niệm trừu tượng hóa. Trong ứng dụng chúng ta quan tâm đến việc mô tả đối tượng trong thế giới thực thơng qua các tính chất của đối tượng bỏ qua cách biểu diễn dữ liệu.

Ví dụ: đối tượng hình gồm có số cạnh, màu viền, màu nền (trừu tượng hoá về dữ liệu).

Ta cũng quan tâm đến tập tất cả các hành vi có thể có của đối tượng để xây dựng các hàm.

Ví dụ: vẽ, di chuyển, xố.

Ta không quan tâm vào cách thực thi của hàm mà tập trung vào các đối số và giá trị trả về của hàm (sự trừu tượng hoá về thủ tục).

Khi xây dựng phần mềm thì nguyên lý trừu tượng hóa được thực hiện thơng qua việc trừu tượng hóa các chức năng, hàm và trừu tượng hóa các kiểu dữ liệu nguyên thủy. - int Màu viền - int Màu tô

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

2.4. Khái niệm kế thừa (Inheritance<small>)</small>

<i>Khái niệm "kế thừa" thường được dùng trong các ngơn ngữ lập trình hướng đối </i>

tượng để chuyển quan hệ tổng quát hóa và đặc biệt hóa của thế giới thực vào các chương trình máy tính. Tính kế thừa cho phép ta xây dựng một lớp mới dựa trên các định nghĩa của một lớp đã có.

<i>Nếu một lớp A là lớp đặc biệt hóa của lớp B (nghĩa là lớp B là lớp tổng quát hóa của lớp A) thì trong lập trình hướng đối tượng lớp A được cài đặt là lớp kế thừa của lớp B (nói ngắn gọn là "lớp A kế thừa lớp B"). Khi lớp A kế thừa lớp B thì lớp B được gọi là "lớp cơ sở" hay "lớp cha" (trong mối quan hệ kế thừa đang xét), còn lớp A thì được gọi là "lớp kế thừa", "lớp con" hay "lớp dẫn xuất". </i>

 Tính thừa kế là cho phép dùng lại một lớp hiện có (sử dụng các thuộc tính, phương thức) để xây dựng một lớp mới bằng cách bổ sung thêm các thuộc tính và phương thức mới. Ví dụ:

-Lớp sinh viên có các tính chất: mã sv, tên sinh viên, ngày sinh...các phương thức: nộp điểm, thi...

-Lớp sinh viên thể dục cũng có các thuộc tính và phương thức như lớp sinh viên nhưng có thêm các thuộc tính khác như chiều cao, cân nặng...và các phương thức: chạy, nhảy cao...

<i>Lớp sinh viên thể dục (lớp con) là lớp kế thừa từ lớp sinh viên (lớp cha/lớp cơ sở/ siêu lớp) </i>

 Nguyên lý kế thừa:

-Kế thừa đơn: Một lớp có thể kế thừa từ một lớp cơ sở, cây phân cấp các lớp.

-Kế thừa bội: Một lớp có thể kế thừa từ nhiều lớp cơ sở. Trong Java chỉ hỗ trợ kế thừa đơn, kế thừa bội thực hiện thông qua khái niệm giao diện (Interface).

Ví dụ về cấu trúc phân cấp các lớp theo quan hệ kế thừa như hình sau:

 Việc kế thừa phải tuân thủ theo nguyên tắc bao bọc thông tin, có nghĩa:

<b>-public: Các biến dữ liệu, các hàm được truy cập mọi nơi trong hệ thống </b>

</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">

<b>-private: Các biến dữ liệu, các hàm được truy cập chỉ trong lớp đó. </b>

<b>-protected: Các biến dữ liệu, các hàm được truy cập chỉ trong lớp đó và trong các </b>

lớp con của nó.

<b>-static: Các biến dữ liệu, các hàm được dùng cho mọi đối tượng, được khởi tạo khi </b>

nạp lớp vào lúc đầu. Khai báo static được dùng như sau: Nó thuộc vào một lớp chứ không thuộc một đối tượng riêng lẻ nào. Khi thực hiện sẽ tạo ra một bản sao của dữ liệu, hàm trong lớp.

<i><b>2.5. Khái niệm đóng gói (Encapsulation) </b></i>

Đóng gói là sự che giấu bên trong dữ liệu riêng của mỗi đối tượng của lớp được khai

<i>báo và chỉ được truy xuất thơng qua hệ thống các phương thức có sẵn của lớp (chỉ có thể </i>

<i><b>gọi những phương thức có sẵn của lớp). Vì vậy, nó cịn được gọi là data hiding (nghĩa là </b></i>

<i>che giấu dữ liệu). </i>

 Tính đóng gói có những đặc điểm như sau:

- Tạo ra cơ chế để ngăn ngừa việc gọi phương thức của lớp này tác động hay truy xuất dữ liệu của đối tượng thuộc về lớp khác.

<i>- Dữ liệu riêng (khi được khai báo là private) của mỗi đối tượng được bảo vệ khỏi </i>

sự truy xuất khơng hợp lệ từ bên ngồi.

- Người lập trình có thể dựa vào cơ chế này để ngăn ngừa việc gán giá trị không hợp lệ vào thành phần dữ liệu của mỗi đối tượng.

- Cho phép thay đổi cấu trúc bên trong của một lớp mà không làm ảnh hưởng đến những lớp bên ngồi có sử dụng lớp đó.

 Để cài đặt tính đóng gói, chúng ta có 2 bước như sau:

- Khai báo các thuộc tính của đối tượng trong lớp là private để các lớp khác không thể truy cập trực tiếp/sửa đổi được.

- Cung cấp các phương thức getter/setter có phạm vi truy cập là public để truy cập và sửa đổi các giá trị của thuộc tính trong lớp. Phương thức getter là phương thức truy cập vào thuộc tính của đối tượng và trả về các thuộc tính của đối tượng, cịn phương thức setter là phương thức truy cập vào thuộc tính của đối tượng và gán giá trị cho các thuộc tính của đối tượng đó.

Ví dụ:

<b>File Person.java </b>

public class Person {

// khai báo các thuộc tính của đối tượng là private private String cmnd;

private String hoTen;

// tạo các phương thức getter/setter

// 2 phương thức getCmnd() và getHoTen() là phương thức getter

// dùng để trả về số chứng minh nhân dân và họ tên của đối tượng

</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">

// và kiểu trả về của hai phương thức này tương ứng với kiểu dữ liệu của thuộc tính

// 2 phương thức setCmnd() và setHoTen() là phương thức setter

// dùng để gán giá trị cho thuộc tính chứng minh nhân dân và họ tên của đối tượng

// trong đó tham số truyền vào của 2 phương thức này được gọi là tham số (biến cục bộ)

// và có kiểu dữ liệu tương ứng với kiểu dữ liệu của thuộc tính (biến đối tượng)

public String getCmnd() { return cmnd;

}

// this là từ khóa có ý nghĩa là một tham chiếu đặc biệt // chiếu tới đối tượng chủ của phương thức hiện hành

// this có thể được dùng để truy cập biến đối tượng (instance variable)

// hoặc gọi phương thức đối với đối tượng hiện hành. // Thông thường, công dụng này của this chỉ có ích

// khi tên biến đối tượng bị trùng với tham số (biến cục bộ - local variable) của phương thức

public void setCmnd(String cmnd) {

public static void main(String[] args) { Person person = new Person();

</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">

System.out.println("Tên: " + person.getHoTen() + ", số cmnd: " + person.getCmnd());

} }

2.6. Khái niệm đa hình <small>(Polymorphism)</small>

Kỹ thuật đa hình trong các ngơn ngữ lập trình hướng đối tượng tạo điều kiện cho các lập trình viên gia tăng khả năng tái sử dụng những đoạn mã nguồn được viết một cách tổng quát và có thể thay đổi cách ứng xử một cách linh hoạt tùy theo loại đối tượng.

<i>Tính đa hình (Polymorphism) trong Java được hiểu là trong từng trường hợp, hoàn </i>

cảnh khác nhau thì đối tượng có hình thái khác nhau tùy thuộc vào từng ngữ cảnh. Đối tượng có tính đa hình được xem như một đối tượng đặc biệt vì có lúc đối tượng này trở thành một đối tượng khác và cũng có lúc đối tượng này trở thành một đối tượng khác nữa

<i>(tùy vào từng hoàn cảnh). Sự "nhập vai" vào các đối tượng khác nhau này giúp cho đối </i>

tượng đa hình ban đầu có thể thực hiện những hành động khác nhau của từng đối tượng cụ thể.

<b>Ví dụ: Khi bạn ở trong trường học là sinh viên thì bạn có nhiệm vụ học, nghe </b>

giảng,..., nhưng khi bạn ở nhà thì bạn lại đóng vai trị là thành viên trong gia đình và bạn có nhiệm vụ phải làm việc nhà, rồi khi bạn vào siêu thị thì bạn đóng vai trị là khách hàng đi mua hàng. Vì vậy, chúng ta có thể hiểu đa hình của đối tượng là trong từng trường hợp, hồn cảnh khác nhau thì đối tượng có khả năng thực hiện các công việc khác nhau.

Để thể hiện tính đa hình, chúng ta cần đảm bảo 2 điều kiện sau: <small></small> Các lớp phải có quan hệ kế thừa với 1 lớp cha nào đó.

<small></small> <i>Phương thức đa hình phải được ghi đè (override) ở lớp con. Tính đa hình chỉ </i>

được thể hiện ghi đã ghi đè lên phương thức của lớp cha.

<b><small>File Shape.java</small></b>

public class Shape { public void show() {

System.out.println("Đây là phương thức show() của lớp Shape");

} }

<b>File Rectangle.java</b>

public class Rectangle extends Shape { public void show() {

System.out.println("Đây là phương thức show() của lớp Rectangle");

} }

<b>File Square.java</b>

public class Square extends Shape { public void show() {

</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18">

System.out.println("Đây là phương thức show() của lớp

public static void main(String[] args) { Shape shape = new Shape();

shape.show(); // hiển thị dòng "Đây là phương thức show() của lớp Shape"

// bản chất của shape là Shape, nhưng vì khai báo Rectangle nên chúng ta chỉ nhìn thấy những gì mà Rectangle có

// vì vậy sẽ chạy những hàm của Rectangle shape = new Rectangle();

shape.show(); // hiển thị dòng "Đây là phương thức show() của lớp Rectangle"

// tương tự lúc này shape sẽ đóng vai trị là 1 Square shape = new Square();

shape.show(); // hiển thị dòng "Đây là phương thức show() của lớp Square"

} }

2.7. Câu hỏi và bài tập

<b>Bài 1. Nêu các đặc trưng cơ bản trong cách tiếp cận lập trình hướng chức năng và lập </b>

trình hướng đối tượng.

<b>Bài 2. Tại sao lại gọi khái niệm lớp là kiểu dữ liệu trừ tượng trong LTHĐT. </b>

<b>Bài 3. Khái niệm kế thừa trong lập trình hướng đối tượng là gì? Cho một ví dụ về tính </b>

kế thừa. Java hỗ trợ quan hệ kế thừa như thế nào?

<b>Bài 4. Nêu nguyên lý hoạt động của tính đa thể. Cho ví dụ. </b>

<b>Bài 5. Sưu tập các thuộc tính và phương thức khi mơ tả lớp “Sinh Vien”, cho một thể </b>

hiện của lớp này.

<b>Bài 6. Sưu tập các thuộc tính và phương thức khi mơ tả lớp “Phan So”, cho một thể </b>

hiện của lớp này.

<b>Bài 7. Sưu tập các thuộc tính và phương thức khi mô tả lớp “Hoc Sinh”, cho một thể </b>

hiện của lớp này.

</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">

<b>CHƯƠNG 3 </b>

<b>NGƠN NGỮ LẬP TRÌNH JAVA </b>

<i><b>Trong nội dung chương này, chúng ta sẽ lần lượt tìm hiểu về khái niệm Java là gì? Bên cạnh đó, nội dung chương này cũng sẽ lần lượt giới thiệu những đặc điểm cơ </b></i>

<i>bản và ứng dụng của ngôn ngữ Java và các Platform cơ bản của ngơn ngữ lập trình Java. </i>

<i> Cách cài đặt Java, cấu hình biến mơi trường cho Java và các bước cài đặt và cấu hình Eclipse. </i>

<i>Nội dung chương cũng giới thiệu các kiểu dữ liệu có trong Java, cấu trúc một chương trình Java và các cấu trúc lệnh của Java. </i>

3.1. Giới thiệu và cài đặt ngôn ngữ Java 3.1.1. Lịch sử của Java

<b>Giới thiệu ngôn ngữ Java </b>

<b>Java là một ngôn ngữ lập lập trình, được phát triển bởi Sun Microsystem vào </b>

năm 1995, là ngôn ngữ kế thừa trực tiếp từ C/C++ và là một ngơn ngữ lập trình hướng đối tượng.

Java là tên một hòn đảo ở Indonesia - hòn đảo nổi tiếng với loại coffee Peet và cũng là loại nước uống phổ biến của các kỹ sư Sun. Ban đầu Ngôn ngữ này được đặt

<i>tên là "Oak" (có nghĩa là "Cây sồi" - 1991), nhưng các luật sư của Sun xác định rằng </i>

tên đó đã được đăng ký nhãn hiệu nên các nhà phát triển đã phải thay thế bằng một tên mới - và cũng vì lý do trên mà cái tên Java đã ra đời và trở thành tên gọi chính thức của Ngôn ngữ này - Ngôn ngữ Lập trình Java.

<b>Ứng dụng của Java </b>

Hiện nay Java được sử dụng với các mục đích sau:

- Phát triển ứng dụng cho các thiết bị điện tử thông minh, các ứng dụng cho doanh nghiệp với quy mô lớn.

<i>- Tạo các trang web có nội dung động (web applet), nâng cao chức năng của </i>

server.

- Phát triển nhiều loại ứng dụng khác nhau: Cơ sở dữ liệu, mạng, Internet, viễn thơng, giải trí,...

3.1.2. Đặt trưng của ngôn ngữ Java

<b>Đặc điểm của Java </b>

- Thông dịch (Interpreter): Tệp chương trình nguồn (.java) được biên dịch qua tập tin nhị phân (.class), tập tin chứa các mã thực hiện của chương trình và các tham số của máy ảo Java (Java Virtual Machine: JVM). Máy ảo Java có tác dụng thông dịch chuyển tập tin nhị phân thành các lệnh cần thiết phù hợp với từng cấu hình.

- Ứng dụng hoàn toàn toàn độc lập với cấu hình máy, “viết một lần, chạy mọi nơi” (Write Once, Run Anywhere), nghĩa là Java cho phép chúng ta viết code một lần và thực thi được trên các hệ điều hành khác nhau. Ví dụ, chúng ta viết code trên Hệ

</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20">

điều hành Windows và nó có thể thực thi được trên các Hệ điều hành Linux và Mac OS.... Vì vậy, các ứng dụng phù hợp với mạng Internet (Web).

- Cơ chế bảo mật cao

- Quen thuộc: Vì Java kế thừa trực tiếp từ C/C++ nên nó có những đặc điểm của ngôn ngữ này, Java đơn giản vì mặc dù dựa trên cơ sở C++ nhưng Sun đã cẩn thận lược bỏ các tính năng khó nhất của của C++ để làm cho ngôn ngữ này dễ sử dụng hơn.

Hướng đối tượng và quen thuộc.

<i>- Mạnh mẽ (thể hiện ở cơ chế tự động thu gom rác - Garbage Collection) và an </i>

toàn.

<i>- Kiến trúc trung lập, độc lập nền tảng và có tính khả chuyển (Portability). </i>

- Hiệu suất cao. - Phân tán.

- Đa nhiệm: Ngơn ngữ Java cho phép xây dựng trình ứng dụng, trong đó nhiều q trình có thể xảy ra đồng thời. Tính đa nhiệm cho phép các nhà lập trình có thể biên soạn phần mềm đáp ứng tốt hơn, tương tác tốt hơn và thực hiện theo thời gian thực.

3.1.3. Cài đặt, cấu hình các phần mềm và biên dịch chương trình Java

<b>Các platform cơ bản của Java </b>

Java Platform gồm có 3 thành phần chính:

<small> </small> <i>Java Virtual Machine (Java VM): Máy ảo Java. </i>

<small> </small> <i>Java Application Programming Interface (Java API). </i>

<small> </small> <i>Java Development Kit (JDK) gồm trình biên dịch, thơng dịch, trợ giúp, soạn tài </i>

liệu... và các thư viện chuẩn.

</div><span class="text_page_counter">Trang 21</span><div class="page_container" data-page="21">

<b>Tiêu chuẩn của một môi trường Java </b>

Thông thường, các chương trình Java trải qua 5 giai đoạn chính:

<small></small> <b>Editor: Lập trình viên viết chương trình và được lưu vào máy tính với định </b>

dạng .java.

<small></small> <i><b>Compiler: Biên dịch chương trình thành bytecodes (định dạng .class) - nhờ </b></i>

bước trung gian này mà Java được viết 1 lần và chạy trên các hệ điều hành khác nhau. <small></small> <b>Class Loader: Đọc file .class chứa mã bytecodes và lưu vào trong bộ nhớ. </b>

<small></small> <b>Bytecode Verifier: Đảm bảo rằng mã bytecodes là hợp lệ và không vi phạm </b>

các vấn đề về bảo mật của Java.

<small></small> <b>Intepreter: Biên dịch bytecodes thành mã máy để máy tính có thể hiểu </b>

được và sau đó thực thi chương trình.

<b>Download và cài đặt JDK (Java Development Kit) </b>

<b>Đầu tiên, ta vào trang chủ của Oracle để tiến hành tải về JDK </b>

</div><span class="text_page_counter">Trang 22</span><div class="page_container" data-page="22">

Tại đây, tùy thuộc vào máy tính cài hệ điều hành Windows 32 bit hay 64 bit mà

<b>ta chọn phiên bản cho phù hợp. Trước tiên cần chọn vào mục Accept License Agreement và sau đó tiến hành chọn phiên bản JDK phù hợp và lưu vào ổ đĩa. </b>

<b>Tiến hành cài đặt: </b>

<b>Bước 1: Kích chuột phải vào file JDK vừa tải về và chọn Open hoặc chúng ta có thể </b>

nhấp đơi chuột vào file này để mở file cài đặt lên.

<b>Bước 2: Chọn Next </b>

<b>Bước 3: Chọn Change để thay đổi thư mục cài đặt. Nếu không cần thay đổi, chúng ta </b>

chọn Next để tiếp tục

<b>Thiết lập biến môi trường và cấu hình cho Java </b>

<b>Mở System Properties\ chọn Advanced system settings\Environment Variables\ </b>

<i><b>Trong hộp thoại Environment Variables, chúng ta vào phần System variables và </b></i>

<b>chọn New </b>

<b>Trong hộp thoại New System Variable, chúng ta điền vào ơ Variable name là JAVA_HOME, cịn trong ô Variable value chúng ta nhấn vào nút Browser </b>

<i><b>Directory và trỏ tới đường dẫn cài đặt thư mục JDK. Nhấn OK để hoàn tất việc đặt </b></i>

tên biến môi trường.

Tiếp theo, cũng trong phần System variables, chúng ta tiến hành sửa đổi biến

<b>môi trường Path như sau: Kích chuột vào dịng Path và chọn Edit. Hộp thoại Edit environment variable xuất hiện, chúng ta nhấn chuột vào nút New và điền vào dòng </b>

<i><b>sau: %JAVA_HOME%\bin;, nhấn OK để kết thúc. </b></i>

Để biết được quá trình cấu hình và cài đặt biến môi trường thành công hay chưa,

<b>bạn gõ tổ hợp phím Windows + R, hộp thoại Run sẽ xuất hiện, bạn nhập vào cmd ở </b>

<i><b>dịng Run. Màn hình Command Prompt xuất hiện, bạn nhập vào dòng sau: java </b></i>

<b>-version. Nếu chúng ta cấu hình thành cơng thì sẽ có kết quả như sau: </b>

</div><span class="text_page_counter">Trang 23</span><div class="page_container" data-page="23">

<b>Hướng dẫn cách cài đặt và sử dụng Eclipse Download và cài đặt Eclipse </b>

Đầu tiên chúng ta vào trang chủ để tải về Eclipse

<b>: Chọn Download Packages để vào màn hình </b>

download Eclipse.

<b>Sau đó chọn Eclipse IDE for Java EE Developers và chọn phiên bản 32 bit hay </b>

64 bit tùy thuộc vào phiên bản hệ điều hành đang dùng.

<b>Chúng ta chọn ổ đĩa để lưu file Eclipse. Cài đặt </b>

<b>Bước 1: Tiến hành giải nén file nén Eclipse vừa tải về. </b>

<b>Bước 2: Kích chuột phải vào eclipse.exe và chọn Open hoặc chúng ta có thể </b>

nhấp đơi chuột vào file này để mở file cài đặt lên.

<b>Hộp thoại Eclipse Launcher xuất hiện. Trong ô Workspace chúng ta sẽ chọn </b>

<i>đường dẫn trỏ tới thư mục lưu Workspace (Workspace ở đây là một thư mục để lưu </i>

<i><b>trữ tập tất cả các Project mà chúng ta tạo ra trên Eclipse). Bạn có thể chọn vào Use </b></i>

<b>this as the default and do not again để mỗi khi khởi động Eclipse lên thì hộp thoại </b>

này sẽ khơng xuất hiện nữa.

Chọn Launch để tiến hành cài đặt Eclipse.

<b>Hướng dẫn sử dụng Eclipse </b>

<small> </small> Thay đổi Workspace

<b>Để thay đổi đường dẫn Workspace, bạn vào Switch Workspace → Other và </b>

chọn vào đường dẫn bạn cần thay đổi. <small> </small> Kiểm tra phiên bản Java

<b>Để xem phiên bản Java bạn đang dùng, bạn vào Window → Preferences. Hộp thoại Preferences được hiển thị, bạn nhìn vào dòng Compiler compliance settings sẽ </b>

thấy được phiên bản Java đang dùng. <small> </small> Tạo Project

<b>Để tạo một project Java mới, trước tiên bạn cần phải thay đổi Perpective là Java. Để thay đổi bạn chọn Window → Perpective → Open Perpective và chọn </b>

<i><b>Java. Sau đó, bạn vào File → New (hoặc nhấn tổ hợp phím tắt Alt + Shift + N) và </b></i>

<b>chọn Java Project. </b>

</div><span class="text_page_counter">Trang 24</span><div class="page_container" data-page="24">

<b>Trong hộp thoại New Java Project, bạn nhập vào tên Project trong ô Project name và nhấn Finish. </b>

<small> </small> Tạo Package

<i><b>Package trong Java dùng để nhóm các Lớp (Class), Interface và các gói phụ có </b></i>

<b>liên quan với nhau vào chung một nhóm lớn, nhóm này được gọi là Package. Để tạo một Package mới, chúng ta vào Package Explorer ở phía trái màn hình, nhấp đơi chuột vào tên project vừa tạo → kích chuột phải vào src → New → Package: </b>

Đặt tên cho Package và nhấn Finish để hoàn tất. <small> </small> Tạo Class

<i><b>Để tạo mới một Lớp (Class), bạn nhấp phải chuột vào tên Package và </b></i>

<b>chọn New → Class. </b>

<b>Hộp thoại New Java Class xuất hiện, bạn nhập vào tên Class trong ô Name và chọn vào public static void main(String[] args) và bấm Finish để kết thúc. Lưu ý: Để sử dụng tính chất nhắc lệnh của Eclipse, các bạn gõ tổ hợp phím Ctrl + Space, ví </b>

dụ để gõ nhanh hàm main thì các bạn gõ chữ main và nhấn Ctrl + Space, chọn vào dòng main - main method và nhấn Enter để hồn thành.

<b>Biên dịch chương trình trên Eclipse </b>

<b>Để biên dịch và thực thi chương trình, chúng ta có 3 cách như sau: Cách 1: Chọn vào biểu tượng Run trên thanh công cụ: </b>

<i><b>Cách 2: Chọn vào chữ Run trên thanh công cụ và chọn Run (hoặc nhấn tổ hợp phím Ctrl + F11) </b></i>

<b>Cách 3: Nhấp chuột phải vào tên Class và chọn Run As → Java Application: </b>

<i>Nếu trong file HelloWord.java của bạn có chứa những dịng chữ tiếng Việt (ví dụ như: "Chào mừng các bạn đến với ngôn ngữ lập trình Java") thì các bạn phải chọn </i>

<i><b>định dạng UTF-8 bằng cách nhấp chuột phải vào tên Project chọn Properties (hoặc </b></i>

<i>nhấn tổ hợp phím Alt + Enter). Hộp thoại Properties for file HelloWorld xuất hiện, </i>

vào phần Resource và tìm đến dòng Text file encoding chọn Other và thay đổi định dạng chữ thành UTF-8. Sau đó, bạn chọn vào Apply và Apply and Close để hoàn tất việc thay đổi định dạng chữ.

3.2. Kiến trúc chương trình Java

Những thành phần cơ bản của 1 chương trình Java: Gói (Packages)

Giao diện (Interfaces)

Những phần của một chương trình Java:

<b>Lệnh khai báo gói(package ) </b>

<b>Lệnh chỉ định gói được dùng (Lệnh import) </b>

Khai báo lớp public (một file java chỉ chứa 1 lớp public class) Các lớp khác (classes private to the package)

Tập tin nguồn Java có thể chứa tất cả hoặc một vài trong số các phần trên.

</div><span class="text_page_counter">Trang 25</span><div class="page_container" data-page="25">

3.2.1. Các thành phần cơ bản của Java

ddddddddddddddddddddddddddddddddddddddđ

Trong một tệp chương trình java cho phép định nghĩa nhiều lớp hoặc nhiều giao diện. Tệp chương trình java trùng với tên lớp được khai báo là public và lớp này chứa hàm main() nếu là ứng dụng độc lập. Tệp chương trình nguồn có phần mở rộng .java

Khi biên dịch thì mỗi lớp hoặc giao diện trong tệp sẽ tạo ra tệp byte code có tên trùng với tên lớp và giao diện, có phần mở rộng là .class

Trong chương trình Java khơng có các khai báo biến, hàm tách biệt khỏi lớp và

<i>chỉ có các khai báo và định nghĩa các lớp, interface. Như thế chương trình Java được xem như là tập các lớp, interface và các đối tượng của chúng trao đổi thông điệp với nhau (bằng các lời gọi hàm) để thực hiện các nhiệm vụ của ứng dụng.</i>

<b>Trong đó: </b>

 <b>Phần 1: thư mục chung cần tạo để lưu các tập tin trong chương trình.  Phần 2: đưa vào các gói trong Java mà người dùng sử dụng. </b>

import java.io.*; //Phần 1: Tuỳ chọn //Định nghĩa gói

<b>package <tên gói> </b>

//Phần 2: có thể có hoặc khơng có các gói sử dụng //nhập gói cần sử dụng

<b>import java.io.*; </b>

//Phần 3: không hoặc nhiều hơn //Định nghĩa các lớp và các giao diện

</div><span class="text_page_counter">Trang 26</span><div class="page_container" data-page="26">

<b> Phần 3: nội dung soạn thảo của chương trình. </b>

3.2.2. Chương trình Java đầu tiên

Viết chương trình in dịng HelloWord lên màn hình Console.

Khởi động Notepad hoặc Eclipse và gõ đoạn mã sau, lưu lại với tên

Giải thích cấu trúc chương trình:

+ public: Thuộc tính public của hàm main() cho biết là hàm này được phép truy nhập đối với mọi lớp từ bên ngoài của lớp HelloWordApp và cho phép gọi để thực hiện bởi chương trình thơng dịch java.

+ static: Từ khóa static khai báo hàm này phụ thuộc vào cả lớp, không phụ thuộc vào đối tượng cụ thể, do vậy khi thực hiện không cần phải tạo lập đối tượng để gọi những hàm như thế.

+ void: Từ khóa void cho biết hàm main() khơng có kết quả trả lại. + Hàm main có các đối số là mảng các xâu (đối tượng) agrs[] của String.

</div><span class="text_page_counter">Trang 27</span><div class="page_container" data-page="27">

Biên dịch/Thông dịch chương trình java sử dụng jdk Vào cmd > đến thư mục chứa bài tập đã lưu

Comment code trong Java là những đoạn code mà compiler sẽ bỏ qua lúc biên

<i>dịch (tức là trình biên dịch sẽ bỏ qua khi gặp phải những đoạn comment này trong code của chúng ta). Vậy tại sao chúng ta cần phải sử dụng tới các comment này trong </i>

chương trình của mình? Đó là vì: Các đoạn comment này dùng để giải thích về ý nghĩa, công dụng của các biến, phương thức, các Class hoặc bất kỳ những dòng lệnh khác để cho chương trình của chúng ta dễ hiểu và dễ bảo trì hơn; ngồi ra, nó cũng dùng để bỏ qua biên dịch một đoạn code nào đó trong quá trình viết code của chúng

</div><span class="text_page_counter">Trang 28</span><div class="page_container" data-page="28">

* Comment đặc biệt dùng để tạo Java code documentation ở định dạng HTML (Java Document)

*/

3.3.2. Từ khóa (Keyword)

Ngơn ngữ lập trình đã định danh sẵn các từ để để biểu diễn các từ khóa của ngơn ngữ và khơng thể sử dụng cho những thực thể khác. Các khóa của Java có thể chia

<b>thành 9 nhóm: </b>

Ví dụ:

+ Định nghĩa lớp: class, extends, interface, implements

+ Từ khoá cho việc dùng các biến, các lớp: abstract, public, private, protected, static, synchronized, volatile, final, native.

+ Tổ chức các lớp: package, import

+ Các kiểu dữ liệu cơ bản: long, int, short, byte, double, char, boolean, void + Giá trị hằng gán cho biến: true, false, this, super, null

+ Xử lý ngoại lệ: throw, throws, try, catch, finally + Tạo lập và kiểm tra đối tượng: new, instanceof

+ Các dịng điều khiển chương trình: if,else, case, while, switch, defaulse, break, continue, do, return, for

+ Các từ khoá khác: const, goto, var, operator, byvalue, cast, future, genetic, inner, outer, rest.

3.3.3. Giới thiệu về biến

Thực ra những quy tắc này chúng ta tự đưa ra để dễ dàng phát triển dự án. Ví dụ

<i>khi một dự án có nhiều lập trình viên tham gia thì cần phải đưa ra một chuẩn (quy tắc) </i>

để đặt tên biến, tên hàm .... để khi nhìn vào các lập trình viên có thể hiểu code của nhau.

Trước tiên chúng ta tìm hiểu về quy tắc chung khi đặt tên biến, tên hằng, tên package, tên class, tên interface ...

<b>Quy tắc chung; </b>

<small></small> <i>Lập trình viên nên khai báo tên có ý nghĩa và thể hiện được mục đích của file/ biến/ phương thức/... đó. </i>

<small></small> Tên khai báo khơng nên dài quá 20 ký tự hoặc có thể ít hơn nhưng phải đảm

<b>bảo đầy đủ về mặt ý nghĩa của nó, và tên cũng khơng được đặt quá ngắn, trừ </b>

<i>khi đó là tên tạm (ví dụ như: a, i, j,...). </i>

</div><span class="text_page_counter">Trang 29</span><div class="page_container" data-page="29">

<small></small> Tránh đặt những tên tương tự nhau. Ví dụ như, hai biến có tên là persistentObject và persistentObjects khơng nên được sử dụng trong một Class vì sẽ dễ gây ra nhầm lẫn trong quá trình viết code.

<small></small> Tránh đặt tên gây khó hiểu, dễ nhầm lẫn về mặt ý nghĩa.

<small></small> <b>Tên chứa từ viết tắt cũng nên được hạn chế sử dụng trừ khi từ viết tắt đó phổ </b>

biến và được nhiều người biết đến. Ví dụ như: bạn không được đặt tên biến là diemTB mà nên đặt tên là diemTrungBinh. nhưng bạn hoàn tồn có thể đặt tên là fileHTML thay vì fileHypertextMarkupLanguage vì tên này quá dài và từ HTML cũng là một từ khá phổ biến, ít nhất là trong giới lập trình viên chúng ta. <small></small> <i>Tránh kết hợp nhiều ngôn ngữ khác nhau (Tiếng Anh + Tiếng Việt + ...), chẳng </i>

hạn như addSinhVien, addLop,...

<small></small> <i>Khơng trùng với các "từ khóa" (chúng ta sẽ tìm hiểu ở phần tiếp theo). </i>

<small></small> Khơng được bắt đầu bằng số, ví dụ như: 123sinhVien.

<small></small> <b>Tên phải được bắt đầu bằng một chữ cái, hoặc các ký tự như $, _, ... </b>

<small></small> Không được chứa khoảng trắng, các ký tự toán học. Nếu tên bao gồm nhiều từ thì phân cách nhau bằng dấu _.

<small></small> Trong Java có phân biệt chữ hoa chữ thường. Ví dụ, như hocSinh sẽ khác với hocsinh.

<b>Đặt tên biến. </b>

<small></small> <b>Tên biến phải tuân theo quy tắc chung ở trên được đặt theo quy tắc lạc </b>

<i><b>đà (Camel Case): đó là chữ cái đầu tiên của từ đầu tiên phải viết thường và chữ </b></i>

cái đầu tiên của các từ tiếp theo phải viết hoa, ví dụ: diemTrungBinh.

<small></small> Ngồi ra, trong một số trường hợp, tên biến cần phải thể hiện rõ kiểu dữ liệu của biến đó. Ví dụ: biến có kiểu là List thì nên đặt tên là studentList, biến có kiểu là Set thì nên đặt tên là studentSet, biến có kiểu là Map thì nên đặt tên là studentMap, biến có kiểu là Array thì nên đặt tên là studentArray,...

<i><b>Đặt tên hằng số (Constant). </b></i>

Tên hằng số phải tuân theo quy tắc chung ở trên và phải được viết hoa (ví dụ PI). Nếu tên hằng số có từ hai từ trở lên thì phải có dấu _ ngăn cách giữa các từ, ví dụ: SO_FIBONACCI.

<i><b>Đặt tên phương thức (Method). </b></i>

<small></small> Tên phương thức phải tuân theo quy tắc chung ở trên.

<small></small> Chữ cái đầu tiên của từ đầu tiên trong tên phương thức phải viết thường và là

<i>một động từ, còn chữ cái đầu tiên của các từ tiếp theo phải viết hoa (giống quy tắc đặt tên biến). Ví dụ: tinhDiemTrungBinh, themNhanVien,... </i>

<b>Đặt tên Class và Interface. </b>

<small></small> Tên Class và Interface phải tuân theo quy tắc chung ở trên và chữ cái đầu tiên của mỗi từ phải được viết hoa. Ví dụ: Class SinhVien.

</div><span class="text_page_counter">Trang 30</span><div class="page_container" data-page="30">

<small></small> Tên Class nên có thêm những từ có hậu tố phía sau để thể hiện rõ hơn mục đích

<i>của Class đó, chẳng hạn như DivZeroException (chúng ta sẽ tìm hiểu rõ hơn </i>

<i><b>về Exception ở những bài sau). </b></i>

<small></small> Tên Interface nên có thêm chữ I đằng trước. Ví dụ: IFrame.

<small></small> Tên lớp dẫn xuất nên có từ Abstract làm tiền tố, ví dụ: Class

<i>AbstractStudent (chúng ta sẽ tìm hiểu về lớp dẫn xuất ở những bài sau). </i>

<b>Đặt tên Package. </b>

<b>Tên Package phải tuân theo quy tắc chung ở trên và phải viết thường. Đặt tên Project. </b>

<b>Tên Project phải tuân theo quy tắc chung ở trên và chữ cái đầu tiên của mỗi từ phải viết hoa. </b>

3.3.4. Kiểu dữ liệu

<b>Kiểu dữ liệu trong Java dùng để xác định kích thước và loại giá trị có thể được </b>

<i><b>lưu trữ trong một định danh (Định danh ở đây bao gồm tên biến, phương thức, tên </b></i>

<i>lớp, Interface và tên Package). Các kiểu dữ liệu khác nhau cho phép chúng ta lựa chọn </i>

kiểu phù hợp với yêu cầu của bài toán đặt ra.

<i><b>Trong Java có 2 kiểu dữ liệu thường gặp đó là: Primitive data (kiểu dữ liệu cơ sở) và Wrapper class (Lớp bao bọc). </b></i>

<b> Primitive data </b>

<b>Kiểu dữ liệu cơ sở là kiểu dữ liệu đơn giản nhất trong Java. Tại một thời điểm, </b>

một kiểu dữ liệu cơ sở chỉ lưu trữ một giá trị đơn, khơng có các thơng tin khác. Trong Java, chúng ta có 8 kiểu dữ liệu cơ sở thường gặp:

short 16 -32,768 đến 32,767 short shortNumber = 10000; int 32 -2,147,483,648 đến 2,147,483,647 int intNumber = 100000;

long 64 <sup>-9,223,372,036,854,775,808 đến </sup>

9,223,372,036,854,775,807 <sup>long longNumber = 100000l; </sup> float 32 1.4E<sup>-45</sup> đến 3.4028235E<sup>38</sup> float floatNumber = 9.08f; double 64 4.9E<sup>-34</sup> đến 1.7976931348623157E<sup>308</sup> double doubleNumber = 9.08;

</div><span class="text_page_counter">Trang 31</span><div class="page_container" data-page="31">

boolean 1 true/false (mặc định là false) boolean boolValue = true;

<b> Wrapper class </b>

Trong Java, ứng với mỗi kiểu dữ liệu cơ sở thì chúng ta sẽ có một kiểu dữ liệu

<i>Wrapper class, sở dĩ chúng ta gọi kiểu dữ liệu này là Wrapper class là vì nó "gói" các </i>

kiểu dữ liệu cơ sở vào trong một đối tượng của nó. Vì vậy, Wrapper class là kiểu dữ liệu vừa có thể lưu trữ giá trị đơn và vừa có thêm các phương thức khác.

Dưới đây là danh sách các Wrapper class ứng với mỗi kiểu dữ liệu cơ sở:

<b> Ép kiểu trong Java </b>

<b>Ép kiểu trong Java là quá trình chuyển đổi kiểu dữ liệu này sang kiểu dữ liệu </b>

khác. Chúng ta cần sử dụng đến thao tác ép kiểu khi chúng ta cần chuyển đổi kiểu dữ liệu của biến này sang kiểu dữ liệu khác để phục vụ cho một mục đích nào đó. Ví dụ: Chúng ta thực hiện phép chia số nguyên 2 cho 4, nếu chúng ta không sử dụng đến ép

<b>Primitive data Wrapper class </b>

</div><span class="text_page_counter">Trang 32</span><div class="page_container" data-page="32">

kiểu thì kết quả của phép toán này sẽ trả về 0, như vậy thì yêu cầu của bài toán đã khơng cịn đúng nữa.

<b>Có 2 loại ép kiểu trong Java: Ép kiểu rộng và ép kiểu hẹp. </b>

<i><b>Implicit Casting (Ép kiểu rộng/ Ép kiểu không tường minh). </b></i>

Chuyển từ kiểu có vùng lưu trữ nhỏ lên kiểu có vùng lưu trữ lớn hoặc về kiểu có cùng kiểu dữ liệu. Loại này không làm mất mát dữ liệu. Sơ đồ chuyển đổi như sau:

byte → short → int → long → float → double <small></small> Các kiểu dữ liệu byte và short được chuyển lên kiểu int.

<small></small> Nếu có một tốn hạng có kiểu dữ liệu long thì tồn bộ biểu thức chứa toán hạng này sẽ được chuyển về kiểu long.

<small></small> Nếu có một tốn hạng có kiểu dữ liệu float thì tồn bộ biểu thức chứa tốn hạng này sẽ được chuyển về kiểu float.

<small></small> Nếu có một tốn hạng có kiểu dữ liệu doublethì tồn bộ biểu thức chứa toán hạng này sẽ được chuyển về kiểu double.

Ví dụ: ép kiểu rộng

public class EpKieuRong {

public static void main(String[] args) {

<i><b>Explicit Casting (Ép kiểu hẹp/ Ép kiểu tường minh). </b></i>

Chuyển từ kiểu có vùng lưu trữ lớn về kiểu có vùng lưu trữ nhỏ. Loại này có thể làm mất mát dữ liệu. Sơ đồ chuyển đổi như sau:

double → float → long → int → short → byte

<b>Lưu ý: Khi ép kiểu dữ liệu chúng ta phải thật sự cẩn thận nếu không sẽ làm ảnh </b>

hưởng đến kết quả của tồn bộ bài tốn. Ví dụ: ép kiểu hẹp

public class EpKieuHep {

public static void main(String[] args) { /*

* Ép kiểu hẹp */

</div><span class="text_page_counter">Trang 33</span><div class="page_container" data-page="33">

<b>Một biến của Java là tên gọi của một vùng nhớ bên trong máy tính dùng để lưu </b>

trữ giá trị mà chương trình của chúng ta có thể tương tác được. Giữa biến và kiểu dữ liệu có một mối liên hệ mật thiết với nhau, một kiểu dữ liệu phải có một biến để lưu

<small></small> <b>Kiểu dữ liệu dùng để xác định kích thước và loại giá trị có thể được lưu trữ. </b>

<small></small> <b>Giá trị là dữ liệu thực tế được lưu trữ trên biến và có thể thay đổi được. </b>

<i><b>Trong Java có 3 loại biến thường gặp đó là: Local variable (biến cục bộ), Instance variable (thuộc tính) và Static variable (biến tĩnh). Chúng ta sẽ tìm </b></i>

hiểu kỹ về thuộc tính và biến tĩnh khi bước sang chương về lập trình hướng đối tượng.

<b>Cách khai báo biến trong Java: có 2 cách. Tuy nhiên chúng ta nên sử dụng cách 2. </b>

<small></small> Cách 1: [kiểu_dữ_liệu] [tên_biến]; ví dụ double d1;

<small></small> Cách 2: [kiểu_dữ_liệu] [tên_biến] = [giá_trị]; ví dụ double d1 = 100.04;

Ví dụ một số cách khai báo biến và khởi tạo giá trị cho biến hợp lệ: int age; // Khai báo biến kiểu int.

String name = "Freetuts"; // Khai báo biến kiểu String và có khởi tạo giá trị

b. Biến cục bộ (Local Variable)

Là biến được khai báo bên trong thân hàm, trong hàm tạo hoặc bên trong các khối lệnh và chỉ có phạm vi trong nội bộ thân hàm.

</div><span class="text_page_counter">Trang 34</span><div class="page_container" data-page="34">

Các biến cục bộ được khởi tạo khi các hàm, hàm tạo hoặc các khối lệnh được tạo ra và các biến này sẽ bị hủy bỏ một khi các hàm, hàm tạo hoặc các khối lệnh chứa nó kết thúc.

Các phạm vi truy cập không được sử dụng khi khai báo biến cục bộ.

Các biến cục bộ khơng có giá trị mặc định, vì vậy các bạn cần phải khai báo và khởi tạo giá trị ban đầu cho biến trước khi sử dụng.

Ví dụ:

public class LocalVariable {

public static void main(String[] args) {

int localVariable1 = 19; // đây là biến cục bộ float localVariable2 = 5.4f; // đây là biến cục bộ System.out.println("Giá trị của biến localVariable1 =

Trong đời sống hằng ngày, có những giá trị khơng bao giờ thay đổi chẳng hạn như: Một ngày có 24 giờ, một năm có 12 tháng và trong tốn học giá trị không thay đổi này được thể hiện thông quá số PI, số Fibonacci,... Trong Java cũng vậy, hằng số là những giá trị không bao giờ thay đổi trong suốt quá trình sử dụng, là một giá trị bất biến trong chương trình.

Để khai báo hằng số ta sử dụng từ khóa static finalđặt trước tên hằng số: [Phạm vi truy cập] static final [kiểu dữ liệu] [tên hằng số] = [giá trị];

Dưới đây là chương trình minh họa cách sử dụng hằng số. public class Constant {

// Khai báo hằng số

public static final int HOUR_OF_DAY = 24;

public static final String CHUOI = "Hello Freetuts!";

public static void main(String[] args) {

System.out.println("Một ngày có " + HOUR_OF_DAY + "

</div><span class="text_page_counter">Trang 35</span><div class="page_container" data-page="35">

<b>Trong Java cũng như các ngơn ngữ lập trình khác, mảng là kiểu dữ liệu có cấu trúc gồm một tập hợp cố định các phần tử có cùng kiểu dữ liệu, các phần tử của </b>

mảng có cùng tên và được phân biệt nhau bởi chỉ số. Mỗi phần tử của mảng được sử dụng như là một biến đơn, kiểu dữ liệu của mảng chính là kiểu dữ liệu của phần tử. Như vậy, đối với mảng thì chúng ta cần quan tâm đến các thành phần sau:

<small></small> <b>Các thông tin liên quan đến mảng: tên mảng, số phần tử của mảng, kiểu dữ </b>

liệu của mảng.

<small></small> <b>Số chiều của mảng: Nếu mảng chỉ có một chỉ số để lưu trữ các giá trị vào </b>

trong các biến thành phần của mảng thì được gọi là mảng một chiều. Nếu mảng

<i>có 2 chỉ số để lưu trữ các giá trị (chẳng hạn giá trị của một bảng có m dịng, n cột) được gọi là mảng 2 chiều. Tương tự, ta có mảng 3 chiều, 4 chiều, ..., n </i>

chiều.

Trong lập trình, mảng thường xuyên được sử dụng khơng chỉ bởi tính đơn giản, dễ sử dụng của nó mà cịn ở khả năng đáp ứng nhu cầu lưu trữ dữ liệu trong các bài toán thực tế. Chúng ta có thể sử dụng mảng khi cần lưu trữ nhiều giá trị, chẳng hạn như lưu trữ các số nguyên từ 1 đến 5; dãy 32 chuỗi ký tự, trong đó mỗi chuỗi lưu trữ tên của một sinh viên trong một lớp học...

Trong Java, mảng được hỗ trợ dưới dạng mảng một chiều cho đến mảng nhiều chiều. Nhưng thơng thường, khi lập trình chúng ta thường chỉ sử dụng mảng có tối đa là ba chiều và mảng một chiều là mảng được sử dụng nhiều nhất.

<b> Mảng 1 chiều trong Java: Mảng một chiều là một tập hợp của nhiều phần </b>

tử có kiểu dữ liệu giống nhau.

<b>Cú pháp khai báo mảng </b>

<b>Để khai báo mảng, chúng ta cần phải xác định trước 3 thông tin cần thiết sau: </b>

<small></small> Kiểu dữ liệu của mảng.

<i>Trong đó, [Kiểu_dữ_liệu] mơ tả kiểu của mỗi phần tử thuộc mảng (như int, char, double, String,...), tên_mảng là tên của mảng và quy tắc đặt tên phải tuân theo quy tắc </i>

đặt tên biến trong Java.

<b>Ví dụ: int[] a;: khai báo mảng tên a và có kiểu dữ liệu là int. Cấp phát bộ nhớ cho mảng </b>

<i>Tương tự như chuỗi, bản chất của mảng là 1 đối tượng (chi tiết về đối tượng chúng ta sẽ được học trong chương Lập trình hướng đối tượng), vì vậy mảng cần phải </i>

được cấp phát bộ nhớ trước khi sử dụng. Để cấp phát bộ nhớ cho mảng thì chúng ta có 2 cách như sau:

</div><span class="text_page_counter">Trang 36</span><div class="page_container" data-page="36">

<b>Cách 1: [Kiểu_dữ_liệu] tên_mảng[] = new [Kiểu_dữ_liệu] </b>

[Số_phần_tử_của_mảng];

<b>Cách 2: [Kiểu_dữ_liệu][] tên_mảng = new [Kiểu_dữ_liệu] </b>

[Số_phần_tử_của_mảng];

Trong đó, [Số_phần_tử_của_mảng] chỉ ra số lượng phần tử tối đa mà mảng có thể lưu trữ, giá trị này phải là một số nguyên dương.

Ngoài ra, Java cịn cho phép chúng ta vừa có thể khai báo mảng và vừa khởi tạo giá trị cho mảng.

Ví dụ:

int[] a = new int[] {2, 10, 4, 8, 5};: khai báo mảng một chiều có tên là a, kiểu dữ liệu là int và mảng này chứa 5 phần tử có giá trị lần lượt là 2, 10, 4, 8, 5.

<b>Truy xuất các phần tử của mảng </b>

Đối với mảng thì chúng ta có thể truy xuất các phần tử của mảng thông qua

<b>các chỉ số của phần tử đó. Cú pháp như sau: Tên_mảng[Chỉ_số_phần_tử]; </b>

Trong đó, [Chỉ_số_phần_tử] là số thứ tự của các phần tử trong mảng và bắt đầu từ 0. Như vậy, mảng có n phần tử thì các phần tử của nó có chỉ số lần lượt là 0, 1, 2,..., n - 1.

<b>Ví dụ: Chúng ta có đoạn chương trình sau: </b>

public static void main(String[] args) {

// Khai báo và khởi tạo giá trị ban đầu cho mảng char[] kyTu = new char[] {'a', 'b', 'c', 'd', 'e'}; // hiển thị ký tự tại vị trí thứ 2 trong mảng

System.out.println("Ký tự tại vị trí thứ 2 trong mảng là "

public static void main(String[] args) { int size; // kích thước của mảng

Scanner scanner = new Scanner(System.in);

System.out.println("Nhập vào độ dài của mảng: "); size= scanner.nextInt();

// khai báo và cấp phát bộ nhớ cho mảng

// mảng này có tên là array và kích thước = size int[] array = new int[size];

// array.length: trả về kích thước của mảng

</div><span class="text_page_counter">Trang 37</span><div class="page_container" data-page="37">

// vòng lặp này sẽ duyệt i từ 0 đến chiều dài của mảng - 1 for (int i = 0; i < size; i++) {

// hiển thị giá trị các phần tử trong mảng for (int i = 0; i < size; i++) {

System.out.println("Phần tử thứ " + i + ": " + array[i]);

} }

<b>Gán giá trị cho phần tử của mảng </b>

Cho 2 mảng array1 và array2 là các mảng có cùng kiểu dữ liệu. Giả sử các phần tử trong mảng array1 đã có giá trị, khi đó chúng ta có thể gán giá trị của một phần tử trong array1 cho một phần tử trong mảng array2 như sau:

public static void main(String[] args) { // khai báo mảng array1 và array2 int[] array1 = {2, 10, 3, 9, 8}; int array2[] = new int[5];

// gán giá trị của phần tử thứ 2 trong mảng array1 // cho phần tử thứ 3 trong mảng array2

<b> Mảng 2 chiều trong Java: mảng hai chiều là mảng có 2 chỉ số để lưu trữ </b>

<i><b>các giá trị (chẳng hạn giá trị của một bảng có m dịng, n cột). </b></i>

<i>Trong đó: [Kiểu_dữ_liệu] mô tả kiểu của mỗi phần tử thuộc mảng (như int, char, double, String,...), tên_mảng là tên của mảng và quy tắc đặt tên phải tuân theo quy tắc </i>

đặt tên biến trong Java.

<b>Ví dụ: int a[][];: khai báo mảng hai chiều a có kiểu dữ liệu là int. Cấp phát bộ nhớ cho mảng </b>

</div><span class="text_page_counter">Trang 38</span><div class="page_container" data-page="38">

Để cấp phát bộ nhớ cho mảng 2 chiều thì chúng ta sử dụng từ khóa new, trong đó [Số_dịng], [Số_cột]: là hai số ngun dương chỉ ra số lượng dòng và số lượng cột của mảng hai chiều và trong Java có 2 cách để cấp phát bộ nhớ như sau:

<b>Cách 1: [Kiểu_dữ_liệu] Tên_mảng[][] = new [Kiểu_dữ_liệu] [Số_dịng][Số_cột]; </b>

Ví dụ: khai báo và cấp phát bộ nhớ cho mảng number có 2 dịng, 3 cột: int number[][] = new int[2][3];

<b>Cách 2: [Kiểu_dữ_liệu][][] Tên_mảng = new [Kiểu_dữ_liệu] [Số_dịng][Số_cột]; </b>

Ví dụ: khai báo và cấp phát bộ nhớ cho mảng A có 3 dịng, 5 cột: String[][] A = new String[3][5];

Khi trình biên dịch gặp lệnh trên thì nó sẽ cấp phát vùng nhớ để chứa mảng hai

<b>chiều có 3 dịng, 5 cột với số phần tử trong mảng = số dịng * số cột = 15. Hình ảnh </b>

minh họa của mảng hai chiều trên như là một bảng gồm có các dịng và các cột như sau:

Bản chất của mảng 2 chiều là mỗi dịng của nó chính là một mảng một chiều. Ví dụ: với mảng hai chiều a có 3 dịng, 5 cột, mỗi phần tử của mảng có kiểu int thì a được xem như mảng một chiều có 3 phần tử, mỗi phần tử này là một mảng một chiều có 5 phần tử.

Ngồi ra, Java cịn cho phép chúng ta vừa có thể khai báo mảng và vừa khởi tạo giá trị cho mảng. Ví dụ để khai báo mảng một chiều có tên là diem, kiểu dữ liệu là int và mảng này chứa 6 phần tử có giá trị lần lượt là 1, 2, 3, 4, 5, 6 thì chúng ta làm như sau:

// khai báo một mảng 2 chiều có 3 dịng và 2 cột int diem[][] = {{1, 2}, {3, 4}, {5, 6}};

<b>Truy xuất các phần tử của mảng </b>

<b>Mỗi phần tử của mảng 2 chiều được truy xuất thơng qua tên mảng cùng với chỉ số dịng và chỉ số cột của phần tử đó. Tương tự như mảng một chiều, nếu một mảng </b>

hai chiều có m dịng và n cột thì chỉ số của dịng sẽ chạy từ 0, 1, 2,..., m - 1 và chỉ số của cột sẽ chạy từ 0, 1, 2,..., n - 1.

Cú pháp như sau: Tên_mảng[Chỉ_số_dịng][Chỉ_số_cột]

<b>Ví dụ: Để truy cập đến phần tử nằm ở dòng 2, cột 1 của mảng diem được khai báo </b>

ở trên thì chúng ta làm như sau:

public static void main(String[] args) {

// khai báo một mảng 2 chiều có 3 dịng và 2 cột

</div><span class="text_page_counter">Trang 39</span><div class="page_container" data-page="39">

public static void main(String[] args) { // khai báo số dòng và số cột cho mảng int soDong, soCot;

// khai báo và cấp phát bộ nhớ cho mảng int[][] A = new int[soDong][soCot];

// Để nhập giá trị các phần tử cho mảng // chúng ta sẽ sử dụng 2 vòng lặp for

// vòng lặp for bên ngoài sẽ duyệt i từ 0 đến soDong - 1 // và vòng lặp for bên trong sẽ duyệt j từ 0 đến soCot - 1 // mỗi lần như vậy thì sẽ nhập vào phần tử tại vị trí i, j for (int i = 0; i < soDong; i++) {

for (int j = 0; j < soCot; j++) {

// hiển thị các phần tử trong mảng vừa nhập

// chúng ta cũng sử dụng 2 vòng lặp for như khi nhập System.out.println("Mảng vừa nhập: ");

for (int i = 0; i < soDong; i++) { for (int j = 0; j < soCot; j++) {

</div><span class="text_page_counter">Trang 40</span><div class="page_container" data-page="40">

b. Chuỗi ký tự trong Java

<b> Khai báo chuỗi ký tự </b>

Trong Java, để khai báo 1 chuỗi ký tự thì chúng ta có 2 cách nhƣ sau:

<b>Cách 1: </b>

<b>Cú pháp: String tenChuoi = "giá_trị_khởi_tạo"; </b>

Trong đó, giá_trị_khởi_tạo của chuỗi có thể có hoặc khơng và nếu có thì phải đặt trong cặp dấu " ".

Nếu một chuỗi có giá_trị_khởi_tạo = " " thì chuỗi đó đƣợc gọi là chuỗi rỗng.

<b>Ví dụ: </b>

public static void main(String[] args) { // khai báo chuỗi rỗng

String chuoi1 = "";

// khai báo chuỗi có nội dung là "Welcome" String chuoi2 = "Welcome";

// hiển thị giá trị của 2 chuỗi trên ra màn hình

System.out.println("Chuỗi rỗng có giá trị = " + chuoi1); System.out.println("Chuỗi 2 có giá trị = " + chuoi2); }

<b>Cách 2: Sử dụng từ khóa new. </b>

<b>Cú pháp: String tenChuoi = new String("giá_trị"); </b>

<b>Trong đó giá_trị là một chuỗi bất kỳ và phải đặt trong cặp dấu " ". Ví dụ: </b>

public static void main(String[] args) {

// khai báo một chuỗi có nội dung là "Welcome to Java!" String chuoi = new String("Welcome to Java!");

System.out.println(chuoi); }

<b> Các hàm xử lý chuỗi ký tự </b>

 Hàm xác định độ dài chuỗi ký tự: trả về độ dài chuỗi ký tự Cú pháp: int length = tên_chuỗi.length();

 Hàm nối 2 chuỗi ký tự: nối chuỗi str2 vào str1 và trả về chuỗi str3

Hàm có tác dụng so sánh hai chuỗi string1, string2 và trả về kết quả: Nếu result = 0 thì hai chuỗi đó bằng nhau.

Nếu result < 0 thì chuỗi string1 < string2. Nếu result > 0 thì chuỗi string1 > string2

</div>

×