Tải bản đầy đủ (.docx) (21 trang)

Kiến thức Java core cần để học Java back end

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 (677.34 KB, 21 trang )

JAVA CORE
1. OOP trong Java
OOP hay lập trình hướng đối tượng là một concept lập trình dựa trên Class (Lớp) và Object (Đối
tượng) các đối tượng được tạo ra từ các lớp và thỏa 4 tính chất: tính đóng gói, tính đa hình, tính kế
thừa, và tình trừu tượng

A. Các khái niệm cơ bản
1. Lớp và Đối tượng (Class and Objcet)
o Object (đối tượng) được hiểu như là một thực thể mà nó có hành vi và trạng thái. Ví
dụ: Một sinh viên có trạng thái như họ tên ngày sinh, hành vi là đang đi học hoặc đi
làm
o Class (Lớp) là tập hợp những đối tượng giống nhau có cùng hành vi và trạng thái.
Một class được biểu thị như sau trong Java:

Trong đó:
-

Public : là phạm vi truy cập
Student: là tên Class
name, age: là các thuộc tính (attribute) hay đó chính là trạng thái
display: là phương thúc để hiện thị tên tuổi hay chính là hành vi

Cách khai báo 1 object như sau:

Trong đó:
2.
-

-

AStudent là tên object


New Student() dùng để khai báo cho object đó
Constructor (Hàm khở tạo)
Constructor là một hàm đặc biệt nó sẽ khơng có kiểu trả về cũng khơng có giá trị trả về, cùng
tên với class và có phạm vi truy cập là public. Thơng thương nếu ko tạo Constructor thì khi
khai báo mọt object thì nó sẽ tự động khởi tạo một Constructor rỗng.
Một Class có thể có nhiều Constructor với các tham số khác nhau, nhưng khi khai báo object
mỗi object chỉ có thể khởi tạo được 1 Constructor tùy thuộc vào số tham số truyền vào


-

Công dụng: Constructor thường dùng để đặt giá trị mặc định khi khai báo 1 object, được ứng
dụng để khởi tạo giá trị cho các attribute theo tính đóng gói
3. Phạm vi truy cập (Access Modifier)
Trong java có 4 loại phạm vi truy cập:
-

