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

giáo trình lập trình hướng đối tượng nghề tin học ứng dụng cao đẳ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 (726.47 KB, 78 trang )

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

Uỵ BAN NHN DN THNH PH Hâ CHÍ MINH

<b>TR¯âNG CAO ĐÀNG BÁCH KHOA NAM SÀI GÒN </b>

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

Tài liáu này thuộc lo¿i sách giáo trình nên các ngn thơng tin có thể đ°ợc phép dùng nguyên bÁn hoặc trích dùng cho các mục đích về đào t¿o và tham khÁo.

Mọi mục đích khác mang tính lách l¿c hoặc sử dụng với mục đích kinh doanh thiếu lành m¿nh sẽ bị nghiêm cấm.

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

LÁp trình h°ớng đái t°ợng là mộn học thuộc khái kiến thāc chuyên ngành dành cho đái t°ợng học sinh – sinh viên ngành/ nghề Tin học āng dụng. Nhằm phục vụ cho viác giÁng d¿y và học tÁp mơn lÁp trình h°¡ng đái t°ợng, nhóm tác giÁ chúng tơi biên so¿n giáo trình này dựa trên khung ch°¡ng trình chung mơn tin học cÿa Bộ Lao động Th°¡ng binh và Xã hội. Nội dung giáo trình gãm 9 bài:

- Bài 1: M« đ

- Bài 2: các khái niám về lÁp trình h°ớng đái t°ợng - Bài 3: Lớp và đái t°ợng trong Java

- Bài 4: Thừa kế - Bài 5: Đa hình

- Bài 6: LÁp trình tổng quát - Bài 7: Cấu trúc dữ liáu - Bài 8: Luãng dữ liáu

- Bài 9: Thiết kế h°ớng đái t°ợng

Trong q trình biên so¿n chúng tơi đã kết hợp kinh nghiám giÁng d¿y trong nhiều năm cÿa nhóm tác giÁ với mong muán có thể giúp cho học sinh – sinh viên dß dàng nắm bắt đ°ợc nội dung cÿa môn học. Mặc dù, rất cá gắng trong quá trình biên so¿n, nh°ng chắc chắn khơng thể tránh khßi những thiếu sót, vì vÁy, nhóm tác giÁ chúng tơi rất mong nhÁn đ°ợc ý kiến đóng góp cÿa b¿n đọc để giáo trình ngày một hồn thián h¡n.

Tp.Hã Chí Minh, ngày 31 tháng 8 năm 2022 Tham gia biên so¿n

1. Chÿ biên: ThS Lê Thị Thùy Trang 2. &&&&

3. &&&&.

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

<b>MỵC LỵC </b>

Bài 1: M« đ

1.1.Lịch sử ngơn ngữ Java ... 7

1.2. Mơi tr°£ng lÁp trình Java, máy Áo, và JDK. ... 7

1.3. Giới thiáu về các lo¿i ch°¡ng trình Java: application và applet. ... 8

1.4. Dịch và ch¿y ch°¡ng trình ... 9

Bài 2: Các khái niám về lÁp trình h°ớng đái t°ợng ... 12

2.1. Lịch sử ngơn ngữ lÁp trình. ... 12

2.2. So sánh lÁp trình thÿ tục và lÁp trình h°ớng đái t°ợng. ... 13

2.3. Khái niám h°ớng đái t°ợng và mục tiêu cÿa thiết kế h°ớng đái t°ợng. ... 15

2.4. S¡ l°ợc về các khái niám c¡ bÁn: trừu t°ợng hóa, đái t°ợng, lớp, thơng điáp, đóng gói, che dấu thơng tin, thừa kế. ... 16

BÀI TÀP ... 17

Bài 3: Lớp và đái t°ợng trong Java ... 20

3.1. Vị trí cÿa đái t°ợng trong ch°¡ng trình ... 20

3.2. Cài đặt và sử dụng lớp và đái t°ợng. ... 20

3.3. Đái t°ợng và tham chiếu đái t°ợng... 22

3.4. Thể hián cÿa khái niám đóng gói và che dấu thông tin trong cài đặt lớp. ... 24

3.5. Phân biát các kiểu dữ liáu c¡ bÁn và đái t°ợng. ... 25

3.6. BÁn chất cÿa đái t°ợng và tham chiếu đái t°ợng ... 28

3.7. C¡ chế phgp gán và các phgp so sánh ... 28

3.8. C¡ chế truyền tham sá và giá trị trÁ về ... 29

3.9. Tham chiếu this ... 31

3.10. Các đặc điểm đặc thw ngôn ngữ nh° thành viên static, package, tham sá dong lánh. ... 31

3.11. Quan há composition giữa các đái t°ợng ... 33

BÀI TÀP ... 33

Bài 4: Thừa kế ... 36

4.1. Khái niám kế thừa ... 36

4.2. Cài đặt quan há thừa kế trong Java... 37

4.4. Thành viên final, constructor ... 39

4.5. Tái sử dụng bằng quan há thừa kế, so sánh với composition. ... 40

BÀI TÀP ... 41

Bài 5: Đa hình ... 44

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

5.1. Upcast và downast ... 44

5.2. C¡ chế liên kết động và liên kết tĩnh ... 45

5.3. Lớp trừu t°ợng và ph°¡ng thāc trừu t°ợng. ... 46

5.4. Đa thừa kế và interface ... 48

5.5. M¿u thiết kế: Prototype và Template Method ... 49

BÀI TÀP ... 51

Bài 6: LÁp trình tổng quát ... 53

6.1. Lớp tổng quát ... 53

6.2. Ph°¡ng thāc tổng quát ... 54

6.3. Kiểu con và wildcard ... 55

6.4. H¿n chế và ràng buộc tham sá kiểu ... 56

6.5. Quan há giữa lớp tổng quát và thừa kế ... 57

BÀI TÀP ... 58

Bài 7: Cấu trúc dữ liáu ... 60

7.1. Cấu trúc dữ liáu c¡ bÁn. ... 60

7.2. Các lớp wrapper t°¡ng āng string, ... 61

7.3. StringBuffer, Math, Array. ... 62

7.4. Các kiểu dữ liáu container tổng quát (list, set&) ... 63

BÀI TÀP ... 64

Bài 8: Luãng dữ liáu ... 67

8.1. Khái niám về luãng dữ liáu ... 67

8.2. C¡ chế tổng quát lắp ráp các luãng dữ liáu khi đọc/ghi ... 67

8.3. Các luãng c¡ bÁn để xử lý file... 68

8.4. Áp dụng c¡ chế chung cho các thao tác đọc ghi với các lo¿i nguãn dữ liáu khác ... 69

BÀI TÀP ... 70

Bài 9: Thiết kế h°ớng đái t°ợng ... 72

9.1. Giới thiáu các nguyên tắc xây dựng thiết kế h°ớng đái t°ợng tát. ... 72

9.2. Giới thiáu s¡ l°ợc về m¿u thiết kế ... 73

BÀI TÀP ... 74

TÀI LIàU THAM KHÀO ... 78

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

- Phát biểu đ°ợc các nguyên lý c¡ bÁn cÿa thiết kế h°ớng đái t°ợng.

- Cài đặt đ°ợc các lớp và ph°¡ng thāc bÁn chất cÿa đái t°ợng, tham chiếu đến đái t°ợng.

- Trình bày và phân biát đ°ợc các quan niám cây kế thừa, đa hình.

- Trình bày và phân biát đ°ợc các khái niám căn bÁn về lÁp trình tổng quát, cấu trúc dữ liáu tổng quát.

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

<b>NÞI DUNG MÔN HàC Bài 1: Mở đầu </b>

<b>Mÿc tiêu: </b>

Học xong ch°¡ng này, ng°£i học có khÁ năng: - Tìm hiểu lịch sử ngơn ngữ java

- Cài đặt môi tr°£ng java

- Biên dịch và ch¿y ch°¡ng trình java

<b>Nßi dung: </b>

<b>1.1. Lßch sư뀉 ngơn ngư뀃 Java </b>

Java là một trong những ngôn ngữ lÁp trình h°ớng đái t°ợng. Nó đ°ợc sử dụng trong phát triển ph

Java đ°ợc kh«i đ1991. Ban đvà có tên là Oak.

