Bài giảng Ngôn ngữ Java - Chương 3: Lập trình hướng đối tượng trong java - Phạm Duy Trung

Machine languages

• Chỉ gồm 0 và 1 – mã nhị phân

• Là ngôn ngữ “tự nhiên” với máy tính, liên hệ chặt chẽ với phần

cứng máy tính

• Độ khó lập trình: God level - chỉ đặt sai giá trị một bit có thể làm

sai tất cả chương trình.

• Ví dụ về ngôn ngữ máy:

00110010 00001110 00010010 00000000

duytrung.tcu@gmail.comAssembly languages

• Là một bước tiến để lập trình trở nên dễ hơn

• Bao gồm tập các câu lệnh cơ bản được xây dựng cho một bộ xử

lý cụ thể

• Mã Assembly cần được dịch thành mã máy để máy tính có thể

hiểu được

• Mỗi lệnh Assembly được ánh xạ 1-1 thành một chỉ dẫn NN máy

pdf 68 trang kimcuc 8880
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Ngôn ngữ Java - Chương 3: Lập trình hướng đối tượng trong java - Phạm Duy Trung", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Ngôn ngữ Java - Chương 3: Lập trình hướng đối tượng trong java - Phạm Duy Trung

Bài giảng Ngôn ngữ Java - Chương 3: Lập trình hướng đối tượng trong java - Phạm Duy Trung
LẬP TRÌNH HƯỚNG 
ĐỐI TƯỢNG TRONG JAVA
Lịch sử phát
triển của lập
trình
“Không có ngôn ngữ, chỉ có
dây và phích cắm”
Bắt đầu hoạt động vào năm
1946, ENIAC chiếm diện tích
hơn 167 𝑚2, nặng 27 tấn, 
không chỉ thực hiện được các
phép tính cơ bản, còn cho
phép chạy vòng lặp, rẽ nhánh
và các thủ tục con.
duytrung.tcu@gmail.com
Lịch sử phát triển của lập trình
• Lịch sử phát triển của lập trình chứng kiến sự từ bỏ cách lập
trình từ góc nhìn của máy tính để xây dựng những khái niệm và
nguyên lý phản chiếu (gần như) chính xác sự cảm nhận thế giới
thực của con người.
• Sự “tiến hóa” của ngôn ngữ lập trình
Machine 
language
Assembly 
languages
High-level 
languages
duytrung.tcu@gmail.com
Machine languages
• Chỉ gồm 0 và 1 – mã nhị phân
• Là ngôn ngữ “tự nhiên” với máy tính, liên hệ chặt chẽ với phần
cứng máy tính
• Độ khó lập trình: God level - chỉ đặt sai giá trị một bit có thể làm
sai tất cả chương trình.
• Ví dụ về ngôn ngữ máy:
00110010 00001110 00010010 00000000
duytrung.tcu@gmail.com
Assembly languages
• Là một bước tiến để lập trình trở nên dễ hơn
• Bao gồm tập các câu lệnh cơ bản được xây dựng cho một bộ xử
lý cụ thể
• Mã Assembly cần được dịch thành mã máy để máy tính có thể
hiểu được
• Mỗi lệnh Assembly được ánh xạ 1-1 thành một chỉ dẫn NN máy
• Ví dụ:
XOR CL, [12H]
duytrung.tcu@gmail.com
High-level languages
• Là một bước nhảy vọt trong lịch sử lập trình
• Cú pháp rất giống với ngôn ngữ tự nhiên của con người
• Trên quan điểm lịch sử, được phân chia làm 2 nhóm chính:
- Các ngôn ngữ hướng thủ tục / hướng cấu trúc (procedural)
- Các ngôn ngữ hướng đối tượng (object-oriented)
duytrung.tcu@gmail.com
Procedural languages
• Các ngôn ngữ bậc cao thời kỳ đầu là các ngôn ngữ hướng thủ
tục: C, COBOL, Fortran, LISP, PERL, HTML, VBScript
• Các ngôn ngữ loại này tập trung vào cấu trúc của một chương
trình: đặc trưng bởi các câu lệnh tuyến tính, chương trình xử lý
theo logic tuần tự từ trên xuống
duytrung.tcu@gmail.com
Procedural languages
duytrung.tcu@gmail.com
Object-oriented languages
• Mục tiêu của các ngôn ngữ hướng đối tượng không phải là cấu
trúc của chương trình, mà là mô hình hóa dữ liệu
• Lập trình viên sử dụng các “thiết kế” mô hình hóa dữ liệu gọi là
các lớp (class), từ đó sinh ra các đối tượng (object) có các
thuộc tính (attributes) riêng biệt và tác động nội ngoại thông
qua các phương thức (methods)
• Ví dụ ngôn ngữ: C++, VB .NET, C#, Java, Kotlin, Swift, Objective-
C
duytrung.tcu@gmail.com
Object-oriented languages
duytrung.tcu@gmail.com
Đối tượng (object) là gì?
• Object (n) a thing that could be seen and touched  (Oxford Dict)
• Tất cả những gì ta thấy xung quanh đều là đối tượng
• Trong sự vận động của thế giới, các đối tượng luôn tương tác với
nhau. Con người trong các công việc, hoạt động của mình cần
tương tác với vô vàn sự vật, hiện tượng khác
• Với yêu cầu “dạy” cho máy tính thực hiện công việc, cần tìm cách
mô tả quy trình con người làm công việc đó trên máy tính -> mô tả
các đối tượng tham gia công việc -> thế giới thực có thể được mô
tả lại chính xác thông qua tập hợp các “đối tượng” có tương tác
duytrung.tcu@gmail.com
Đối tượng thế giới thực
• 2 đặc tính của đối tượng thế giới thực: trạng thái và hành vi
Màu lông, 
cân nặng, 
tên, đói, 
buồn
Sủa
Vẫy
đuôi
Chạy
nhảy
Ăn
uống
duytrung.tcu@gmail.com
Đối tượng thế giới thực
duytrung.tcu@gmail.com
Mô tả đối tượng trong lập trình
duytrung.tcu@gmail.com
Mô tả đối tượng trong lập trình
• Mô tả trạng thái của đối tượng thông qua các trường / thuộc
tính (fields/attributes) -> các biến
- Hãng sản xuất - Lượng xăng
- Màu - Tốc độ hiện tại
• Mô tả hành vi của đối tượng thông qua các phương thức hành
động (methods) -> các hàm
- Khởi động() - Đổ xăng()
- Phanh() - Dừng()
Danh từ
Động từ
duytrung.tcu@gmail.com
Định nghĩa Lớp
• Lớp (Class) là một khuôn mẫu được sử dụng để mô tả các đối
tượng cùng loại
• Một lớp có tên xác định, chứa trong nó các thuộc tính và các
phương thức
• Mỗi đối tượng được tạo ra từ một lớp được gọi là một thực thể
(instance) của lớp đó
• Việc ấn định giá trị cho các thuộc tính và sử dụng các phương
thức sẽ tạo nên đặc trưng trạng thái và hành vi cho một đối
tượng cụ thể
duytrung.tcu@gmail.com
Lớp và Đối tượng
duytrung.tcu@gmail.com
Cú pháp khai báo Lớp
duytrung.tcu@gmail.com
Ví dụ về khai báo lớp
duytrung.tcu@gmail.com
Ví dụ về tạo đối tượng
• Từ khóa new được sử dụng để tạo đối tượng
• Biến emp chứa tham chiếu tới đối tượng
• Sử dụng toán tử (.) để truy xuất đến các thành viên của đối
tượng (trường và phương thức)
duytrung.tcu@gmail.com
Default Constructor
Định nghĩa phương thức
• Cú pháp: giống như viết hàm
• Phương thức có thể nhận không hoặc nhiều tham số đầu vào
• Phương thức có thể có kiểu trả về hoặc không (void)
• input() và output() trong class Employee
duytrung.tcu@gmail.com
Tạo phương thức
Xây dựng phương thức cho lớp Employee:
• setInfo(String, double): cho phép gán giá trị cho các
thuộc tính fullname và salary, không có kiểu trả về
• incomeTax(): trả về giá trị tiền thuế thu nhập dựa trên thuộc
tính salary của đối tượng
-salary < 5000000 : miễn thuế
-salary ≥ 5000000 : thuế bằng 10% lương
duytrung.tcu@gmail.com
Tạo phương thức
duytrung.tcu@gmail.com
Nạp chồng phương thức (overloading)
• Trong một lớp, có thể có nhiều phương thức cùng tên, miễn là
phân biệt với nhau về tham số (kiểu, số lượng, thứ tự)
duytrung.tcu@gmail.com
public class Employee{ 
void setInfo() {...} 
void setInfo(String val) {...} 
void setInfo(double val) {...} 
void setInfo(String val1, double val2){...} 
void setInfo(double val1, String val2){...} 
}
Nạp chồng phương thức (overloading)
duytrung.tcu@gmail.com
Hàm khởi tạo (Constructor)
• Là một phương thức đặc biệt: lấy tên của lớp và không có kiểu
trả về, dùng để tạo một thực thể từ lớp qua từ khóa new
• Tương tự như phương thức, có thể có nhiều constructor, mỗi
hàm cung cấp một cách khởi tạo đối tượng khác nhau
duytrung.tcu@gmail.com
Từ khóa “this”
• this được sử dụng để ám chỉ đối tượng hiện tại
• this được sử dụng trong lớp để tham chiếu đến các thành viên
trong lớp
duytrung.tcu@gmail.com
Hàm khởi tạo mặc định
• Khi lớp không được khai báo bất kỳ hàm khởi tạo nào, Java sẽ
sinh ra một hàm khởi tạo mặc định cho lớp đó
• Hàm khởi tạo này không có tham số (no-argument constructor)
• Hàm khởi tạo này sẽ đặt giá trị cho tất cả các trường chưa được
khởi tạo về giá trị mặc định của kiểu dữ liệu của trường đó
duytrung.tcu@gmail.com
public class Employee{
String fullname; double salary;
public Employee()
{
this.fullName = null;
this.salary = 0.0;
}
}
public class Employee{
String fullname; double salary;
public Employee()
{
}
}
public class Employee{
String fullname; double salary;
// không có hàm khởi tạo
}
Biến và phương thức của lớp
• Mỗi đối tượng có các giá trị ở các thuộc tính là khác nhau
• Nếu ta mong muốn tạo ra một biến số chung của lớp mà tất cả
các đối tượng đều có thể thấy và dùng? tương tự đối với
phương thức?
• Sử dụng từ khóa static trước biến và phương thức để khai
báo sở hữu của lớp, không phải của đối tượng
• Để gọi đến biến và phương thức của lớp, gọi
.
duytrung.tcu@gmail.com
Biến và phương thức của lớp
duytrung.tcu@gmail.com
I belong to the class Lion
Lions have 4 legs
I belong to a lion
I have 4 legs
Biến của lớp và biến của đối tượng
• Biến của lớp chỉ có 1 bản sao duy nhất thuộc về lớp, bất kể bao
nhiêu đối tượng được sinh ra từ lớp đó.
• Biến của lớp được tất cả các đối tượng dùng chung, được khai
báo static và thường phạm vi là public
• Biến của đối tượng, ngược lại, được sinh ra riêng cho mỗi một
đối tượng, thay đổi giá trị biến này trong đối tượng này không
ảnh hưởng gì đến giá trị biến cùng tên trong đối tượng khác
• Thường được khai báo private (Xem thêm Encapsulation)
duytrung.tcu@gmail.com
Từ khóa “final”
• Khi một lớp được khai báo final, lớp đó sẽ không có khả năng
được lớp khác kế thừa
• Khi một biến được khai báo final, biến đó sẽ trở thành hằng
số, do đó các biến static thường đi kèm với final, bởi biến
của lớp thường chứa các giá trị hằng số cho phép công khai
public static final double PI = 3.14;
• Khi một phương thức được khai báo final, phương thức đó sẽ
không thể bị ghi đè bởi phương thức khác
duytrung.tcu@gmail.com
Package
• Package là một tập hợp các class, interface, enum và
annotation có liên quan đến nhau
• Package được sử dụng để chống xung đột định danh, kiểm soát
truy cập, giúp tìm kiếm và sử dụng các class, interface, enum
và annotation dễ dàng và hiệu quả hơn
• Package có thể chứa nhiều package khác
• Các package của Java: package java chứa trong nó các
package java.util, java.lang, java.awt, java.sql, java.beans
duytrung.tcu@gmail.com
Package
• Khi tạo package, ta chọn tên cho package và phải đặt từ khóa
package đi kèm với tên này ở đầu các file code nào có các
class, interface, enum và annotation cần đưa vào package
• Mỗi một file source code chỉ chứa 1 câu lệnh package, và
thường là câu lệnh đầu tiên trong file
• Một kinh nghiệm là đặt tên package bằng chữ thường để tránh
xung đột với tên các thành phần package đó chứa
duytrung.tcu@gmail.com
Import package
• Khi 1 class gọi đến 1 class khác trong cùng package thì không
cần dùng đến tên package
• Để gọi đến 1 class ở package khác, có thể thực hiện theo 1 
trong những cách sau:
- Gọi đầy đủ tên package khi cần sử dụng: payroll.Employee;
- Sử dụng từ khóa import và dấu *: import payroll.*;
- Chỉ import đến class cần dùng: import payroll.Employee;
duytrung.tcu@gmail.com
Đặc tả truy xuất (Access modifier)
• Java cung cấp các từ khóa đặc tả truy xuất để kiểm soát phạm
vi truy cập cho các class, biến và phương thức
duytrung.tcu@gmail.com
Đặc tả truy xuất (Access modifier)
duytrung.tcu@gmail.com
class
Đặc tả truy xuất (Access modifier)
duytrung.tcu@gmail.com
Quy ước định danh trong Java
duytrung.tcu@gmail.com
Loại tên Quy ước
Class Bắt đầu bằng chữ hoa, là danh từ , ví dụ: String, Color, Button, System, Thread...
Interface Bắt đầu bằng chữ hoa, thường là tính từ, ví dụ: Runnable, Remote, ActionListener 
Phương thức Băt đầu bằng chữ thường, thường là động từ, ví dụ: actionPerformed(), main(),
print(), println()...
Biến Bắt đầu bằng chữ thường, ví dụ: firstName, orderNumber ...
Package Viết bằng chữ thường ví dụ: java, lang, sql, util ....
Constant Viết toàn bộ bằng chữ hoa. e.g. RED, YELLOW, MAX_PRIORITY etc.
duytrung.tcu@gmail.com
Bài tập
• Xây dựng lớp Hình tròn có một biến tĩnh tên PI là hằng số pi, 
một trường lưu bán kính của hình tròn, một hàm khởi tạo cho
phép khởi tạo bán kính của hình tròn, một phương thức tính
diện tích của hình tròn. 
duytrung.tcu@gmail.com
CÁC NGUYÊN LÝ CỦA OOP 
TRONG JAVA
Ưu điểm của OOP
• Tính tái sử dụng code
• Tính dễ bảo trì code
• Tính linh hoạt khi sử dụng đối tượng
• Tính mô đun hóa cao
• Tính bảo mật
duytrung.tcu@gmail.com
Các nguyên lý của OOP
• Encapsulation – Tính bao gói và che giấu dữ liệu
• Abstraction – Tính trừu tượng
• Inheritance – Tính kế thừa
• Polymorphism – Tính đa hình
duytrung.tcu@gmail.com
Encapsulation
• Bao gói các trường và phương thức vào trong một lớp như một
“hộp đen”: sử dụng mà không cần/được biết cơ chế bên trong
• Che giấu dữ liệu và che giấu cách thực hiện
• Kiểm soát truy cập thông qua các đặc tả truy xuất
 Quy định người sử dụng được làm gì và không được làm gì,
 Xây dựng phần giao tiếp tách biệt hoàn toàn với phần thực thi