Public: có thể truy cập được từ bất cứ đâu, nhưng nếu truy cập class từ package khác (ngang
hàng) thừ phải import package đó vào
- Protected: truy cập được các class cùng package và cả những lớp của các package con
- Default: kiểu truy cập mặc định nếu ko đc khai báo, chỉ truy cập đc cái class cùng package
- Private: chỉ truy cập được bên trong class (dùng để đảm bảo tính bảo mật của dữ iệu, áp
dụng cho tính đóng gói
4. Static và final
*Từ khóa static:
-

-

-


Từ khóa static được dùng để quản lý bộ nhớ có thể được dùng với phương thức, thuộc tính
và cả lớp. Từ khóa static thuộc về lớp chứ ko thuộc về các đối tượng của lớp
Đặc điểm của static:
o Được cấp phát vùng nhớ duy nhất 1 lần khi biên dịch chương trình, ra đời trước tiên
nhất trước cả các đối tượng
o Được dùng chung cho các đối tượng
Biến tĩnh (Static Variable) : là biến được khởi tạo với từ khóa static, nó sẽ được khởi tạo ngay
trong lớp và được dùng chung cho các đối tượng. Nó tương tự như hằng số nhưng linh hoạt
hơn ta có thể thay đổi giá trị khi cần thiết
Phương thức tĩnh (Static Method): là phương thức được khởi tạo với từ khóa static. Các
phương thức được khai báo static không thể gọi phương thức hay thuộc tính khơng được
khai báo static. Lý do là vì các phương thức tĩnh ra đời trước các thuộc tính, phương thức
thơng thường nên chúng chưa thấy được các phương thức thơng thường khác .

*Từ khóa final:
-

Từ khóa final được sử dụng để hạn chế thao tác của người dùng hay nói cách khác là khai
báo hằng số
Biến final: có thể khai báo kèm với từ khóa static và nó có duy nhất 1 giá trị trong tồn bộ
chương trình
Phương thức final: là phương thức có từ khóa final và nó khơng thể bị ghi đè
Lớp final: là lớp có từ khóa final và lớp này khơng thể được kế thừa

B. Tính đóng gói trong java (Encapsulation)
-

-


-

Trong thực tế các thuộc tính của Class sẽ được che dấu khỏi bên ngồi để đảm bảo tính bảo
mật, cũng như hạn chế những truy cập không được phép, việc che dấu thơng tin, dữ liệu
như vậy được gọi là tính đóng gói
Các bược thực hiện tính đóng gói:
o Khai báo phạm vi truy cập là private cho các thuộc tính
o Cung cấp các setter/getter để truy cập đến thuộc tính (setter khác với Constructor ở
chổ là Constructor được dùng để khởi tạo, khi muốn thay đổi thì dùng đến setter
Lý do dùng tới tính đóng gói:
o Khi dữ liệu thơng tin đc public thì rất dễ bị làm sai lệch khơng đáng có
o Tránh được việc xung đột
o Hạn chế truy cập không được phép
o Khi thay đôi cấu trúc các thuộc tính thì ít ảnh hưởng đến các kiến trúc khác....


-

Ví dụ:

C. Tính Kế thừa (Inheritance)
-

-

Trong OOP 1 lớp có thể được kế thừa lại các phương thức thuộc tính của lớp khác. Ví dụ:
class B kế thừa class A. Trong trường hợp này class A đgl “lớp cơ sở” hoặc “lớp cha”, class B
đgl “lớp kế thừa” hoặc “lớp con”
Mọi thuộc tính phương thức khơng phải private trong lớp cha thì lớp con đều được kế thừa
VD:


Trong đó từ khóa extends được dùng để chỉ lớp cha trực tiếp được kế thừa
-

Lọi ích của tính kế thừa:
o Lớp con có thể tận dụng những thuộc tính phương thức chung của lớp cha
o Lớp con có thể tự định nghĩa lại (ghi đè, overriding) các phương thức của lớp cha,
tạo cho nó cái riêng tùy mục đích

*Từ khóa super:
-

Super là từ khóa dùng để từ lớp con truy cập được tới các thuộc tính phương thức, và cả
hàm tạo của lớp cha
Truy cập đến phương thức, thuộc tính:
o Super sẽ được dùng khi có thuộc tính phương thức cùng tên ở lớp cha và con nhưng
nó có giá trị hoặc thực hiện 2 nhiệm vụ khác nhau
o Muốn gọi tơi thuộc tính phương thức của lớp con thì đứng tại lớp con và gọi
o Muốn gọi tới thuộc tính phương thức của lớp cha thì dùng từ khóa super


-

Truy cập đến hàm tạo ( super( ) )
o Được dùng để truy cập đến Constructor của lớp cha, và chỉ được dùng trong
Constructor của lớp con
o Được dùng khi khởi tạo Constructor cho lớp con mà lớp con ngoài các thuộc tính của
lớp cha có thêm các thuộc tính khác

D. Tính đa hình (Polymorphism)

-

Tính đa hình hiểu đơn giản chỉ là phương thức nhưng có thể có nhiều tác dụng khác nhau tùy
thuộc vào ngữ cảnh của nó
Để có tính đa hình cần :
o Phải có quan hệ kế thừa với 1 lớp cha
o Ở lớp con phải có phương thức ghi đè lên lớp cha (overriding). Tính đa hình chỉ được
thể hiển khi đã ghi đè lên lớp cha

E. Tính trừu tượng (Abstraction)
-

-

-

Hiểu đơn giản tính trừu tượng chỉ là ta khai báo những phương thức mặc định sẽ có khi một
lớp con kế thừa từ lớp cha nó khác với tính đa hình.
Tính đa hình thì 1 phương thức có thể có nhiều chức năng nhưng với tính trừu tượng thì mỗi
đối tượng được tạo ra thơng qua lớp trừu tượng sẽ phải bắt buộc khai báo phương thức
trừu tượng và chỉ có một chức năng duy nhất trong đối tượng đó
Ví dụ : điện thoại di động thì sẽ phải mặc định có thể nghe gọi, nên dù là smart phone, hay đt
cục gạch thì vẫn phải có chức năng nghe gọi. Nghe gọi đó chính là 1 phương thức trừu tượng
Tác dụng của tính trừu tượng:
o Tránh được việc khai báo thiếu xót chức năng cho đối tượng
o Giúp tập trung vào chức năng cần có chưa phải đi sâu vào cách nó thực hiện ntn
o Giúp dễ dàng bảo trì quản lý hệ thống
o Cung cấp nhiều tính năng mở rộng với tính đa hình và tính kế thừa
Khai báo:
o Abstract methods (phương thức trừu tượng): là một phương thức chỉ có tên chứ

khơng có cặp dấu { } và đoạn code, được dùng để khai báo ra phương thức trừu
tượng mà class con khi kế thừa bắt buộc phải overriding lên


Ở ví dụ trên khi một class con được kế thừa từ class này sẽ bắt buộc phải có phương
thức test() ghi đè lên
o

Abstract class (Lớp trừu tượng) chỉ là một lớp có các phương thức trừu tượng với từ
khóa abstract đứng trước tên class
 Nếu 1 lớp là lớp trừu tượng thì ta khơng thể tạo object trực tiếp từ nó mà
phải thơng qua 1 class khác kế thừa từ class trừu tượng
 Một class trừu tượng có thể có hoặc khơng có phương thức trừu tượng
 Class trừu tượng khơng cần có phương thức khởi tạo
 Một khi lớp khác đc kế thừa từ class trừu tượng phải bắt buộc ghi đè lên các
phương thức trừu tượng

F. Interface trong javaa
-

Interface là một dạng class chỉ chứa những hằng số, phương thức trừu tượng
Khai báo interface

-

Trong interfact thì các thuộc tính mặc định sẽ là hằng số (khơng cần từ khóa static final)và
các phương thức ln là phương thức trừu tượng (ko cần từ khóa abstract)
Một class khi kế thừa interface sẽ được gọi đang implements
Một class có thể implements nhiều interface khác nhau, các interface có thể kế thừa nhau


-

*Điểm khác nhau giữa Interface và abstract:
Interface
Interface là một class đặc biệt (giống như một
class để biểu thị module) nó chỉ chứa các hằng
số và các phương thức trừu tượng
Khi một class con kế thừa thì nó sẽ implements
(mở rộng phương thức trừu tượng)
Một class có thể implement nhiều interface
khác nhau

Abstract
Tương tự như một class bình thướng, nó vừa có
các thuộc tính phương thức bình thường, vừa
có các phươg thức trừu tượng
Khi một class con kế thừa thì nó sẽ override (ghi
đè phương thức trừu tượng)
Một class chỉ có thể extends được duy nhất
một class abstract

2. Java Collection Framework
A. Khái niệm cơ bản
-

-

Java collection framework là một frame work cung cấp các phương pháp để lưu trữ dữ liệu
dưới dạng danh sách. Nó có nhiều ưu điểm hơn so với mảng như có kích thước có thể thay
đổi, dễ dàng thêm sửa xóa

Cấu trúc của JCF:


Trong đó:
-

Interable Interface: là root interface của collection class
Collection Interface: là interface định nghĩa cho mọi class khác trong framework. Nó khai báo
các phương thức mà mọi collection đều có
List Interface: là 1 collection và các phần tử trong list được sắp xếp có thứ tự và có thể có giá
trị giống nhau
Set Interface: Là 1 collection và không thể có 2 phần tử có cùng giá trị
Map Interface: Là 1 collection mà cá phần từ là 1 cặp value và key (giống object bên js)

B. Stack và Queue
1. Stack
- Stack là lớp mở rộng từ class Vector, nó sẽ chứa dữ liệu dưới dạng FILO (First-in , Last-out).
Giống như một túi đồ khi bỏ đồ vào thì cái nào bỏ trước sẽ xếp dưới cùng, bỏ dần lên, đến
cái cuối cùng sẽ ở trên nhất, và khi lấy thì sẽ lấy từ cái trên nhất xuống
- Stack có 2 phương thức chính là
o push() : để thêm phần tử theo nguyên tắc của stack (từ đầu mảng)
o pop() : lấy phần tử ra theo nguyên tắc của Stack (từ đầu mảng)

2. Queue
- Queue một trong những interface collection, dạng queue được sd nhiều nhất là LinkedList
- Queue lưu trữ dữ liệu dưới dạng FIFO (First-in, First-out) giống như là một túi 2 chiều, thêm
vào sau và lấy ra từ trước


-


Trong Java thì có 2 methods chính với Queue:
o Offer() : thêm phần tử theo nguyên tắc của Queue (thêm từ sau mảng)
o Poll() : lấy phần tử theo nguyên tắc Queue (lấy từ đầu mảng)

*Dequeue : là một quêu nhưng có 2 đầu có thể thêm vào đầu hoặc cuối lấy ra từ đầu hoặc cuối
o

Trong dequeue do có 2 đầu nên có thêm methods addFirst/Last() và
removeFirst/Last()

*PriorityQueue: là một class kế thừa từ Queue Interface là một queue nhưng khi giá trị đưa vào nó
được sắp xếp theo 1 ưu tiên nào đó

C. List Interface
-

List Interface tương tự như 1 mảng nhưng nó có thể thay đổi kích thước
List Interface có một số phương thức như sau:

add(o)
add(i,o)
addAll(list)

Thêm phần tử o vào cuỗi mảng
Thêm phần tử o vào vị trí i của mảng
Chèn tất cả phần tử của list này vào cuỗi lits kia
nếu cả 2 đều cùng kiểu dữ liệu
Trả về phần tử ở vị trí i
Xóa phần tử ở vị trí i

Xóa phần tử o
Xóa tất cả phần tử khỏi mảng
Set phần tử ở vị trí i thành o
Tìm kiếm phần tử o , trả về true or false

get(i)
remove(i)
remove(o)
clear()
set(i,o)
contains(o)
indexOf(o) , lastIndexOf(o),…....
toArray()
Chuyển sang list sang mảng
1. ArrayList
- ArrayList là class được triển khai từ List Interface. ArrayList được sư dụng như một mảng
động để lưu trữ các phần tử
- Đặc điểm:
o Lớp ArrayList có thể chứa phần tử trùng lập
o Lớp ArrayList duy trì thứ tự của phần tử
o Lớp ArrayList không đồng bộ
o Lớp ArrayList cho phép truy cập ngẫu nhiên vì nó lưu phần tử theo chỉ mục
o Lớp ArrayList chậm
- Khai báo: phải import thư viện java.util.ArrayList


-

Trong đó:
o Java.util.ArrayList : là thư viện để khai báo

o ArrayList : để khai báo ArrayList
o <String> : để khai bảo kiểu dử liệu của các phần tử trong ArrayList có thể là kiểu dử
liệu thơng thừa cũng có thể là class
o danhSachTenSV : là tên ArrayLisst
o (10) : là kích thước ban đầu của ArrayList (có thể có hoặc không), hoặc collection
khác muốn biến thành ArrayList
- Để làm việc với ArrayList ta cũng sử dụng vòng for như với mảng
2. LinkedList
- LinkedList là Class được kế thừa từ cả List Interface và DeQueue Interface
- Hiểu đơn giản LinkedList là một mảng mà mỗi 1 node có chứa 2 giá trị: 1 là giá trị của phần
tử đó, 2 là con trỏ chỉ tới địa chỉ của phần tử tiếp theo. Nếu con trỏ chỉ tới null nghĩa là đó là
phần tử cuối cùng của mảng.
- Có 2 loại LinkedList:
o Singly LinkedList: là LinkedList bình thường mỗi 1 node có 2 phần : 1 là giá trị 2 là con
trỏ chỉ tới node tiếp theo
o Doubly LinkedList: LinkedList mà mỗi Node có 3 thành phần: 1 là giá trị, và có 2 con
trỏ ; một chỉ tới node trước ; một chỉ tới node tiếp theo
- Khai báo: (tương tự như ArrayList)

-

-

-

Trong đó:
o Import java.util.LinkedList : là khai báo thư viện
o LinkedList: là từ khóa tạo linkedList
o <String> : kiểu dử liệu của các phần tử trong list
o () : kích thước nếu có, hoặc là collection khác thành LinkedList

Ưu điểm của LinkedList:
o Vì các Node liến kết với nhau qua địa chỉ nên mỗi node nằm ở một vị trí ngẫu nhiên
khơng cần mội chuỗi bộ nhớ liên tục như ArrayList hay mảng nên sẽ tiết kiệm được
bộ nhớ
o Dễ dàng để thêm hoặc xóa Node vì chỉ cần thay đỉa chỉ của con trỏ (O(1)), không cần
phải dời vị trí các phần tử khác như mảng
Nhược điểm
o Vì lí do trên nên LinkedList khơng thể truy cập ngẩu nhiên mà phải truy cập tuần tự
từ đầu
o Môi phần tử tốn nhiều bộ nhớ hơn


-

o Khó khăn trong việc tìm kiếm và truy cập
Một số phương thức của LinkedList:

getFirst()
getLast()
removeFirst/Last()
removeAll()
push()
offer()
poll( )
pop()
*Khi nào dùng ArrayList khi nào dùng LinkedList:
-

Lấy phần tử đầu tiên
Lấy phần tử cuối cùng

Xóa phần tử đầu / cuối
Xóa tất cả phần tử
Dùng với tính chất list thêm vào vào đầu
Dùng với tính chất queue thêm vào sau
Dùng với tính chất queue lấy ra thằng đầu
Dùng với tính chất list xóa bỏ phần đầu

ArrayList cho phép truy cập ngẫu nhiên nên nếu nhu cầu truy xuất và tìm kiếm nhiều thì dùng
ArrayList, cịn LinkedList dễ dàng thêm sửa xóa, nên nếu nhu cầu thêm sửa xóa nhiều thì
dùng LinkedList

D. Set Interface
-

Set interface là một interface collection, dữ liệu được lưu trong set sẽ khơng có 2 phần tử
giống nhau và khơng xếp theo trình tự, các phần tử trong set là duy nhất
Set có một số phương thức:

add(o)
add(i,o)
addAll(list)

Thêm phần tử o vào cuỗi mảng
Thêm phần tử o vào vị trí i của mảng
Chèn tất cả phần tử của set này vào cuối set kia
nếu cả 2 đều cùng kiểu dữ liệu
Trả về phần tử ở vị trí i
Xóa phần tử ở vị trí i
Xóa phần tử o
Xóa tất cả phần tử khỏi mảng

Set phần tử ở vị trí i thành o
Tìm kiếm phần tử o , trả về true or false
Kiểm tra xem c có phải là set con hay khơng
Tìm ra các phần tử chung của 2 set
Loại bỏ tất cả phần tử giống nhau
Chuyển sang list sang mảng

get(i)
remove(i)
remove(o)
clear()
set(i,o)
contains(o)
containsAll(c)
retainAll(c)
removeAll(c)
toArray()
1. Hash Set
- HashSet là một class triển khai từ set interface, các giá trị trong HashSet không dựa theo thứ
tự lúc thêm vào và có giá trị là duy nhất
- Trong HashSet có 2 hệ số quan trọng làm ảnh hưởng đến hiệu xuất và bộ nhớ của HashSet
là : Initial capacity (dung lượng khởi tạo) và load factor (hệ số tải)
o Kích thước của một HashSet là lượng bucket trong HashSet (bucket là nơi ta lưu trữ
giá trị các phần tử của HashSet). Khi khởi tạo mặc định HashSet có kích thước là 2^4
= 16, nó sẽ tự động tăng lên gấp đôi khi đạt đến ngưỡng (tăng lên 32,64,128...)
o Hệ số tải : là hệ số dùng để tính ngưỡng mà tại đó kích thước của HashSet sẽ được
tăng lên gấp đơi (mặc định là 0.75f)
o CT tính ngưỡng của HashSet: Ngưỡng = current capacity * load factor
o VD: Giả sử 1 HashSet được khởi tạo với kích thước ban đầu là 16 và yếu tố tải là 0.75
thì ngưỡng của HashSet này sẽ = 16 * 0.75 = 12. Con số 12 này có nghĩa là kích thước

của HashSet này sẽ tăng từ 16 lên 32 sau khi phần tử thứ 12 được thêm vào trong
HashSet đó.


-

Khai báo:

2. TreeSet
-

TreeSetlà một class triển khai từ set interface, các giá trị trong TreeSet là duy nhất và được
sắp theo thứ tự từ tăng dần (như các nhánh cây)

-

Khai báo: giốn HashSet chỉ thay từ khóa

E. Map Interfae
-

Map là một collection nó sẽ lưu trữ dữ liệu dưới dạng entry chính là 1 cặp key value (giống
object js). Các key khơng thể trùng nhau nên có thể dùng set để lưu key, các value có thể
trùng nhau

-

Một số phương thức của map:

entrySet()

keySet()
values()
put(k , v)
get(k)
remove(k)

Lấy tất cả các entry của Map lưu vào một
HashSet hoặ TreeSet
Lấy tất cả các keycủa Map lưu vào một HashSet
hoặ TreeSet
Lấy toàn bộ values trong Map
Thêm phần tử vào map với key k và value là v
Lấy ra values có key là k
Xóa phần tử có key là k (xóa cả key lẫn value)


replace(k,v)
Thây thế value của key k bằng value v mới
1. HashMap
- HashMap là một class được triển khai từ Map Interface, nó là một map nhưng các phần tử
khơng xếp theo thứ tự khi truyền vào
- Khai báo:

2. TreeMap
- TreeMap là một class được triển khai từ Map Interface, nó là một map nhưng các phần tử
xếp theo thứ tự tăng dần của key
- Khai báo: tương tự HashMap mà thay từ khóa

3. Generics
-


-

-

Generics trong java là một khái niệm được thêm vào từ java 5. Được hiểu là tham số hóa
kiểu dữ liệu. Hay hiểu đơn giản là tham số hóa kiểu dữ liệu, kdl như một tham số khi dùng
đến
Tác dụng:
o Dễ dàng bắt được các kdl không hợp lệ
o Giúp khai báo khái quát các class, interface, methods. Một class hoặc hàm nhận
được nhiều tham số đầu vào có thể được viết một cách khái quát bằng generics
Ví dụ:


-

Trong đó: ArrayList có thể nhận được nhiều kdl khác nhau trong cặp dấu < > và kdl được viết
hoa chữ cái đầu
Một sớ quy ước trong Generics

A. Class Generics
- Để tạo một class generics ta thêm cặp dấu < > vào sau tên class

-

Vì T được xem như một kiểu dử liệu nên được sử dụng trong class như một kiểu dữ liệu
Khai báo object của class generics:

-


Thừa kế 1 class generics:


B. Methos Generics
- Để tạo một methods generics ta thêm < > vào trước kiểu trả về của methods:

-

Lưu ý: thêm từ khóa static
Có thể dùng T để làm kiểu trả về cho methods:

4. Multithreading In Java
-

Multithreading là đa luồng dữ liệu trong java, một ứng dụng được gọi là đa luồng nếu nó có
2 luồng trở lên chạy song song với nhau. Đa lương giúp ứng dụng thực hiện được nhiều cơng
việc trong cùng một lúc

-

Có 2 cách dùng multithreading trong java

-

o

Extends class Thread :

o


Implements từ Runable Interface:

Cả 2 cách đều mang lại tác dụng như nhau chỉ khác 1 vài điểm:


o

Nếu extends class Thread thì class đó ko thể kế thừa class nào nửa, cịn implement
từ Runable vẫn có thể kế thừa từ lớp khác

o

Khi dùng phương thức start thì class extends Thread có thể dùng trực tiếp, nhưng khi
implement từ Runable phải đổi kiểu sang Thread vì start() là method của Thread

-

Code mỗi thread sẽ được chạy trong hàm run( ). Để gọi tới ta dùng methods strart() cho
object:(ví dụ dưới có dùng ép kiểu bởi vì class multithreading_demo là interface từ Runable)

-

Lưu ý: việc các luồng chạy được quy định bởi java nó sẽ ngẫu nhiên cho mỗi lần chạy nên
java cũng cung cấp 1 số phương thức để quản lý các luồng

*Một số method quản lý luồng chạy
1. Đồng bộ hóa đa luồng (synchronized)
-


Được dùng để khi sắp xếp các luồng khi truy xuất vào một đối tượng sao cho khơng có xung
đột dữ liệu. Tại một thời điểm chỉ có một luồng được thực thi. Chỉ khi nào luồng này kết thúc
thì luồng khác mới được thực hiện

-

Syntax: thêm từ khóa synchronized vào trước kiểu trả về và sau phạm vi

-

Tham khảo thêm tại: />
2. join() và sleep()
-

sleep() là phương thức để làm luồng ngủ trong khoảng n miligiay (nó phải nằm trong cặp
try..catch) (phương thức này dùng cho class)
o

-

Ví dụ:

join() là phương thức để tạm dừng tất cả các thread đến khi thread này được hồn thành,
tránh các thread khác làm xung đột. Nói dễ hiểu là đóng băng các thread đến khi thread này
hồn thành (phương thức này dùng cho object)


o

Ví dụ:


5. Exceptions
-

Exceptions là những trường hợp ngoại lệ, là những trường hợp làm cho chương trình bị lỗi bị
sai, nó thường xuất hiện trong q trình chương trình thực thi 1 câu lệnh nào đó, khi xuất
hiện nó sẽ làm ngừng luồng hoạt động của chương trình

-

Ví dụ:
o

Cho a/b nhưng b lại bằng 0

o

Truy cập đến phần tử lớn hơn kích thước mảng

o

Truy cập đến phần tử của mảng null....

A. Try ...catch
-

Try...catch được dùng để xử lý ngoại lệ:
o

Syntax:


-

Try block: là khối để chứa code mà nghi ngờ sẽ xuất hiện exceptions

-

Catch block : là khối sẽ được thực hiện nếu có exception

-

Có thể có nhiều Catch block theo sau try block, mỗi block sẽ thực thi cho 1 exception cụ thể
nào đó, và sẽ có một catch block nhận exception chung nhất nằm ở cuối
o

Ví dụ:


o

Mỗi catch sẽ thực thi 1 exception và catch cuối cùng sẽ thực hiện chung tất cả các
exceptions

B. Finally Block
-

Finally block là block sẽ luôn được thực hiện cho dù có exception hay khơng, nó ln đi kèm
với try-catch block hoặc try-block

-


Finaaly block thường được dùng để dùng task, dọn dẹp các exception, hay ngắt kết nối ngắt
luồng

-

Ví dụ:

o

Trong đoạn code trên thì dù có exception hay khơng thì dịng “This is finally block
luôn luôn được in ra”

-

Finally và close() : close() được sử dụng để đóng tất cả các tiến trình (thread) được mở trong
một chương trình vì thế để đảm bảo tất cả input và output stream được đóng đúng cách dù
có exception hay ko ta nên cho close() vào trong finally block

-

Cách để ngưng không cho code trong finally code được thực thi:


o

Khác với phương thức thông thường ta finally code vẫn được thực thi ngay cả khi
nằm dưới return, break, continue....

o


Để ngăn không cho finally block được thực thi ta dùng câu lệnh System.exit() bên
trên nó

C. Throw exception
-

Java đã định nghĩa sẵn các class exception như ArithaturesException, NullPulumException,
hay ArrayIndexOutOfBound,..v..v.. Những exception này được dùng để catch các trường hợp
khác nhau.

-

Ví dụ : khi chia 1 số cho 0 thì ArithaturesException sẽ được throw ra, hay khi truy cập đến 1
index không hợp lệ thì ArrayIndexOutOfBound sẽ được throw

-

Ngồi ra ta có thể tự throw ra 1 exception dựng sẳn của java với message tự định nghĩa
o

Syntax:

o

Với câu lệnh này ta sẽ gọi ra class exception với error massage ta tự định nghĩa:

o

Ví dụ:


o

Với chương trình trên khi chia cho số 5 thì exception sẽ được throw

*Custom Exception:
-

Custom Exception là một class Exception mà người dùng tự định dạng, không cần dùng tới
các class exception định nghĩa sẳn của java

-

Để khởi tạo một Custome Esception ta phải extends từ class Exception

-

Ví dụ:


-

Khi dùng throw để gọi một custome exception thì ta cần phải throws tên class

-

Ví dụ:

-


Giải thích : các class exception được định nghĩa sẳn bản chất nó cũng chỉ là các class và khi ta
gọi đến nó ta tạo một object từ class đó vì thế khi muốn định nghĩa một custome exception
ta sẽ định nghĩa một class được extends từ class exception và khi gọi object của class custom
đó ra dùng đến từ khóa throws để khai báo ngay tại phương thức có gọi tới object của
custome class, và dùng throw new để tạo object

6. Làm việc với file trong java
A. Cách tạo file
-

Cách tạo file trong java: để tạo file ta dùng class File và phương thức createNewFile( ) để tạo
file. Phương thức creatNewFile( ) sẽ trả về true nếu chưa có tập tin tồn tại ở vị trí chỉ đỉnh
ngược lại sẽ trả về false

-

Khi tạo file sẽ có 2 exception được ném ra:
o

IOException : nếu xảy ra lỗi input/ output trong quá trình tạo file

o

SecurityException : nếu xảy ra lỗi về bảo mật

-

Syntax:

-


Trong đó :
o

File file = new File(“D:\\newfile.txt) : để tạo một đối tượng file mới (giống như khai
báo một file)


-

o

(“D:\\newfile.txt”) : là đường dẫn tới file và tên file

o

file.createNewFile() : để tạo một file mới nếu chưa có file ở đường dẫn đó thì trả về
true ngược lại là false

Ví dụ:

B. Đọc một file
-

Để đọc một file ta phải khai báo đối tượng file ( File file = new File(“đường dẫn”) )

-

Tiếp theo truyền đối tượng file làm tham số cho đối tượng FileInputStream fis = new
FileInputStram(file)


-

Truyền đối tượng FileInputStream làm tham số cho đối tượng BufferedInputStream bis =
new BufferedInputStream(fis)

-

Cuối cùng sử dụng vòng lặp để đọc file. Phương thức available() được sử dụng để kiểm tra
phần cuối file vì nó sẽ trả về 0 nếu như con trỏ nằm ở cuối file. Đọc nội dung file bằng
phương thức read() của FileInputStream.

-

Ví dụ:


C. Ghi một file
-

Để ghi ta cần khai báo file

-

Tiếp theo ta dùng phương thức write của FileOutputStream để ghi file
o

-

-


Ví dụ:

Lưu ý vì tham số của phương thức file có kdl là một byte array nên ta phải chuyển
string muốn ghi vào file thành một byte array bằng phương thức getBytes()


D. Ghi nối file
-

Để ghi nói ta có 2 cách
o

Sử dụng FileWriter và BufferWrite

o

Sử dụng PrintWriter

-

Trong phần này ta sẽ dùng PrintWriter

-

Để dùng PrintWriter ta phải khai báo file

-

Tiếp theo dùng file làm tham số cho FileWriter


-

Dùng FileWriter làm tham số cho BufferWrite và dùng BufferWrite làm tham số cho
PrintWriter

-

Dùng phương thức print() hoặc println() của PrintWriter để ghi nối

-

Ví dụ:

-

Lưu ý : FileWriter có 2 tham số 1 là đối tượng file và 2 là một tham số boolean để true để có
thể ghi nối



×