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.. 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
Trang 1U þ BAN NHÂN DÂN THÀNH PHà Hâ CHÍ MINH
TR¯âNG CAO ĐÀNG BÁCH KHOA NAM SÀI GÒN
GIÁO TRÌNH MÔN H àC/MÔ ĐUN: LÀP TRÌNH H¯àNG ĐÞI T¯þNG
NGÀNH/ NGH Þ: TIN HàC ĀNG DþNG TRÌNH ĐÞ: CAO ĐÀNG
Ban hành kèm theo Quyết định số: 459/QĐ-NSG ngày 31 tháng 8 năm2022
c ủa Hiệu tr°ởng Tr°ờng Cao Đẳng Bách Khoa Nam Sài Gòn
Tp.H ồ Chí Minh, năm 2022
Trang 2Tài liáu này thuộc lo¿i sách giáo trình nên các nguãn 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
Trang 3LÁ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 quá 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 hoà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 &&&&
Trang 4M þC LþC
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
Trang 55.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
Trang 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
2 Về kỹ năng:
- GiÁi quyết và đ°a ra giÁi pháp lÁp trình h°ớng đái t°ợng cho các bài toán « quy mô nhß
- Trình bày đ°ợc s¡ đã lớp bằng ngôn ngữ đặc tÁ UML với cú pháp c¡ bÁn
- Cài đặt thiết kế h°ớng đái t°ợng cho tr°ớc bằng ngôn ngữ Java
Trang 7NÞI DUNG MÔN HàC Bài 1: Mở đầu
Mÿc tiêu:
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
Nßi dung:
1.1 Lßch sư뀉 ngôn ngư뀃 Java
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
1.2 Môi tr°ãng l⌀p trknh Java, mcy ko, và JDK
Để đÁ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ó phtin 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ì
Trang 8Khi thực hián một ch°¡ng trình, máy Áo Java lBytecode 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
1.3 Giái thißu vë ccc loci ch°¡ng trknh Java: application và applet
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 ccô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, phmề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ó đuôi COM hay đuô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 lo¿i āng dụng nhß đ°ợc xây dựng 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
Trang 9Những phiên bÁn Applet đho¿t động điều chỉnh, các applet cÿa Java đã đ°ợc lo¿i bß hoàn toà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
1.4 D ßch và chcy ch°¡ng trknh
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,&
NetBeans IDE:
Tạo một Java Project
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
Trang 10Chọ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
Tạo một Java Class
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
Trang 11NhÁ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
Trang 12Bài 2: C cc khci nißm vë l⌀p trknh h°áng đ÷i t°£ng
Mÿc tiêu:
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
Nßi dÿng:
2.1 L ßch sư뀉 ngôn ngư뀃 l⌀p trknh
Ch°¡ng trình máy tính đtoá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 toán
sá Bernoulli bằng cỗ máy đó, đ°ợc htí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à đú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
Trang 131978 – 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 tungữ 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 tuyát h¡n Java Mọi ng°£i thích phiên bÁn Java mới này vì nó hoàn toàn không giáng Java
2.2 So s cnh l⌀p trknh thÿ tÿc và l⌀p trknh h°áng đ÷i t°£ng
¯u điểm của các kiểu lập trình
POP (Lập trình hướng thủ tục)
- Cung cấp khÁ năng tái sử dụng cwng một mã t¿i nhiều n¡i khác nhau
- T¿o điều kián trong viác theo dõi dong ch°¡ng trình
- Có khÁ năng xây dựng các mô-đun
OOP (L⌀p trknh h°áng đ÷i t°£ng)
- Các đái t°ợng giúp phân vwng nhiám vụ trong dự án
- Ch°¡ng trình an toà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
Trang 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
Sự khác biệt chính giữa OOP và POP:
- 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 để hoà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 để hoà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à toá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
Trang 15trong 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
2.3 Kh ci nißm h°áng đ÷i t°£ng và mÿc tiêu cÿa thiët kë h°áng đ÷i t°£ng
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 t°ợng:
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,
Lớp:
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
Các nguyên lý c¡ bản của OOP:
- 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)
Các °u điểm của lập trình h°ớng đối t°ợng:
- Dựa trên nguyên lý kế thừa, trong quá 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 cl¿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
Trang 16pháp lÁp trình h°ớng cấu trúc để l¿i Ngoà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
2.4 S¡ l°£c vë ccc khci nißm c¡ bkn: trư뀀u t°£ng hoa, đ÷i t°£ng, láp, thông đißp, đong
g oi, che dấu thông tin, thư뀀a kë
Tính đóng gói (Encapsulation):
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 đó
Ngoà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 ngoài không thể nhìn thấy
Tính kế thừa (Inheritance):
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, ngoài ra có thể m« rộng các thành phmớ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
Trang 17Mộ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
Tính trừu t°ợng (Abstraction):
Trừu t°ợng có nghĩ là tổng quát hóa một cái gì đó lên, không ctrong 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ỉ ckhô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 cnhiều thuộc tính ph°¡ng thāc, nh°ng với bài toán cụ thể không nhất thiết phÁi chọn tất cÁ
BÀI TÀP
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
H°ớng dẫn:
1 T¿o lớp Sach (Book) với các thuộc tính và ph°¡ng thāc phù hợp nh° đã mô tÁ trong bài tÁp
2 T¿o lớp ThuVien (Library) với một ArrayList để l°u trữ danh sách các sách
- Viết ph°¡ng thāc để thêm sách mới vào danh sách
Trang 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. 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)
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) {
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) {
public Sach timKiemSachTheoMa(String maSach) {
for (Sach sach : danhSachSach) {
if (sach.getMaSach().equals(maSach)) {
return sach;
}
Trang 19}
return null;
}
public Sach timKiemSachTheoTuaDe(String tuaDe) {
for (Sach sach : danhSachSach) {
public void hienThiDanhSachSach() {
for (Sach sach : danhSachSach) {
System.out.println(sach);
}
}
}
public class Main {
public static void main(String[] args) {
ThuVien thuVien = new ThuVien();
// 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();
Trang 20Bài 3: L áp và đ÷i t°£ng trong Java
3.1 V ß trí cÿa đ÷i t°£ng trong ch°¡ng trknh
Đá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 phdwng để đị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
3.2 C ài đặt và sư뀉 dÿng láp và đ÷i t°£ng
Lớp:
Một lớp là một nhóm đái t°ợng có các thuộc tính chung Nó là một m¿u hoặc thiết kế
từ đó các đái t°ợng đ°ợc t¿o ra
Một lớp trong java có thể chāa:
- Thành viên dữ liáu
- Constructor
- Ph°¡ng thāc
Trang 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
public static void main(String args[]) {
Student2 s1 = new Student2();
Student2 s2 = new Student2();
Trang 22System.out.println(id + " " + name);
}
public static void main(String args[]) {
Student3 s1 = new Student3(111, "Viet");
Student3 s2 = new Student3(222, "Tuts");
Ví dụ: Student s1=new Student();
Lớp đ°ợc khai báo bằng viác sử dụng từ khóa class
Ví dụ: class Student{}
5 Đái t°ợng có thể đ°ợc t¿o nhiều l Lớp đ°ợc khai báo 1 l
6 Đái t°ợng đ°ợc cấp bộ nhớ khi nó đ°ợc
t¿o ra Lớp không đ°ợc cấp bộ nhớ khi nó đ°ợc t¿o ra
7 Có rất nhiều cách để t¿o ra đái t°ợng
trong java nh° từ khóa new, ph°¡ng thāc
newInstance(), ph°¡ng thāc clone(),
ph°¡ng thāc factory và deserialization
Chỉ có một cách để định nghĩa lớp trong java sử dụng từ khoá class
3.3 Đ÷i t°£ng và tham chiëu đ÷i t°£ng
Trang 23Mộ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 cm¿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
Trang 24đái t°ợng có thể thay đổi đ°ợc
Nghĩa Áo Nó là một thực thể trong thế
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
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
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ß quÁn lý h¡n và có thể kiểm soá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){
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
Trang 25public class DemoJava {
public static void main(String[] args) {
HinhChuNhat HCN = new HinhChuNhat();
3.5 Phân bi ßt ccc kiऀu dư뀃 lißu c¡ bkn và đ÷i t°£ng
Có 8 kiểu dữ liáu nguyên thÿy (Primitive Data type) (c¡ bÁn) đó là: boolean, byte, char, short, int, long, float, double
Trang 26Kiểu dữ liệu đối t°ợng:
- 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
So sánh kiểu đối t°ợng và kiểu nguyên thủy:
- 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 nguyên 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 hợp với nhu c
- Một điểm khác biát chính giữa kiểu dữ liáu đái t°ợng và kiểu dữ liáu nguyên thÿy là tính chất tham chiếu và tham trị cÿa chúng
- Kiểu dữ liáu nguyên thÿy đ°ợc l°u trữ trong vwng nhớ cÿa máy tính và đ°ợc truyền theo c¡ chế tham trị (pass by value) trong các hàm và ph°¡ng thāc Khi chúng ta truyền một biến kiểu dữ liáu nguyên thÿy vào một hàm hoặc ph°¡ng thāc, một bÁn sao cÿa giá trị cÿa biến đó đ°ợc t¿o ra và đ°ợc truyền vào hàm Điều này có nghĩa là giá trị cÿa biến gác không bị thay đổi khi giá trị cÿa biến đ°ợc thay đổi trong hàm
Trang 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) {
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();
Trang 28Đá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",
Tham chi ếu đối t°ợng (Object Reference):
- 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"
3.7 C¡ chë ph攃Āp gcn và ccc ph攃Āp so scnh
Trong Java, c¡ chế phgp gán và các phgp so sánh đái t°ợng đều liên quan đến cách xử
lý tham chiếu đái t°ợng
Ph gp gán (Assignment):
- Phgp gán trong Java cho phgp gán giá trị cÿa một biến đến một biến khác hoặc gán một đái t°ợng đến một biến tham chiếu
- Khi gán một đái t°ợng cho một biến tham chiếu, thì chỉ có tham chiếu đến đái t°ợng
đó đ°ợc chuyển đi, không phÁi là bÁn chất cÿa đái t°ợng
Ví dụ:
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
Ph gp so sánh đối t°ợng (Object Comparison):
- 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
Trang 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 tượng
3.8 C¡ chë truyën tham s÷ và gic trß trk vë
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
Ví dụ:
public class Example {
public static void printNumber(int number) {
Ví dụ:
Trang 30public 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
Ví d ụ: 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
}
}
Giá trị trả về:
Một ph°¡ng thāc trong Java có thể trÁ về một giá trị với một kiểu dữ liáu cụ thể, hoặc
có thể không trÁ về giá trị nào (void)
Để trÁ về một giá trị, b¿n sử dụng từ khóa return trong ph°¡ng thāc và chỉ định giá trị muán trÁ về
Kiểu dữ liáu cÿa giá trị trÁ về phÁi phw hợp với kiểu đ°ợc khai báo cho ph°¡ng thāc Khi ph°¡ng thāc đ°ợc gọi, giá trị trÁ về có thể đ°ợc sử dụng cho các mục đích khác nhau nh° gán cho biến, sử dụng trong các biểu thāc, hoặc truyền làm tham sá cho các ph°¡ng thāc khác
Ví dụ:
public class Example {
// Phương thức truyền tham số
public static void printMessage(String message) {
public static void main(String[] args) {
// Gọi phương thức với tham số
printMessage("Hello, world!");
Trang 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
3.9 Tham chi ëu this
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 đó
Tham chiếu đến các tr°ờng và ph°¡ng thức của đối t°ợng hiện tạ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
Ví d ụ: 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
}
}
Truy cập các ph°¡ng thức khác của cùng một đối t°ợng:
Có thể sử dụng this để gọi một ph°¡ng thāc khác cÿa cwng một đái t°ợng
Ví d ụ: 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 ccode rõ ràng và dß đọc h¡n trong nhiều tình huáng
3.10 C cc đặc điऀm đặc thù ngôn ngư뀃 nh° thành viên static, package, tham s÷ dong lßnh
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
Trang 32Thành viên static:
- 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
Ví d ụ: 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()
}
}
Gói (Package):
- Trong Java, gói (package) là một cách để tổ chāc và quÁn lý các lớp và giao dián
- Một gói là một tÁp hợp các lớp liên quan đ°ợc đặt trong cwng một th° mục và đ°ợc sắp xếp theo cấu trúc th° mục há tháng t°¡ng āng
- Gói giúp tránh xung đột tên lớp, cung cấp tính tổ chāc, và kiểm soát quyền truy cÁp thông qua viác sử dụng các từ khóa nh° public, protected, private
Ví d ụ: package com.example.myproject;
public class MyClass {
// Thân lớp MyClass
}
Tham số dòng lệnh (Command Line Arguments):
- 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)
Ví d ụ: 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);
}
}
}
Trang 33Khi 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
3.11 Quan h ß composition giư뀃a ccc đ÷i t°£ng
Trong lÁp 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à quÁn lý b«i lớp chÿ
Ví d ụ: 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();
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
Trang 342 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)
H°ớng dẫn:
1 T¿o lớp HocSinh (Student) với các thuộc tính và ph°¡ng thāc phw hợp nh° đã mô tÁ trong bài tÁp
2 T¿o lớp ch°¡ng trình chính để thực hián các chāc năng sau:
- T¿o một đái t°ợng HocSinh (Student) mới
- 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
Tham khảo:
class HocSinh {
private String maHocSinh;
private String ten;
private int tuoi;
private double diemTrungBinh;
public HocSinh(String maHocSinh, String ten, int tuoi, double diemTrungBinh) {
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);
Trang 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);
}
}
Trang 364.1 Khci nißm kë thư뀀a
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
Lớp con (subclass) và lớp cha (superclass):
- 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
Từ khóa extends:
Để kế thừa từ một lớp khác, b¿n sử dụng từ khóa extends
Ví d ụ: class ChildClass extends ParentClass {
Ví d ụ: class ChildClass extends ParentClass {
@Override
public void someMethod() {
// Thân phương thức mới của lớp con
Ví d ụ: class ChildClass extends ParentClass {
public void someMethod() {
super.someMethod(); // Gọi phương thức của lớp cha
}
}
Trang 37Kế 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
4.2 Cài đặt quan hß thư뀀a kë trong Java
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
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:
Trang 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ó
4.3 Quyën truy nh⌀p và che dấu thông tin
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 phconstructor) 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:
Quyền truy cập (Access Modifiers):
Public (public): các thành phgãm từ bên ngoài lớp đó
Ví d ụ: public class MyClass {
public int publicField;
public void publicMethod() {
// Thân phương thức public
}
}
Private (private): các thành phcwng một lớp
Ví d ụ: public class MyClass {
private int privateField;
private void privateMethod() {
// Thân phương thức private
}
}
Protected (protected): các thành phtrong cwng một lớp, từ các lớp con, và từ các lớp trong cwng gói
Ví d ụ: public class MyClass {
protected int protectedField;
protected void protectedMethod() {
// Thân phương thức protected
}
}
Che dấu thông tin (Encapsulation):
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
Trang 39Trong 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)
Ví d ụ: public class Person {
private String name;
private int age;
// Getter và setter cho trường name
public String getName() {
// Getter và setter cho trường age
public int getAge() {
4.4 Thành viên final, constructor
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:
Thành viên final:
Biến final: một biến final không thể thay đổi giá trị sau khi đã đ°ợc kh«i t¿o
Ví d ụ: 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