Java đ°ợc phát hành năm 1994, đến năm 2010 đ°ợc Oracle mua l¿i từ Sun MicroSystem.

Java đ°ợc t¿o ra với tiêu chí <Viết (code) một lAnywhere – WORA). Ch°¡ng trình phtÁng (platform) khác nhau thơng qua một mơi tr°£ng thực thi với điều kián có mơi tr°£ng thực thi thích hợp hỗ trợ nền tÁng đó

<b>1.2 . Môi tr°ãng l⌀p trknh Java, mcy ko, và JDK. </b>

Để đÁm bÁo tính đa nền, Java sử dụng c¡ chế Máy Áo cÿa Java.

ByteCode là ngôn ngữ máy cÿa Máy Áo Java t°¡ng tự nh° các lánh nhị phân cÿa các máy tính thực.

Một ch°¡ng trình sau khi đ°ợc viết bằng ngơn ngữ Java (có phđ°ợc biên dịch thành tÁp tin thực thi đ°ợc trên máy Áo Java (có phtin thực thi này chāa các chỉ thị d°ới d¿ng mã Bytecode mà máy Áo Java hiểu đ°ợc phÁi làm gì.

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

Khi thực hián một ch°¡ng trình, máy Áo Java lBytecode thành các chỉ thị d¿ng nhị phân cÿa máy tính thực và thực thi thực sự chúng trên máy tính thực (con gọi là khÁ năng khÁ chuyển).

Máy Áo thực tế đó là một ch°¡ng trình thơng dịch. Vì thế các há điều hành khác nhau sẽ có các máy Áo khác nhau. Để thực thi một āng dụng cÿa Java trên một há điều hành cụ thể, c

JVM cung cấp môi tr°£ng thực thi cho ch°¡ng trình Java (con gọi là khÁ năng độc lÁp với nền).

Có nhiều JVM cho các nền tÁng khác nhau chẳng h¿n nh°: Windows, Liux, và Mac.

<b>1.3 . Giái thißu vë ccc loci ch°¡ng trknh Java: application và applet. </b>

Các ch°¡ng trình xây dựng bằng Java đ°ợc chia làm 2 lo¿i là Java Applet và Java Application

Java Application là gì?

Ngơn ngữ Java có cú pháp khá giáng với ngơn ngữ C/C++, nh°ng nó có thể đáp āng khÁ năng độc lÁp với há điều hành. Nền tÁng cÿa ngơn ngữ lÁp trình Java là các class, nó đóng vai tro nh° những đái t°ợng. Ng°£i lÁp trình khi xây dựng các āng dụng sẽ sử dụng 1 sá class chuऀn cÿa há tháng, hoặc cũng có thể tự mình xây dựng class khác nhằm đáp āng yêu ccông viác.

Hián nay Java đ°ợc āng dụng rất rộng rãi cho các āng dụng đ°ợc viết trên Internet, lấy m¿ng làm trung tâm và có thể đ°ợc dwng nh° một nền tÁng. Đây là 1 lo¿i ngôn ngữ lÁp trình nhanh, bÁo mÁt, đáng tin cÁy, đ°ợc dwng để viết mã cho các āng dụng di động, phmềm doanh nghiáp hay các āng dụng dữ liáu lớn và cơng nghá phía máy chÿ.

Java Application (viết tắt Java App) là những āng dụng độc lÁp, t°¡ng tự nh° các ch°¡ng trình có đi .COM hay đi .EXE thơng th°£ng. Viác thực hián Java Application đ¡n giÁn h¡n Java Applet b«i chúng khơng c

Applet là gì?

Ngơn ngữ lÁp trình Java hián nay đ°ợc sử dụng khá phổ biến trên nhiều há điều hành khác nhau « khắp n¡i trên thế giới. Chính vì vÁy, ngơn ngữ lÁp trình Java cũng đ°ợc sử dụng để t¿o ra nhiều lo¿i āng dụng đa d¿ng.

Trong đó, Applet là những loi ng dng nhò c xõy dng bôi ngụn ng lÁp trình Java hoặc ngơn ngữ lÁp trình khác đ°ợc biên dịch sang mã bytecode cÿa ngôn ngữ Java. Tuy nhiên, khi đ°a đến ng°£i dwng, Applet sẽ xuất hián hoàn toàn với d¿ng Java bytecode.

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

Những phiên bÁn Applet đho¿t động điều chỉnh, các applet cÿa Java đã đ°ợc lo¿i bß hồn tồn vào 2017.

S« hữu khÁ năng linh ho¿t trên đa nền tÁng, Applet có thể sử dụng trên nhiều há điều hành khác nhau nh° Microsoft Windows, Linux, MacOS, FreeBSD, Unix, v.v.

<b>1.4. Dßch và chcy ch°¡ng trknh </b>

Ch¿y ch°¡ng trình bằng các lánh trong Command Prompt với JDK đã cài đặt. Đtiên, thay đổi folder đang thực thi trong Command Prompt đến th° mục chāa file code Java.

C:\Users\LHVINH>E: E:\>cd Demo

Sau đó, sử dụng ch°¡ng trình javac trong JDK để biên dịch code Java thành bytecode. Một file tên là Welcome.class chāa bytecode sẽ đ°ợc tự động t¿o ra.

- Trình so¿n thÁo mã nguãn (source code editor): dwng để viết code - Trình biên dịch (compiler), trình thông dịch (interpreter)

- Công cụ xây dựng tự động: khi sử dụng sẽ biên dịch (hoặc thông dịch) mã nguãn, thực hián liên kết các th° vián và có thể ch¿y ch°¡ng trình một cách tự động

- Trình gỡ lỗi (debugger): hỗ trợ tìm lỗi code

Các Java IDE th°£ng dwng là NetBeans, Eclipse, IntelliJ IDEA,&

<b>NetBeans IDE: </b>

<i>Tạo một Java Project </i>

Tr°ớc khi t¿o một ch°¡ng trình Java trong NetBeans, cChọn File –> New Project, hộp tho¿i New Project xuất hián

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

Chọn Java trong Categories và Java Application trong Projects và click Next để hiển thị hộp tho¿i New Java Application

NhÁp tên (ví dụ: Hello World) trong mục Project Name và E:\ trong mục Project Location. Click Finish để t¿o project

<i>Tạo một Java Class </i>

Right click vào Hello World trong Project Pane để hiển thị context menu. Chọn New –> Java Class để hiển thị hộp tho¿i New Java Class

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

NhÁp HelloWorld trong mục Class Name và chọn Source Packages trong mục Location. Để tráng mục Package, sẽ t¿o một lớp trong default package. Click Finish để t¿o HelloWorld class.

Bên d°ới, tÁp tin HelloWorld.java đ°ợc đặt trong <package Vidu1>. So¿n thÁo code trong HelloWorld class.

Để ch¿y Welcome.java, right click Welcome.java để hiển thị context menu và chọn Run File hoặc nhấn Shift + F6.

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

<b>Bi 2: Ccc khci niòm vở lp trknh hỏng ữi t°£ng Mÿc tiêu: </b>

Học xong ch°¡ng này, ng°£i học có khÁ năng:

- Phân biát lÁp trình h°ớng thÿ tục và h°ớng đái t°ợng.

<b>Nßi dÿng: </b>

<b>2.1. Lßch sư뀉 ngơn ngư뀃 l⌀p trknh. </b>

Ch°¡ng trình máy tính đtốn học Ý Luigi Menabrea về cỗ máy mới nhất đ°ợc đề xuất cÿa Charles Babbage: Máy phân tích; bà đã bổ sung vào cuán hãi ký những ghi chú chỉ ra chi tiết ph°¡ng pháp tính tốn sá Bernoulli bằng cỗ máy đó, đ°ợc htính đ

Máy tính đián tử đđ°ợc t¿o. Do giới h¿n về học tác độ và bộ nhớ nên các lÁp trình viên phÁi viết các mã tay các ch°¡ng trình hợp ngữ

ĐCode, ngơn ngữ lÁp trình bÁc cao đlà chÁm

Cuái những năm 1960 – OOP: Simula, đ°ợc phát minh b«i Nygaard và Dahl, là ngôn ngữ đ

1970 – Pascal: Niklaus Wirth t¿o ra Pascal cwng với một sá ngơn ngữ khác, ơng thích t¿o ra các ngơn ngữ. Ơng cũng phát minh ra lt cÿa Wirth cái làm cho luÁt cÿa Moore thành lỗi th£i b«i vì các lÁp trình viên phcác máy tính lớn (mainframe) cũng không thể theo kịp. Điều này sau đó sẽ đ°ợc chāng minh là đúng với phát minh cÿa Electron.js.

1972 – C: Dennis Ritchie và Ken Thompson quyết định t¿o ra C ngơn ngữ có những dấu ngoặc nhọn {} và nó là một thành cơng lớn. Sau đó ơng bổ sung thêm secmentation faults và các tính năng thân thián với các lÁp trình viên để tăng hiáu xuất.

Ơng và b¿n bg cÿa mình t¿i Bell Labs cũng làm một ch°¡ng trình demo cho C, kết quÁ họ đã t¿o ra một há điều hành gọi là Unix.

1972 - Prolog, ngôn ngữ logic đthiết kế b«i Colmerauer, Roussel, và Kowalsk

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

1978 – SQL: SQL, ngơn ngữ truy v¿n có cấu trúc, đ°ợc t¿o b«i Donald D. Chamberlin và Raymond F. Boyce « IBM

1983 - C++: Bjarne Stroustrup bổ sung thêm nhiều tính năng nâng cao mà ơng có thể nghĩ ra cho C và đặt cho ngôn ngữ lÁp trình này là C++.

1986 - Objective-C: Brac Box và Tol Move quyết định t¿o thêm một phiên bÁn C dựa trên Smalltalk, cái đ°ợc gọi là Objective-C.

1987 – Perl: Larry Wall với kinh nghiám tơn giáo, tr« thành một nhà thuyết giÁng và làm cho Perl tr« thành một học thuyết.

1991 – Python: Guido van Rossum phát minh ra Python, cú pháp đ°ợc chọn lấy cÁm hāng từ Monty Python và Flying Circus.

1991 – Visual Basic: Đ°ợc t¿o ra b«i Microsoft, bÁn release cuái cwng là version 6 vào năm 1998, window 10 v¿n duy trì khÁ năng t°¡ng thích với các āng dụng Visual Basic 6

1995 – JavaScipt: Brendan Eich sử dụng những ngày cuái tungữ sẽ đ°ợc sử dụng rộng rãi trên mọi trình duyát và cuái cwng là Skynet. Ban đviác t¿i Netscape ơng gọi nó là LiveScript nh°ng Java tr« thành một một ngơn ngữ lÁp trình phổ biến vì thế họ đã quyết định đổi tên nó thành JavaScipt.

Java tr« thành một th°¡ng hiáu và điều này đem đến rắc rái cho họ, JavaScript sau đó đ°ợc đổi tên thành ECMAScript nh°ng mọi ng°£i v¿n gọi nó là JavaScript.

1996 – Java: James Gosling phát minh Java, ngôn ngữ đt°ợng n¡i các quy tắc design patterns đ°ợc chú ý h¡n chÿ nghĩa thực dụng.

2001 - C#: [Anders Hejlsberg] viết l¿i Java và gọi nó là C# b«i vì lÁp trình trong C tut h¡n Java. Mọi ng°£i thích phiên bÁn Java mới này vì nó hồn tồn khơng giáng Java.

- Các đái t°ợng giúp phân vwng nhiám vụ trong dự án.

- Ch°¡ng trình an tồn có thể đ°ợc xây dựng bằng cách ऀn dữ liáu. - Nó có khÁ năng lÁp biểu đã cho các đái t°ợng.

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

- Cho phgp phân lo¿i các đái t°ợng thành các lớp khác nhau. - Há tháng h°ớng đái t°ợng có thể đ°ợc nâng cấp dß dàng. - Mã dự phong có thể đ°ợc lo¿i bß bằng cách sử dụng kế thừa. - Mã có thể đ°ợc m« rộng bằng cách sử dụng l¿i.

- Mô-đun lớn h¡n có thể đ¿t đ°ợc. - Trừu t°ợng dữ liáu làm tăng độ tin cÁy.

- Linh ho¿t do các khái niám ràng buộc năng động.

thông tin.

<i>Sự khác biệt chính giữa OOP và POP: </i>

- POP là lÁp trình h°ớng thÿ tục trong khi OOP là lÁp trình h°ớng đái t°ợng.

- Trọng tâm chính cÿa POP là về cách thāc thực hián nhiám vụ cÿa há tháng, nó tuân theo biểu đã dong chÁy để hồn thành nhiám vụ. Trọng tâm chính cÿa OOP là bÁo mÁt dữ liáu vì chỉ các đái t°ợng cÿa một lớp mới đ°ợc phgp truy cÁp các thuộc tính hoặc chāc năng cÿa một lớp.

- Các chāc năng là các đ¡n vị nhß cÿa các ch°¡ng trình lớn hoặc một ch°¡ng trình con thực thi để hồn thành nhiám vụ chính. Ng°ợc l¿i, các thuộc tính và hàm OOP cÿa lớp đ°ợc chia cho các đái t°ợng .

- Trong POP, khơng có chế độ truy cÁp cụ thể để truy cÁp các thuộc tính hoặc chāc năng trong ch°¡ng trình. Ng°ợc l¿i, trong OOP có ba chế độ truy cÁp, "public", "private", "protected" đ°ợc sử dụng nh° một ph°¡ng thāc truy cÁp để truy cÁp các thuộc tính hoặc chāc năng.

- POP không hỗ trợ khái niám Overloading/polymorphism. Ng°ợc l¿i, OOP hỗ trợ Quá tÁi / Đa hình, nghĩa là sử dụng cwng tên hàm để thực hián các chāc năng khác nhau. Chúng ta có thể Overload các hàm, hàm t¿o và tốn tử trong OOP.

- Khơng có khái niám thừa kế trong POP trong khi đó, OOP hỗ trợ kế thừa cho phgp sử dụng thuộc tính và chāc năng cÿa lớp khác bằng cách kế thừa nó.

- POP kgm an toàn h¡n so với OOP vì trong OOP, bộ chỉ định truy cÁp giới h¿n quyền truy cÁp vào các thuộc tính hoặc chāc năng làm tăng tính bÁo mÁt.

- Trong POP nếu một sá dữ liáu đ°ợc chia sẻ giữa tất cÁ các chāc năng trong ch°¡ng trình, nó đ°ợc khai báo trên toàn há tháng bên ngoài tất cÁ các chāc năng. Trong khi

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

trong OOP, data-member cÿa lớp có thể đ°ợc truy cÁp thơng qua các member-function cÿa lớp.

- Khơng có khái niám về các lớp Áo trong POP trong khi trong OOP, các hàm Áo hỗ trợ đa hình.

<b>2.3. Khci nißm h°áng đ÷i t°£ng và mÿc tiêu cÿa thiët kë h°áng đ÷i t°£ng. </b>

LÁp trình h°ớng đái t°ợng (OOP) là một kỹ thuÁt lÁp trình cho phgp lÁp trình viên t¿o ra các đái t°ợng trong code trừu t°ợng hóa các đái t°ợng.

<i>Đối t°ợng: </i>

Một đái t°ợng bao gãm 2 thông tin: thuộc tính và ph°¡ng thāc.

- Thuộc tính chính là những thơng tin, đặc điểm cÿa đái t°ợng. Ví dụ: con ng°£i có các đặc tính nh° mắt, mũi, tay, chân&

- Ph°¡ng thāc là những thao tác, hành động mà đái t°ợng đó có thể thực hián. Ví dụ: một ng°£i sẽ có thể thực hián hành động nói, đi, ăn, uáng, . . .

<i>Lớp: </i>

Một lớp là một kiểu dữ liáu bao gãm các thuộc tính và các ph°¡ng thāc đ°ợc định nghĩa từ tr°ớc. Đây là sự trừu t°ợng hóa cÿa đái t°ợng. Khác với kiểu dữ liáu thông th°£ng, một lớp là một đ¡n vị (trừu t°ợng) bao gãm sự kết hợp giữa các ph°¡ng thāc và các thuộc tính. Hiểu nơm na h¡n là các đái t°ợng có các đặc tính t°¡ng tự nhau đ°ợc gom l¿i thành một lớp đái t°ợng.

<i>Các nguyên lý c¡ bản của OOP: </i>

- Tính đóng gói (Encapsulation) - Tính kế thừa (Inheritance) - Tính đa hình (Polymorphism) - Tính trừu t°ợng (Abstraction)

<i>Các °u điểm của lập trình h°ớng đối t°ợng: </i>

- Dựa trên nguyên lý kế thừa, trong q trình mơ tÁ các lớp có thể lo¿i bß những ch°¡ng trình bị lặp, d°. Và có thể m« rộng khÁ năng sử dụng các lớp mà không cl¿i. Tái °u và tái sử dụng code hiáu quÁ.

- ĐÁm bÁo rút ngắn th£i gian xây dựng há tháng và tăng năng suất thực hián.

- Sự xuất hián cÿa 2 khái niám mới là lớp và đái t°ợng chính là đặc tr°ng cÿa ph°¡ng pháp lÁp trình h°ớng đái t°ợng. Nó đã giÁi quyết đ°ợc các khuyết điểm cÿa ph°¡ng

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

pháp lÁp trình h°ớng cấu trúc để l¿i. Ngồi ra 2 khái niám này đã giúp biểu dißn tát h¡n thế giới thực trên máy tính.

<b>2.4. S¡ l°£c vë ccc khci niòm cĂ bkn: tru tÊng hoa, ữi tÊng, lỏp, thụng đißp, đong goi, che dấu thơng tin, thư뀀a kë. </b>

<i>Tính đóng gói (Encapsulation): </i>

Các dữ liáu và ph°¡ng thāc có liên quan với nhau đ°ợc đóng gói thành các lớp để tián cho viác quÁn lý và sử dụng. Tāc là mỗi lớp đ°ợc xây dựng để thực hián một nhóm chāc năng đặc tr°ng cÿa riêng lớp đó.

Ngồi ra, đóng gói con để che giấu một sá thơng tin và chi tiết cài đặt nội bộ để bên ngồi khơng thể nhìn thấy.

<i>Tính kế thừa (Inheritance): </i>

Nó cho phgp xây dựng một lớp mới dựa trên các định nghĩa cÿa lớp đã có. Có nghĩa là lớp cha có thể chia sẽ dữ liáu và ph°¡ng thāc cho các lớp con. Các lớp con khßi phÁi định nghĩa l¿i, ngồi ra có thể m« rộng các thành phmới. Tái sử dụng mã nguãn 1 cách tái °u, tÁn dụng đ°ợc mã nguãn. Một sá lo¿i kế lo¿i kế thừa th°£ng gặp: đ¡n kế thừa, đa kế thừa, kế thừa đa cấp, kế thừa thā bÁc.

Khi bắt đThơng th°£ng một sá lớp có quan há với những lớp khác, chúng có những đặc tính giáng nhau.

VD: 2 lớp Android, iPhone

Mỗi lớp đều đ¿i dián cho một lo¿i smartphone khác nhau nh°ng l¿i có những thuộc tính giáng nhau nh° gọi đián, nhắn tin, chụp hình. Thay vì sao chgp những thuộc tính này, ta nên đặt chúng vào một lớp chung gọi là lớp cha. Chúng ta có thể định nghĩa lớp cha – trong

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

Một ví dụ về đa hình trong thực tế. Ta có 2 con vÁt: chó, mgo. CÁ 2 con vÁt này đều là lớp động vÁt. Nh°ng khi ta bÁo cÁ 2 động vÁt kêu thì con chó sẽ kêu gâu gâu, con mgo sẽ kêu meo meo.

VÁy trong ví dụ chó, mgo xem nh° là các đái t°ợng. 2 con vÁt có thể hiểu cwng kêu nh°ng theo các cách khác nhau. à Smartphone và có những lớp con kế thừa từ nó, t¿o ra một mái quan há cha/con.

<i>Tính trừu t°ợng (Abstraction): </i>

Trừu t°ợng có nghĩ là tổng quát hóa một cái gì đó lên, khơng ctrong. Nó khơng màng đến chi tiết bên trong là gì và ng°£i ta v¿n hiểu nó mỗi khi nghe về nó.

Ví dụ: B¿n ch¿y xe tay ga thì có hành động là tăng ga để tăng tác, thì chāc năng tăng ga là đ¿i dián cho trừu t°ợng (abstraction). Ng°£i dwng chỉ ckhơng c

Þ đây trong lÁp trình OOP, tính trừu t°ợng nghĩa là chọn ra các thuộc tính, ph°¡ng thāc cÿa đái t°ợng cnhiều thuộc tính ph°¡ng thāc, nh°ng với bài tốn cụ thể không nhất thiết phÁi chọn tất cÁ.

<b>BÀI </b>

<b>TÀP </b>

QuÁn lý thông tin về sách trong một th° vián. Sử dụng lÁp trình h°ớng đái t°ợng trong Java, thiết kế các lớp để thực hián các chāc năng sau:

1. Định nghĩa lớp Sach (Book):

- Các thuộc tính bao gãm: mã sách, tựa đề, tác giÁ, năm xuất bÁn và sá l°ợng trong kho. - Xác định các ph°¡ng thāc để truy cÁp và cÁp nhÁt thông tin cÿa sách.

2. Định nghĩa lớp ThuVien (Library):

- Sử dụng một ArrayList để l°u trữ danh sách các sách trong th° vián.

- Các ph°¡ng thāc bao gãm: thêm sách mới, xóa sách, tìm kiếm sách theo mã sách hoặc tựa đề, và hiển thị danh sách sách có trong th° vián.

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

- Viết ph°¡ng thāc để xóa sách khßi danh sách.

- Viết ph°¡ng thāc để tìm kiếm sách theo mã sách hoặc tựa đề. - Viết ph°¡ng thāc để hiển thị danh sách sách có trong th° vián.

3.<b> T¿o lớp ch°¡ng trình chính để thử nghiám các chāc năng cÿa lớp ThuVien (Library). </b>

Tham khÁo:

import java.util.ArrayList; class Sach {

private String maSach; private String tuaDe; private String tacGia; private int namXuatBan; private int soLuong;

public Sach(String maSach, String tuaDe, String tacGia, int namXuatBan, int soLuong) {

this.maSach = maSach; this.tuaDe = tuaDe; this.tacGia = tacGia;

this.namXuatBan = namXuatBan; this.soLuong = soLuong;

}

// Getters và setters // ...

@Override

public String toString() {

return "Mã sách: " + maSach + ", Tựa đề: " + tuaDe + ", Tác giả: " + tacGia + ", Năm xuất bản: " + namXuatBan + ", Số lượng: " + soLuong;

} }

class ThuVien {

private ArrayList<Sach> danhSachSach = new ArrayList<>(); public void themSach(Sach sach) {

danhSachSach.add(sach); }

public void xoaSach(String maSach) { for (Sach sach : danhSachSach) {

if (sach.getMaSach().equals(maSach)) { danhSachSach.remove(sach);

break; }

} }

public Sach timKiemSachTheoMa(String maSach) { for (Sach sach : danhSachSach) {

if (sach.getMaSach().equals(maSach)) { return sach;

}

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

}

return null; }

public Sach timKiemSachTheoTuaDe(String tuaDe) { for (Sach sach : danhSachSach) {

if (sach.getTuaDe().equals(tuaDe)) { return sach;

} }

return null; }

public void hienThiDanhSachSach() { for (Sach sach : danhSachSach) { System.out.println(sach); }

} }

public class Main {

public static void main(String[] args) { ThuVien thuVien = new ThuVien(); // Thêm sách mới

thuVien.themSach(new Sach("MS001", "Java Programming", "John Doe", 2020, 5));

thuVien.themSach(new Sach("MS002", "Python Programming", "Jane Smith", 2019, 3));

// Hiển thị danh sách sách trong thư viện

System.out.println("Danh sách sách trong thư viện:"); thuVien.hienThiDanhSachSach();

// Tìm kiếm sách theo mã sách String maSach = "MS001";

System.out.println("\nTìm kiếm sách có mã " + maSach + ":");

Sach sach1 = thuVien.timKiemSachTheoMa(maSach); if (sach1 != null) {

System.out.println(sach1); } else {

System.out.println("Khơng tìm thấy sách có mã " + maSach);

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

<b>Bài 3: Láp và đ÷i t°£ng trong Java Mÿc tiêu: </b>

Học xong ch°¡ng này, ng°£i học có khÁ năng: - Định nghĩa đ°ợc lớp

- T¿o đ°ợc đái t°ợng

- Phân biát các kiểu c¡ s« và tham chiếu

<small>- </small> Sử dụng thành th¿o các phgp gán, phgp so sỏnh.

<b>Nòi dng: </b>

<b>3.1. Vò trớ ca ữi tÊng trong ch°¡ng trknh </b>

Đái t°ợng (Object) có thể là con ng°£i, đián tho¿i, máy tính, yasuo, leesin ... và điểm chung là đều gãm 2 thành ph

- Thuộc tính (Attribute): là những thông tin, đặc điểm cÿa đái t°ợng.

- Ph°¡ng thāc (Method): là những hành động mà đái t°ợng có thể thực hián. Ví dụ: máy tính sẽ có các thuộc tính nh°: màu sắc, kích th°ớc, bộ nhớ, ...

Và các ph°¡ng thāc nh°: qugt virus, tắt máy, kh«i động máy, m« LoL ...

Khi một đái t°ợng có những đặc tính nh° nhau sẽ đ°ợc gom l¿i thành một lớp đái t°ợng (class) và cũng sẽ có 2 thành phdwng để định nghĩa một kiểu dữ liáu mới.

Với ví dụ máy vi tính trên ta hiểu lớp (class) máy vi tính có: Các thuộc tính nh°: màu sắc, kích th°ớc, bộ nhớ, ...

Và các ph°¡ng thāc nh°: qugt virus, tắt máy, kh«i động máy, m« LoL ...

Và đái t°ợng (object) có thể là các dong máy nh° Asus, Acer, Lenovo, Thinkpad, ... đều mang đặc tính cÿa lớp máy vi tính.

<b>3.2. Cài đặt và sư뀉 dÿng láp và đ÷i t°£ng. </b>

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

- Khái lánh

- Lớp và Interface

Ví dụ 1: chúng ta t¿o ra một lớp Student có hai thành viên dữ liáu id và name. Chúng ta t¿o ra các đái t°ợng cÿa lớp Student b«i từ khóa new và in giá trị cÿa các đái t°ợng.

public class Student {

int id; // thành viên dữ liệu

String name; // thành viên dữ liệu

public static void main(String args[]) {

Student student1 = new Student(); // tạo một đối tượng student1

System.out.println(student1.id); System.out.println(student1.name); }

// phương thức displayInformation void displayInformation() {

System.out.println(id + " " + name); }

public static void main(String args[]) { Student2 s1 = new Student2();

Student2 s2 = new Student2(); s1.insertRecord(111, "Viet"); s2.insertRecord(222, "Tuts"); s1.displayInformation();

s2.displayInformation(); }

public Student3(int id, String name) { this.id = id;

this.name = name; }

// phương thức displayInformation void displayInformation() {

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

System.out.println(id + " " + name); }

public static void main(String args[]) { Student3 s1 = new Student3(111, "Viet"); Student3 s2 = new Student3(222, "Tuts"); s1.displayInformation();

s2.displayInformation(); }

Các cách để t¿o đái t°ợng trong java: - Sử dụng từ khóa new

- Sử dụng ph°¡ng thāc newInstance() - Sử dụng ph°¡ng thāc clone()

4. Đái t°ợng đ°ợc t¿o ra chÿ yếu từ từ khóa new.

Ví dụ: Student s1=new Student();

Lớp đ°ợc khai báo bằng viác sử dụng từ khóa class.

Chỉ có một cách để định nghĩa lớp trong java sử dụng từ khoá class

<b>3.3. Đ÷i t°£ng và tham chiëu đ÷i t°£ng. </b>

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

Một tham chiếu trong Java là một biến chāa địa chỉ bộ nhớ cÿa một đái t°ợng, trong khi một đái t°ợng là một thể hián cÿa một lớp chāa dữ liáu và các ph°¡ng thāc để thao tác với dữ liáu đó.

Các tham chiếu đ°ợc sử dụng để t°¡ng tác với các đái t°ợng trong Java, cho phgp thao tác các thuộc tính cÿa đái t°ợng và gọi các ph°¡ng thāc cÿa đái t°ợng. Ng°ợc l¿i, các đái t°ợng là các thể hián thực tế cÿa dữ liáu và ph°¡ng thāc đ°ợc t¿o từ các định nghĩa lớp.

Nhiều tham chiếu có thể trß đến cwng một đái t°ợng, cho phgp chia sẻ quyền truy cÁp và sửa đổi dữ liáu đái t°ợng. Ng°ợc l¿i, các đái t°ợng có thể đ°ợc t¿o và hÿy một cách linh ho¿t trong quá trình thực thi ch°¡ng trình Java.

Sự khác biát giữa một đái t°ợng và một tham chiếu là một đái t°ợng là một thể hián cÿa một lớp và đ°ợc l°u trữ trong một khe bộ nhớ cụ thể. 'Tham chiếu' trß đến n¡i l°u trữ các biến và ph°¡ng thāc cÿa 'đái t°ợng'.

Một lớp là một kế ho¿ch chi tiết hoặc một m¿u cung cấp các h°ớng d¿n về cách t¿o các đái t°ợng. Đái t°ợng tự căn cā vào điều này cấu trúc, điền vào các tr°£ng cm¿u lớp đó.

BÁng so sánh:

Định nghĩa c¡ bÁn Nó là thể hián cÿa một lớp và tất cÁ các thành phchāa đều dựa trên bÁn thiết kế cÿa lớp.

Một tham chiếu bộ nhớ đ¡n giÁn trß đến n¡i đái t°ợng đ°ợc l°u trữ trong một khe cắm bộ nhớ.

Định d¿ng để t¿o Có một định d¿ng đ¡n giÁn để t¿o một đái t°ợng: ClassName tham chiếu_biến = ClassName mới (có tham sá);

Tham chiếu bộ nhớ đ°ợc t¿o cwng với đái t°ợng. Nó đ°ợc sử dụng trong định d¿ng để t¿o đái t°ợng và đ°ợc đặt tên biến.

Các yếu tá Nó chāa các ph°¡ng thāc và biến dựa trên lớp.

Nó chāa một chuỗi các bit l°u trữ địa chỉ cÿa đái t°ợng. Có thể thay đổi Các đái t°ợng có các tr¿ng

thái và hành vi có thể thay đổi đ°ợc, tāc là điều kián cÿa

Giá trị tham chiếu biến không thể thay đổi. Nó chỉ có thể duy trì d°ới d¿ng kiểu dữ liáu mà nó đã đ°ợc khai báo.

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

đái t°ợng có thể thay đổi đ°ợc.

Nghĩa Áo Nó là một thực thể trong thế giới thực chāa một sá d¿ng bộ nhớ hoặc dữ liáu.

Nó khơng là gì ngồi một tên biến khơng có ý nghĩa thực sự. Nó giáng nh° tên cÿa một ng°£i ám chỉ ng°£i đó. Sự khác biát chính giữa Tham chiếu và Đái t°ợng trong Java:

- Một đái t°ợng là một thể hián bắt nguãn từ cấu trúc cÿa một lớp. Tham chiếu là một biến trß đến vị trí cÿa đái t°ợng trong bộ nhớ.

- Một đái t°ợng đ°ợc t¿o với một định d¿ng cụ thể – <Tên_biến_tham_chiếu_lớp = Tên_lớp mới(có tham sá);=. Một tham chiếu đ°ợc t¿o cwng với viác t¿o đái t°ợng trong định d¿ng.

<b>3.4. Thऀ hißn cÿa khci nißm đong goi và che dấu thơng tin trong cài đặt láp. </b>

Tính đóng gói trong java là kỹ thuÁt ऀn giấu thông tin và hiển thị ra thơng tin liên quan. Mục đích chính cÿa đóng gói trong java là giÁm thiểu māc độ phāc t¿p phát triển phĐóng gói cũng đ°ợc sử dụng để bÁo vá tr¿ng thái bên trong cÿa một đái t°ợng. Thông qua các ph°¡ng thāc set,get ta có thể thay đổi các giá trị thuộc tính và lấy giá trị từ chúng. Điều này làm cho ch°¡ng trình dß qn lý h¡n và có thể kiểm sốt dữ liáu tát h¡n.

Ví dụ về tính đóng gói

public class HinhChuNhat {

private int rong; // biến intance private int dai; // biến intance public void setRong(int rong){ this.rong = rong;

public int getDai(){ return this.dai; }

}

Mặc dw không thể trực tiếp thay đổi giá trị cÿa hai biến rong và dai nh°ng có thể thông qua ph°¡ng thāc setRong , setDai để thay đổi giá trị cÿa chúng. Hoặc thông qua hai ph°¡ng thāc getRong và getDai để lấy ra giá trị cÿa chúng.

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

public class DemoJava {

public static void main(String[] args) { HinhChuNhat HCN = new HinhChuNhat(); HCN.setRong(3);

- private (riêng t°): Nếu khai báo ph¿m vi truy cÁp là private thì chỉ duy nhất trong lớp (class) đó mới có thể nhìn thấy đ°ợc.

- public (công khai): Nếu khai báo ph¿m vi truy cÁp là public thì mọi thā từ lớp (class), gói (package), lớp con (subclass) đề có thể nhìn thấy đ°ợc.

- protected (đ°ợc bÁo vá): Nếu khai báo ph¿m vi truy cÁp là protected thì lớp (class) đó, gói (package) đó, lớp con (subclass) đó đều có thể nhìn thấy đ°ợc.

<b>3.5. Phân bißt ccc kiऀu dư뀃 lißu c¡ bkn và đ÷i t°£ng. </b>

Có 8 kiểu dữ liáu ngun thÿy (Primitive Data type) (c¡ bÁn) đó là: boolean, byte, char, short, int, long, float, double.

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

<i>Kiểu dữ liệu đối t°ợng: </i>

- Array: là mÁng, tÁp hợp các dữ liáu có cwng một kiểu.

- Class: dữ liáu này có kiểu lớp đái t°ợng đ°ợc định nghĩa b«i ng°£i dwng. Bên trong sẽ chāa tÁp hợp các thuộc tính cũng nh° ph°¡ng thāc cÿa lớp

- Interface: dữ liáu này thuộc kiểu lớp giao tiếp đ°ợc định nghĩa b«i ng°£i dwng và chāa các ph°¡ng thāc giao tiếp.

- Framwork định nghĩa: Những đái t°ợng này đ°ợc t¿o sẵn và công viác cÿa chúng ta chỉ viác gọi lên và sử dụng chúng, ví dụ: File, String, Scanner...

<i>So sánh kiểu đối t°ợng và kiểu nguyên thủy: </i>

- Trong lÁp trình kiểu dữ liáu đái t°ợng cung cấp các tính năng và khÁ năng m« rộng mà các kiểu dữ liáu nguyên thÿy không thể đáp āng đ°ợc

- Kiểu dữ liáu đái t°ợng cho phgp chúng ta định nghĩa các đái t°ợng và cấu trúc dữ liáu phāc t¿p h¡n để đáp āng nhu cta có thể t¿o ra các đái t°ợng phāc t¿p bao gãm các thuộc tính và ph°¡ng thāc, và các đái t°ợng này có thể t°¡ng tác với nhau để thực hián các chāc năng cụ thể. Trong khi đó khi chúng ta muán đ¿i dián cho các đái t°ợng phāc t¿p h¡n, chẳng h¿n nh° một ng°£i, một sÁn phऀm, một tài khoÁn ngân hàng, thì các kiểu dữ liáu ngun thÿy khơng đÿ để mô tÁ chúng.

- Kiểu dữ liáu đái t°ợng cung cấp nhiều tính năng h¡n so với các kiểu dữ liáu nguyên thÿy. Chúng cho phgp chúng ta sử dụng kế thừa để tái sử dụng code, đóng gói để giữ các thuộc tính và ph°¡ng thāc cÿa đái t°ợng đ°ợc bÁo mÁt, và đa hình để cho phgp các đái t°ợng khác nhau có thể sử dụng các ph°¡ng thāc cwng tên một cách khác nhau. - H¡n nữa, các kiểu dữ liáu đái t°ợng cũng cho phgp chúng ta t¿o ra các đái t°ợng phw

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

- Ng°ợc l¿i, kiểu dữ liáu đái t°ợng đ°ợc l°u trữ trong vwng nhớ và biến đ°ợc sử dụng để tham chiếu đến vwng nhớ đó. Khi chúng ta truyền một biến kiểudữ liáu đái t°ợng vào một hàm hoặc ph°¡ng thāc, một bÁn sao cÿa tham chiếu đến vwng nhớ cÿa đái t°ợng đ°ợc t¿o ra và đ°ợc truyền vào hàm. Điều này có nghĩa là khi giá trị cÿa đái t°ợng đ°ợc thay đổi trong hàm, giá trị cÿa biến gác cũng sẽ bị thay đổi, b«i vì cÁ biến và đái t°ợng đều tham chiếu đến cwng một vwng nhớ.

- Một điều đặc biát nữa khi dwng kiểu dữ liáu đái t°ợng thì chúng có thể null đ°ợc con kiểu nguyên thÿy không thể thực hián đ°ợc điều này.

Ví dụ kiểu dữ liáu nguyên thuÿ (c¡ bÁn)

public static void main(String[] args) { int x = 10;

int y = x;

System.out.println("Before assign"); System.out.println("x = "+x);

System.out.println("y = "+y); y = 8;

System.out.println("After assign"); System.out.println("x = "+x);

System.out.println("y = "+y); }

Kết quÁ: <small>Before assign X = 10 y = 10 After assign X = 10 y = 8 </small>

Ví dụ kiểu dữ liáu đái t°ợng

public class ReferenceTypeExample { int value = 10;

}

public static void main(String[] args) {

ReferenceTypeExample x = new ReferenceTypeExample(); ReferenceTypeExample y = x;

System.out.println("Before assign"); System.out.println("x = "+x.value); System.out.println("y = "+y.value); y.value = 8;

System.out.println("After assign"); System.out.println("x = "+x.value); System.out.println("y = "+y.value); }

Kết quÁ: <small>Before assign x = 10 </small>

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

<small>y = 10 After assign x = 8 y = 8 </small>

<b>3.6. Bkn chất cÿa đ÷i t°£ng và tham chiëu đ÷i t°£ng </b>

<i>Bản chất của đối t°ợng: </i>

Đái t°ợng là một khái niám đ°ợc dwng để chỉ một thực thể cụ thể có tr¿ng thái và hành vi. BÁn chất cÿa một đái t°ợng xác định b«i các tr¿ng thái và hành vi mà nó có thể thực hián đ°ợc.

- Tr¿ng thái: Những đặc điểm, tính chất cÿa một đái t°ợng - Hành vi: Những hành động mà một đái t°ợng thực hián

Ví dụ, một đái t°ợng "xe h¡i", bÁn chất cÿa nó có thể bao gãm các thuộc tính nh° màu sắc, hãng sÁn xuất, tác độ tái đa, cũng nh° các ph°¡ng thāc nh° "kh«i động", "dừng",...

<i>Tham chiếu đối t°ợng (Object Reference): </i>

- Tham chiếu là một biến hoặc giá trị mà chỉ đến một vwng nhớ chāa dữ liáu cÿa một đái t°ợng.

- Khi t¿o một đái t°ợng, t¿o một tham chiếu để truy cÁp đến nó.

Ví dụ, trong Java, b¿n có thể t¿o một tham chiếu đến một đái t°ợng "xe h¡i" nh° sau:

Car myCar = new Car();

Trong đó, myCar là tham chiếu đến một đái t°ợng "xe h¡i".

Car car1 = new Car("Toyota");

Car car2 = car1; // gán tham chiếu của car1 đến car2, không tạo ra một bản sao mới của đối tượng

<i>Phgp so sánh đối t°ợng (Object Comparison): </i>

- Trong Java, phgp so sánh đái t°ợng (==) so sánh xem hai tham chiếu có trß đến cwng một đái t°ợng trong bộ nhớ hay không.

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

- Đái với các đái t°ợng, phgp so sánh đái t°ợng sẽ so sánh các tham chiếu, khơng phÁi nội dung cÿa chúng.

Ví dụ:

Car car1 = new Car("Toyota"); Car car2 = new Car("Toyota"); Car car3 = car1;

System.out.println(car1 == car2); // false, vì car1 và car2 có các tham chiếu khác nhau

System.out.println(car1 == car3); // true, vì car1 và car3 trỏ đến cùng một đối tượng

System.out.println(car1.equals(car2)); // true nếu phương thức equals() được cài đặt để so sánh nội dung của đối tng

<b>3.8. CĂ chở truyởn tham sữ v gic trò trk vë </b>

<i>Truyền tham số: </i>

Truyền tham sá trong Java có thể là bất kỳ kiểu dữ liáu nào, bao gãm các kiểu c¡ bÁn nh° int, double, char, cũng nh° các kiểu dữ liáu tham chiếu nh° String, Object, hoặc các lớp tự định nghĩa.

Khi gọi một ph°¡ng thāc và truyền tham sá, các giá trị cÿa các tham sá đó đ°ợc sao chgp vào các biến cục bộ trong ph°¡ng thāc.

Bất kỳ thay đổi nào thực hián trên các tham sá đó trong ph°¡ng thāc cũng chỉ Ánh h°«ng đến các bÁn sao cục bộ cÿa chúng, khơng Ánh h°«ng đến giá trị cÿa các biến gọi ph°¡ng thāc.

Truyền tham sá kiểu c¡ bÁn: đái với các tham sá kiểu c¡ bÁn nh° int, double, char, chỉ c

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

public class Example {

public static void printNumber(int number) { System.out.println("Number: " + number); }

public static void main(String[] args) { int x = 10;

printNumber(x); // Gọi phương thức và truyền tham số x }

}

Truyền tham sá kiểu tham chiếu: đái với các tham sá kiểu tham chiếu nh° String, Object, hoặc bất kỳ lớp nào ng°£i dwng tự định nghĩa, cũng chỉ cchúng vào ph°¡ng thāc.

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

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

public class Example {

public static void printMessage(String message) { System.out.println("Message: " + message); }

public static void main(String[] args) { String greeting = "Hello, world!";

printMessage(greeting); // Gọi phương thức và truyền tham số greeting

} }

Truyền nhiều tham sá: có thể truyền nhiều tham sá vào ph°¡ng thāc bằng cách phân tách chúng bằng dấu phऀy.

<b><small>Ví dụ: </small></b>public class Example {

public static void printDetails(String name, int age) { System.out.println("Name: " + name + ", Age: " + age); }

public static void main(String[] args) { String studentName = "Alice";

int studentAge = 20;

printDetails(studentName, studentAge); // Gọi phương thức và truyền tham số name và age

} }

Ví dụ:

public class Example {

// Phương thức truyền tham số

public static void printMessage(String message) { System.out.println(message);

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

// Gọi phương thức và sử dụng giá trị trả về int sum = add(5, 3);

System.out.println("Sum: " + sum); }

}

Trong ví dụ này, ph°¡ng thāc printMessage nhÁn một tham sá message và không trÁ về giá trị nào. Ph°¡ng thāc add nhÁn hai tham sá a và b, và trÁ về tổng cÿa chúng.

<b>3.9. Tham chiëu this </b>

Trong Java, this là một từ khóa đặc biát đ°ợc sử dụng để tham chiếu đến đái t°ợng hián t¿i từ bên trong một ph°¡ng thāc cÿa đái t°ợng đó.

<i>Tham chiếu đến các tr°ờng và ph°¡ng thức của đối t°ợng hiện tại: </i>

- Khi b¿n sử dụng this, b¿n có thể truy cÁp các tr°£ng (biến thành viên) và ph°¡ng thāc cÿa đái t°ợng hián t¿i mà khơng c

- Điều này hữu ích khi có sự trwng lặp giữa tên tham sá và tên tr°£ng hoặc kh muán làm rõ rằng đang tham chiếu đến tr°£ng hoặc ph°¡ng thāc cÿa đái t°ợng hián t¿i

<small>Ví dụ: </small>public class MyClass { private int number;

public void setNumber(int number) {

this.number = number; // Tham chiếu đến trường number của đối tượng hiện tại

}

public int getNumber() {

return this.number; // Tham chiếu đến trường number của đối tượng hiện tại

} }

<i>Truy cập các ph°¡ng thức khác của cùng một đối t°ợng: </i>

Có thể sử dụng this để gọi một ph°¡ng thāc khác cÿa cwng một đái t°ợng.

<b><small>Ví dụ</small></b>: public class MyClass { public void method1() {

// Gọi phương thức method2() của cùng một đối tượng this.method2();

}

public void method2() {

// Thân phương thức method2() }

}

Trong một sá tr°£ng hợp, viác sử dụng this có thể khơng ccode rõ ràng và dß đọc h¡n trong nhiều tình huáng.

<b>3.10. Ccc đặc điऀm đặc thù ngơn ngư뀃 nh° thành viên static, package, tham s÷ dong lßnh. </b>

Trong Java, có một sá đặc điểm đặc thw cÿa ngôn ngữ, bao gãm các thành viên static, gói (package), và tham sá dong lánh

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

<i>Thành viên static: </i>

- Trong Java, thành viên static là các thành viên cÿa một lớp mà thuộc về lớp chā không phÁi cÿa các đái t°ợng cụ thể cÿa lớp đó.

- Các thành viên static bao gãm các biến static và các ph°¡ng thāc static.

- Biến static chia sẻ giá trị giữa tất cÁ các thể hián (instances) cÿa lớp, trong khi ph°¡ng thāc static có thể đ°ợc gọi mà khơng c

<b><small>Ví dụ: </small></b>public class MyClass {

public static int staticVariable; public int instanceVariable;

public static void staticMethod() { // Thân phương thức staticMethod() }

public void instanceMethod() {

// Thân phương thức instanceMethod() }

// Thân lớp MyClass }

<i>Tham số dòng lệnh (Command Line Arguments): </i>

- Trong Java, có thể truyền tham sá vào ch°¡ng trình Java khi nó đ°ợc ch¿y từ dong lánh.

- Các tham sá này đ°ợc chuyển vào ph°¡ng thāc main() cÿa lớp chính (class) cÿa ch°¡ng trình d°ới d¿ng một mÁng các chuỗi (String[] args).

<b><small>Ví dụ: </small></b>public class Main {

public static void main(String[] args) {

System.out.println("Number of command line arguments: " + args.length);

for (String arg : args) { System.out.println(arg); }

} }

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

Khi ch¿y ch°¡ng trình này từ dong lánh và truyền các đái sá, chúng sẽ đ°ợc in ra trong ph°¡ng thāc main(). Ví dụ: java Main arg1 arg2. Trong đó, arg1 và arg2 là các tham sá dong lánh.

<b>3.11. Quan hò composition gia ccc ữi tÊng </b>

Trong lp trình h°ớng đái t°ợng, quan há composition là một lo¿i quan há mà một đái t°ợng chāa một hoặc nhiều đái t°ợng khác nh° là một phlà "đái t°ợng thành phbị hÿy, tất cÁ các đái t°ợng thành ph

Trong Java, quan há composition th°£ng đ°ợc thể hián thông qua viác khai báo các tr°£ng (fields) cÿa lớp chÿ là các đái t°ợng cÿa các lớp khác. Các đái t°ợng này đ°ợc t¿o và qn lý b«i lớp chÿ.

<b><small>Ví dụ: </small></b>public class Car { private Engine engine; private Wheel[] wheels; public Car() {

this.engine = new Engine(); this.wheels = new Wheel[4]; for (int i = 0; i < 4; i++) { this.wheels[i] = new Wheel(); }

<b>BÀI TÀP </b>

QuÁn lý thông tin về học sinh trong một lớp học. Sử dụng lÁp trình h°ớng đái t°ợng trong Java, thiết kế các lớp để thực hián các chāc năng sau:

1. Định nghĩa lớp HocSinh (Student):

- Các thuộc tính bao gãm: mã học sinh, tên, tuổi và điểm trung bình.

- Xác định các ph°¡ng thāc để truy cÁp và cÁp nhÁt thông tin cÿa học sinh.

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

2. T¿o lớp ch°¡ng trình chính để thử nghiám các chāc năng cÿa lớp HocSinh (Student).

- Thiết lÁp và hiển thị thông tin cÿa học sinh.

- CÁp nhÁt thông tin cÿa học sinh (ví dụ: điểm trung bình). - Hiển thị thông tin cÿa học sinh sau khi cÁp nhÁt.

<i>Tham khảo: </i>

class HocSinh {

private String maHocSinh; private String ten;

private int tuoi;

private double diemTrungBinh;

public HocSinh(String maHocSinh, String ten, int tuoi, double diemTrungBinh) {

this.maHocSinh = maHocSinh; this.ten = ten;

this.tuoi = tuoi;

this.diemTrungBinh = diemTrungBinh; }

// Getters và setters // ...

@Override

public String toString() {

return "Mã học sinh: " + maHocSinh + ", Tên: " + ten + ", Tuổi: " + tuoi + ", Điểm TB: " + diemTrungBinh;

} }

public class Main {

public static void main(String[] args) { // Tạo một đối tượng HocSinh mới

HocSinh hocSinh = new HocSinh("HS001", "Nguyen Van A", 15, 8.5);

// Hiển thị thông tin của học sinh

System.out.println("Thông tin của học sinh:"); System.out.println(hocSinh);

// Cập nhật điểm trung bình của học sinh hocSinh.setDiemTrungBinh(9.0);

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

// Hiển thị thông tin của học sinh sau khi cập nhật

System.out.println("\nThông tin của học sinh sau khi cập nhật:");

System.out.println(hocSinh); }

}

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

<b>Bài 4: Thư뀀a kë Mÿc tiêu: </b>

Học xong ch°¡ng này, ng°£i học có khÁ năng: - Cài đặt đ°ợc các lớp kế thừa

<b>Nßi dÿng: </b>

<b>4.1. Khci nißm kë thư뀀a </b>

Kế thừa là một trong những khái niám quan trọng nhất trong lÁp trình h°ớng đái t°ợng, cho phgp một lớp (class) mới có thể sử dụng các thuộc tính và ph°¡ng thāc cÿa lớp (hoặc các giao dián) đã tãn t¿i. Trong Java, có thể kế thừa từ một lớp khác bằng cách sử dụng từ khóa extends.

<i>Lớp con (subclass) và lớp cha (superclass): </i>

- Lớp con (subclass) là lớp kế thừa từ một lớp khác, đ°ợc gọi là lớp cha (superclass). - Lớp con kế thừa tất cÁ các thuộc tính và ph°¡ng thāc non-private cÿa lớp cha.

<i>Từ khóa extends: </i>

Để kế thừa từ một lớp khác, b¿n sử dụng từ khóa extends.

<b><small>Ví dụ: </small></b>class ChildClass extends ParentClass { // Thân lớp con

}

<i>Ghi đè (Override): </i>

Khi một ph°¡ng thāc trong lớp con có cwng tên, cwng kiểu trÁ về và cwng danh sách tham sá với một ph°¡ng thāc trong lớp cha, lớp con có thể ghi đg (override) ph°¡ng thāc cÿa lớp cha để cung cấp hián thực hoặc hành vi mới.

<b><small>Ví dụ: </small></b>class ChildClass extends ParentClass { @Override

public void someMethod() {

// Thân phương thức mới của lớp con }

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

Kế thừa trong Java giúp tái sử dụng mã nguãn, giÁm thiểu sự lặp l¿i và tăng tính linh ho¿t cÿa mã nguãn. Tuy nhiên, nó cũng cđề nh° kết nái m¿nh (tight coupling) giữa các lớp và nguy c¡ rÿi ro trong quÁn lý thay đổi.

<b>4.2. Cài đặt quan hß thư뀀a kë trong Java </b>

GiÁ sử có một lớp Animal là lớp cha và t¿o ra một lớp con là Dog, mơ phßng một con chó. // Lớp cha Animal

class Animal { String name;

public Animal(String name) { this.name = name;

}

public void sound() {

System.out.println("The animal makes a sound."); }

}

// Lớp con Dog kế thừa từ lớp Animal

class Dog extends Animal { public Dog(String name) {

// Gọi constructor của lớp cha bằng từ khóa super super(name);

}

// Ghi đg ph°¡ng thāc sound() cÿa lớp cha @Override

public void sound() {

System.out.println("The dog barks."); }

// Phương thức mới của lớp Dog public void wagTail() {

System.out.println("The dog wags its tail."); }

}

// Lớp chính Main

public class Main {

public static void main(String[] args) { // Tạo một đối tượng Dog

Dog dog = new Dog("Buddy"); // Gọi phương thức của lớp cha

dog.sound(); // Kết quả: "The dog barks." // Gọi phương thức mới của lớp Dog

dog.wagTail(); // Kết quả: "The dog wags its tail."

} }

Trong ví dụ này:

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

- Lớp Animal là lớp cha, có một tr°£ng name và một ph°¡ng thāc sound() để phát ra tiếng.

- Lớp Dog là lớp con cÿa Animal, kế thừa từ Animal. Nó cung cấp một ph°¡ng thāc mới wagTail() và ghi đg ph°¡ng thāc sound() cÿa lớp cha để mô tÁ tiếng sÿa cÿa chó. - Trong ph°¡ng thāc main(), chúng ta t¿o một đái t°ợng Dog và gọi các ph°¡ng thāc

cÿa nó.

<b>4.3. Quyën truy nh⌀p và che dấu thông tin </b>

Trong Java, quyền truy cÁp và che dấu thông tin là hai khái niám quan trọng liên quan đến viác kiểm soát viác truy cÁp vào các thành phconstructor). Java cung cấp các từ khóa để xác định māc độ quyền truy cÁp và cách che dấu thông tin:

<i>Quyền truy cập (Access Modifiers): </i>

Public (public): các thành phgãm từ bên ngồi lớp đó.

<b><small>Ví dụ: </small></b>public class MyClass { public int publicField;

public void publicMethod() { // Thân phương thức public }

}

Private (private): các thành phcwng một lớp.

<b><small>Ví dụ: </small></b>public class MyClass { private int privateField;

private void privateMethod() { // Thân phương thức private }

}

Protected (protected): các thành phtrong cwng một lớp, từ các lớp con, và từ các lớp trong cwng gói.

<b><small>Ví dụ</small></b>: public class MyClass {

protected int protectedField;

protected void protectedMethod() { // Thân phương thức protected }

}

<i>Che dấu thông tin (Encapsulation): </i>

Che dấu thông tin là quá trình ऀn các chi tiết cÿa một đái t°ợng và chỉ hiển thị những ph

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

Trong Java, viác che dấu thông tin th°£ng đ°ợc thực hián bằng cách đặt các tr°£ng (fields) là private và cung cấp các ph°¡ng thāc public để truy cÁp và cÁp nhÁt giá trị cÿa chúng (con đ°ợc gọi là getters và setters).

<b><small>Ví dụ: </small></b>public class Person { private String name; private int age;

// Getter và setter cho trường name public String getName() {

return name; }

public void setName(String name) { this.name = name;

}

// Getter và setter cho trường age public int getAge() {

return age; }

public void setAge(int age) { this.age = age;

}

}

Trong ví dụ này, tr°£ng name và age đ°ợc đặt là private, vì vÁy khơng thể truy cÁp trực tiếp từ bên ngồi lớp Person. Thay vào đó, chúng ta cung cấp các ph°¡ng thāc public để lấy và thiết lÁp giá trị cÿa các tr°£ng này. Điều này giúp che dấu thơng tin và kiểm sốt cách truy cÁp và cÁp nhÁt các tr°£ng cÿa đái t°ợng.

<b>4.4. Thành viên final, constructor </b>

Trong Java, final là một từ khóa đ°ợc sử dụng để đánh dấu một biến, một ph°¡ng thāc hoặc một lớp để chỉ ra rằng chúng là bất biến (immutable) hoặc không thể thay đổi sau khi đã đ°ợc kh«i t¿o hoặc đ°ợc khai báo. D°ới đây là cách b¿n có thể sử dụng final cho thành viên và constructor trong Java:

<i>Thành viên final: </i>

Biến final: một biến final không thể thay đổi giá trị sau khi đã đ°ợc kh«i t¿o.

<b><small>Ví dụ: </small></b>public class Example { final int x = 10;

public static void main(String[] args) { Example ex = new Example();

// ex.x = 20; // Lỗi: Không thể gán lại giá trị cho biến final

} }

Ph°¡ng thāc final: một ph°¡ng thāc final không thể bị ghi đg (override) trong các lớp con.

</div>

×