duytrung.tcu@gmail.com
Encapsulation – che giấu dữ liệu
• Giả sử ta có lớp SinhVien và công khai họ tên và điểm như sau:
• Điều gì xảy ra nếu như người dùng tùy ý gán điểm âm hoặc
điểm lớn hơn 10?
duytrung.tcu@gmail.com
Encapsulation – che giấu dữ liệu
• Để che giấu dữ liệu, đặt phạm vi truy cập cho các trường là
private
• Người dùng chỉ có thể tương tác với các trường private thông
qua giao diện là các phương thức getter và setter kiểu như:
duytrung.tcu@gmail.com
duytrung.tcu@gmail.com
Encapsulation – che giấu dữ liệu
Abstraction – tính trừu tượng
• Một thực thể thế giới thực có thể có trạng thái và hành vi rất
phức tạp
• Tính trừu tượng nhấn mạnh vào việc lựa chọn những kiến thức
vừa đủ để mô tả thực thể trong một ngữ cảnh xác định, chứ
không cần phải liệt kê tất cả các thuộc tính, hành vi của nó
=> Tạo ra một phản chiếu trừu tượng của thực thể thực tiễn, 
người dùng chỉ cần biết đủ về đối tượng để sử dụng nó
duytrung.tcu@gmail.com
Abstraction – tính trừu tượng
• Ví dụ:
Mô tả đối tượng SinhVien để sử dụng cho một phần mềm quản lý
sinh viên. Sinh viên có rất nhiều thông tin và hành vi. Ta chỉ quan
tâm đến các thuộc tính như: tên, năm sinh, giới tính, ngành học, 
quê quán  chứ không cần quan tâm đến chiều cao, cân nặng, 
thói xấu, hát, nói, nhảy lò cò, đi chơi 
duytrung.tcu@gmail.com
Inheritance – Tính kế thừa
• Là nguyên lý then chốt cho phép tái sử dụng và bảo trì code 
trong Java
• Khi đã tồn tại một lớp có nhiều đặc điểm mà ta mong muốn, ta 
có thể kế thừa lớp đó để tạo nên lớp mới để không phải viết (và
cả debug!) lại các trường và phương thức chung nữa
• Trong Java, lớp mà kế thừa từ lớp khác được gọi là subclass
(lớp con), còn lớp được kế thừa gọi là superclass (lớp cha)
• Theo cây phân cấp, tất cả các lớp đều là “hậu duệ” của lớp
Object trong package java.lang
duytrung.tcu@gmail.com
Inheritance – Tính kế thừa
• Java chỉ cho phép đơn thừa kế (single inheritance)
• Lớp con sẽ được sở hữu các tài sản từ lớp cha:
- Các tài sản public hoặc protected
- Các tài sản default nếu lớp con và lớp cha thuộc cùng package
• Lớp con không truy cập được các tài sản private của lớp cha
• Lớp con không kế thừa các hàm khởi tạo của lớp cha
duytrung.tcu@gmail.com
Sử dụng “super”
• Truy cập đến các thành viên của lớp cha bằng cách sử dụng từ
khóa super
• Có thể sử dụng super để gọi hàm
khởi tạo của lớp cha
duytrung.tcu@gmail.com
Sử dụng “super”
duytrung.tcu@gmail.com
Animals can move
Dogs can walk and run
Ghi đè phương thức – Overriding 
• Overriding được thực hiện khi lớp con và lớp cha có phương
thức cùng cú pháp
• Lớp Child và Parent đều có phương thức method() cùng cú
pháp nên method() trong Child sẽ ghi đè lên method() trong
Parent
• Sử dụng từ khóa super để truy cập đến phương thức bị ghi đè
của lớp cha
duytrung.tcu@gmail.com
Ghi đè phương thức – Overriding 
duytrung.tcu@gmail.com
Animals can move
Dogs can walk and run
Lưu ý khi ghi đè phương thức
• Danh sách đối số giữa 2 PT phải giống nhau
• Kiểu trả về phải tương thích với kiểu trả về của PT gốc (chính
kiểu đó hoặc kiểu con của kiểu đó)
• Phạm vi truy cập của của PT ghi đè không được nhỏ hơn
phương thức gốc
• Không thể ghi đè lên PT được khai báo final
• Không thể ghi đè lên hàm khởi tạo
• Nên sử dụng chỉ dẫn @Override đặt trước PT ghi đè
duytrung.tcu@gmail.com
Lớp trừu tượng
• Nhiều trường hợp, ta cần tập trung mô tả ý tưởng, cách tổ chức hơn
là cách thực thi
- Đã là hình thì sẽ có diện tích và chu vi, nhưng tính thế nào còn phụ thuộc xem hình là
tam giác, chữ nhật mới có thể xác định cụ thể;
- Ai trong công ty cũng có thu nhập, nhưng để tính được thu nhập cần biết được chức
vụ, số ngày công, chế đô chính sách với từng nhóm người;
• Lớp trừu tượng là lớp có các hành vi chưa được xác định rõ ràng
• Lớp Hình và lớp Nhân viên là các lớp trừu tượng vì các phương thức
tính chu vi, diện tích và tính điểm chưa được xác định cụ thể
duytrung.tcu@gmail.com
Lớp trừu tượng
Hình
Chữ nhật
Vuông
Tam giác Tròn
duytrung.tcu@gmail.com
Viên chức
Nhân viên Trưởng phòng Giám đốc
Từ khóa “abstract”
• Một lớp được khai báo kèm từ khóa abstract sẽ trở thành
một lớp trừu tượng
• Một phương thức được khai báo kèm từ khóa abstract sẽ trở
thành một phương thức trừu tượng
duytrung.tcu@gmail.com
Tính chất của lớp và PT trừu tượng
• Một PT trừu tượng không có phần thân hàm
• Một lớp trừu tượng có thể không có PT trừu tượng nào
• Tuy nhiên, một khi đã chứa một PT trừu tượng thì bắt buộc phải
khai báo lớp đó là abstract
• Không thể tạo đối tượng từ lớp trừu tượng
• Để sử dụng lớp trừu tượng, phải kế thừa nó ở 1 lớp khác. Lớp kế
thừa phải cung cấp phần thân hàm (thực thi) cho tất cả các PT 
trừu tượng trong lớp trừu tượng được kế thừa
duytrung.tcu@gmail.com
Nội dung tự tìm hiểu
• Tìm hiểu về interface trong Java
• Ý tưởng đa thừa kế được thực hiện thông qua interface được
không? Nếu được cho một ví dụ
• So sánh giữa abstract class và interface
duytrung.tcu@gmail.com
Bài tập
• Tạo lớp trừu tượng Hình với 2 phương thức tính chu vi và diện tích, sau đó xây
dựng các lớp Chữ nhật, Tròn, Tam giác kế thừa lớp Hình. Thêm thuộc tính cho
phù hợp với mỗi lớp và hoàn thiện 2 phương thức trên ứng với mỗi loại hình.
• Tạo lớp trừu tượng Viên chức với 2 thuộc tính là tên và hệ số lương theo tháng và
PT tính thu nhập theo năm. Xây dựng các lớp Nhân viên, Trưởng phòng và Giám
đốc kế thừa lớp Viên chức. Hoàn thiện phương thức tính thu nhập, biết:
- Hệ số lương của Nhân viên là 3.5, Trưởng phòng là 5.0, Giám đốc là 8.0, lương cơ bản là
1.500.000đ. 
- Trưởng phòng và Giám đốc có thêm hệ số trách nhiệm lần lượt là 1.0 và 3.3 theo tháng
- Tính thu nhập theo năm thì Nhân viên, Trưởng phòng và Giám đốc lần lượt được thưởng thêm
1, 2 và 3 tháng lương không kèm trách nhiệm
duytrung.tcu@gmail.com
Polymorphism – Tính đa hình
• Tính đa hình ám chỉ việc một thực thể, một hành động có thể
được biểu hiện theo nhiều dạng khác nhau
• Có hai loại đa hình trong Java: đa hình trong phase biên dịch
(compile time) và đa hình trong phase chạy (run time)
• Đa hình trong phase biên dịch: nạp chồng phương thức
(method overloading)
• Đa hình trong phase chạy: ghi đè phương thức (method 
overriding)
duytrung.tcu@gmail.com
Runtime polymorphism
• Việc gọi đến phương thức ghi đè được thực hiện khi chương
trình đã chạy.
• PT này được gọi thông qua biến tham chiếu của lớp cha, việc
xác định PT phù hợp phụ thuộc vào đối tượng được biến tham
chiếu trỏ đến.
duytrung.tcu@gmail.com
Runtime polymorphism
duytrung.tcu@gmail.com
Tổng kết nội dung bài học
• Đặc điểm ngôn ngữ hướng đối tượng
• Khái niệm object
• Class trong Java
• Các nguyên lý cơ bản của lập trình hướng đối tượng
duytrung.tcu@gmail.com
Yêu cầu về nhà
• Ôn bài, tham chiếu với các nguồn tài liệu tham khảo
• Chạy các ví dụ trong bài, tìm và chạy các ví dụ trong các tài liệu
• Làm bài tập và tự tìm hiểu nội dung đã yêu cầu
• Tìm hiểu trước về exception trong Java
duytrung.tcu@gmail.com

File đính kèm:

  • pdfbai_giang_ngon_ngu_java_chuong_3_lap_trinh_huong_doi_tuong_t.pdf