2. http://cyber24h.com
Nội dung
Giới thiệu về Java
Cơ bản về ngôn ngữ Java
Chương trình ứng dụng kiểu Application
Vào /Ra cơ bản
Các cấu trúc điều khiển
Ngoại lệ (Exception)
Một số vấn đề liên quan đến lớp (class)
Nhập / Xuất với các Stream
Luồng (Thread)
3. http://cyber24h.com
Giới thiệu về Java
Lịch sử phát triển:
1990: Ngôn ngữ Oak được tạo ra bởi James Gosling trong dự án
Green của Sun MicroSystems nhằm phát triển phần mềm cho các
thiết bị dân dụng.
1995: Oak đổi tên thành Java.
1996: trở thành chuẩn công nghiệp cho Internet.
Khả năng:
Ngôn ngữ cấp cao
Giao diện lập trình đồ họa: Symantec Cafe, Jbuilder, Netbeans …
Truy cập cơ sở dữ liệu (JDBC).
Lập trình mạng.
Lập trình phân tán.
Đặc điểm:
Ngôn ngữ hướng đối tượng, Đa nền, Đa luồng,
Ngôn ngữ mã nguồn động, an toàn, đơn giản.
4. http://cyber24h.com
Giới thiệu về Java
Hai kiểu ứng dụng dưới Java:
Applet:
• Ứng dụng được nhúng vào
các trang web.
• Mã ứng dụng được lấy từ
web server.
Application:
• Ứng dụng được thực thi trên
các máy ảo Java.
• Bộ thông dịch dịch mã
bytecode của ứng dụng
thành mã máy đích.
5. http://cyber24h.com
Java Development Kit (JDK)
Bộ phát triển ứng dụng java gồm:
• javac: Chương trình biên dịch ngôn ngữ java thành mã byte
code
• java (máy ảo java – Java Virtual Machine): Thông dịch mã
bytecode của các chương trình kiểu application thành mã thực thi
của máy đích.
• appletviewer: Bộ thông dịch thực thi applet.
• javadoc: Tạo tài liệu tự động.
• jdb: Gở rối.
• rmic: Tạo stub cho ứng dụng kiểu RMI.
• rmiregistry: Phục vụ tên (Name Server) trong hệ thống RMI
. . .
6. http://cyber24h.com
Các kiểu dữ liệu
Kiểu số:
Kiểu ký tự char :
• 2 bytes theo mã UNICODE
• 127 ký tự đầu trùng với mã ASCII
Kiểu chuỗi String :
• Là một lớp trong ngôn ngữ java.
• Có các phương thức thao tác trên chuỗi.
Kiểu Boolean : nhận 2 giá trị true / false
Tên kiểu Kích thước
byte
short
int
long
float
double
1 byte
2 bytes
4 bytes
8 bytes
4 bytes
8 bytes
7. http://cyber24h.com
Các kiểu dữ liệu
Kiểu mảng:
• Khai báo:
int[] a ; float[] yt; String[] names;
hoặc: int a[]; float yt[]; String names[];
int maTran[][]; float bangDiem[][];
• Khởi tạo:
a = new int[3]; yt = new float[10];
names = new String[50];maTran = new int[10][10];
• Sử dụng mảng:
int i = a[0]; float f = yt[9];
String str = names[20]; int x = matran[0][0];
8. http://cyber24h.com
Các phép toán
Phép toán số học:
+, - , *, / , % , =
++ , -- , += , - = , *= , /= , %=
Phép toán logic:
= =, !=, && , ||, !
> , < , >= , <=
Phép toán trên bit:
& , | , ^ , << , >> , ~
Phép toán điều kiện: ? :
Phép toán chuyển kiểu: (kiểu mới)
Các phép toán có ý nghĩa tương tự ngôn ngữ C++
9. http://cyber24h.com
Quy ước đặt tên
Tên phân biệt giữa chữ hoa và chữ thường.
Dùng các chữ cái, ký tự số, ký tự _ và $.
Không bắt đầu bằng ký tự số.
Không có khoảng trắng trong tên.
Quy ước:
• Tên lớp:
• Các ký tự đầu tiên của một từ được viết Hoa,
• Các ký tự còn lại viết thường.
Ví dụ: lớp Nguoi, SinhVien, MonHoc, String, InputStream,...
• Tên biến, tên hằng, tên phương thức:
• Từ đầu tiên viết thường.
• Ký tự đầu tiên của từ thứ hai trở đi được viết Hoa.
Ví dụ: ten, ngaySinh, diaChi, inTen(), inDiaChi(),
getInputStream(),...
10. http://cyber24h.com
Ứng dụng kiểu Application(1)
Java ngôn ngữ thuần đối tượng (pure object):
=> Tất cả đều được định nghĩa trong các lớp (class)
Trong một ứng dụng có một lớp thực thi được.
Lớp thực thi được:
• Có tên lớp trùng với tên tập tin chứa nó.
• Phải khai báo public
• Có chứa phương thức:
public static void main (String argv[]){
. . .
}
là phương thức được thực thi đầu tiên.
• Nếu nhiều lớp được định nghĩa trong một tâp tin:
=> chỉ có một lớp được khai báo public.
11. http://cyber24h.com
Ứng dụng kiểu Application (2)
Ví dụ ứng dụng HelloWorld:
Định nghĩa trong lớp HelloWorld
Chứa trong tập tin HelloWorld.java
Chú giải: System.out.print() : in ra màn hình
12. http://cyber24h.com
Ứng dụng kiểu Application (3)
Cài đặt bộ phát triển ứng dụng JDK:
Version 1.1.6 trở lên
Thư mục c:jdk1.1.6
Đặt đường dẫn đến thư mục bin của jdk:
set path = c:jdk1.1.6bin
Đặt biến môi trường CLASSPATH đến thư viện của jdk và thư
mục chứa các lớp cần thực hiện:
set CLASSPATH = c:jdk1.1.6lib;
Biên dịch tập tin nguồn:
javac HelloWorld.java
Kết quả : HelloWorld.class
Thực thi lớp HelloWorld.class:
java HelloWorld
Kết quả Hello World!
14. http://cyber24h.com
Một vài ví dụ (1)
In ra màn hình:
Sử dụng phương thức System.out.print(arg1 + arg2+ ...+argn);
arg1, arg2, argn: các tham số có kiểu tùy ý.
15. http://cyber24h.com
Một vài ví dụ (2)
Đọc ký tự từ bàn phím:
Sử dụng phương thức int System.in.read();
Giá trị trả về là thứ tự trong bảng mã ascii của các ký tự nhận từ
bàn phím.
16. http://cyber24h.com
Các cấu trúc điều khiển
Lệnh if - else:
if ( điều kiện ) { Công việc nếu điều kiện là Đúng; }
else {Công việc nếu điều kiện là Sai; }
17. http://cyber24h.com
Các cấu trúc điều khiển
Phép toán ?: (điềukiện) ? Hành động1 : Hành động2;
<=> if ( điềukiện == true ) { Trả lại giá trị là Hành động1; }
else { Trả lại giá trị là Hành động2 ;}
18. http://cyber24h.com
Các cấu trúc điều khiển
Lệnh switch :
switch ( biến ) {
case giá_trị1 : { Hành động1; break; }
case giá_trị2 : { Hành động 2; break; }
. . .
default: Hành động n;
}
23. http://cyber24h.com
Các cấu trúc điều khiển
Lệnh continue:
Vòng lặp sẽ bỏ qua không thực hiện các lệnh sau lệnh continue
để bắt đầu lần lặp kế tiếp
24. http://cyber24h.com
Một số kỹ thuật (1)
Đọc đối số của chương trình
Các đối số đưa vào chương trình cách nhau khoảng trắng trên
hàng lệnh
Các đối số chứa trong một mảng kiểu chuỗi (String).
Số lượng đối số chỉ ra bởi thuộc tính length của mảng.
26. http://cyber24h.com
Ngoại lệ (Exception) (1)
Khái niệm
Các thao tác vào / ra thường không chắc chắn: nhập sai kiểu
dữ liệu, máy in chưa sẵn sàng, kết nối mạng không thực hiện
được,… gây ra các lỗi khi thực thi chương trình
Java hạn chế các lỗi này bằng cơ chế Ngoại lệ (exception)
try {
Các thao tác vào ra có thể sinh ra các ngoại lệ.
}
catch (KiểuNgoạiLệ01 biến) {
Ứng xử khi ngoại lệ KiểuNgoaiLệ01 sinh ra
}
catch (KiểuNgoạiLệ02 biến) {
Ứng xử khi ngoại lệ KiểuNgoaiLệ02 sinh ra
}
finally { Công việc luôn luôn được thực hiện }
28. http://cyber24h.com
Một số vấn đề liên quan đến lớp
Định nghĩa lớp
class TênLớp {
// Khai báo các thuộc tính (Attributes)
KiểuDữLiệu1 thuộctính1, thuộctính2, . .;
KiểuDữLiệu1 thuộctính3, thuộctính4, . .;
// Khai báo (định nghĩa) các phương thức (Methods)
TênLớp([KiểuDữLiệu thamsố, KiểuDữLiệu thamsố]) {
// Phương thức tạo dựng (constructor)
...
}
void phươngthức1() {
. . .
}
KiểuDữLiệu phươngthức2( …) {
… return giátrị;
}
}
29. http://cyber24h.com
Một số vấn đề liên quan đến lớp
Khai báo đối tượng
TênLớp tênĐốitượng = new TênLớp([đốisố1,đốisố2, . . .]);
30. http://cyber24h.com
Một số vấn đề liên quan đến lớp
Nhiều lớp trong một tập tin
Chỉ có một lớp được khai báo public
Các lớp còn lại mặc định là public trong package chứa lớp đó
31. http://cyber24h.com
Một số vấn đề liên quan đến lớp
Tính thừa kế
Một lớp chỉ có thể có một lớp cha (thừa kế đơn)
Lớp cha được tham khảo từ lớp con bởi từ khóa super
Cú pháp: class TênLớp extends LớpCha {
…..
}
33. http://cyber24h.com
Một số vấn đề liên quan đến lớp
Tính thừa kế (tiếp theo)
Đa kế thừa không được hỗ trợ trong java
Tính thừa kế (tiếp theo)
Đa kế thừa không được hỗ trợ trong java
35. http://cyber24h.com
Một số vấn đề liên quan đến lớp
Hãy suy xét kịch bản sau: Có 3 lớp A, B, C. Trong đó lớp C kế thừa
từ các lớp A và B. Nếu các lớp A và B có phương thức giống nhau
và bạn gọi nó từ đối tượng của lớp con, như vậy khó có thể xác
đinh được việc gọi phương thức của lớp A hay B.
Như vậy, đa kế thừa không được
hỗ trợ để giảm thiểu sự phức tạp
của ngôn ngữ
36. http://cyber24h.com
Interface trong Java
Khái niệm
Một Interface trong Java là một bản thiết kế của một lớp. Nó
chỉ có các phương thức trừu tượng..
Interface là một kỹ thuật để thu được tính trừu tượng hoàn
toàn và đa kế thừa trong Java.
Một Interface trong Java là một tập hợp các phương thức trừu
tượng (abstract). Một class triển khai một interface, do đó kế
thừa các phương thức abstract của interface.
Mặc định các trường của Interface là public, static và final, các
phương thức là public và abstract.
37. http://cyber24h.com
Interface trong Java
Đa kế thừa trong Java bởi Interface
Nếu một lớp triển khai đa kế thừa, hoặc một Interface kế thừa
từ nhiều Interface thì đó là đa kế thừa
39. http://cyber24h.com
Một số vấn đề liên quan đến lớp
Đa kế thừa không được hỗ trợ thông qua lớp trong Java nhưng là
có thể bởi Interface, tại sao?
40. http://cyber24h.com
Một số vấn đề liên quan đến lớp
Vì Interface không có tính lưỡng nghĩa khi trình triển khai được
cung cấp bởi lớp Implementation
Trong ví dụ trên, trình triển khai không phải là Interface mà là lớp
Implement của nó
41. http://cyber24h.com
Nhập / Xuất với các Stream (1)
Khái niệm Stream
Là khái niệm trừu tượng => giảm bớt các thao tác vào ra phức
tạp đối với người lập trình => có thể nối kết nhiều loại thiết bị
ngoại vi với CT.
Dòng liên tục, có thứ tự các bytes dữ liệu “chảy” giữa chương
trình và các thiết bị ngoại vi.
Thao tác viết (write): chương trình sẽ gửi dữ liệu vào Stream.
Thao tác đọc (read): chương trình sẽ nhận dữ liệu từ Stream.
Java hỗ trợ hai lớp Stream cơ bản trong gói java.io
• java.io.InputStream: Stream nhận dữ liệu (Stream Nhập).
• java.io.OutputStream: Stream gửi dữ liệu (Stream Xuất).
• Dữ liệu không được định dạng: từng ký tự (char) hoặc nhiều
byte (byte[]).
Các lớp con của hai lớp trên định dạng dữ liệu nhận và dữ liệu
gửi: DataInputStream, DataOutputStream, FileInputStream,
FileOutputStream ...
42. http://cyber24h.com
Nhập / Xuất với các Stream (2)
InputStream – Một số phương thức
int read() throws IOException:
• Return : 0-255: Giá trị của byte nhận được từ ngoại vi
-1 : Stream đã kết thúc.
int read (byte b[]) throws IOException:
• Đọc tất cả các byte hiện có trong Stream đặt vào mảng b
• Return: Số lượng byte đọc được
-1: Stream đã kết thúc.
int read (byte b[], int offset, int len)
• Đọc len byte từ Stream hiện tại, lưu vào trong mảng b bắt
đầu từ vị trí offset
• Return: Số lượng byte đọc được
-1: Stream đã kết thúc.
Các phương thức trên nghẽn (block) cho đến khi có dữ liệu
hoặc kết thúc Stream hay một ngoại lệ xuất hiện.
int available(): Trả về số lượng byte hiện có trong Stream mà
không nghẽn.
43. http://cyber24h.com
Nhập / Xuất với các Stream (3)
InputStream – Ví dụ 1
IOException: Kiểu các ngoại
lệ xảy ra khi nhập / xuất
45. http://cyber24h.com
Nhập / Xuất với các Stream (5)
OutputStream - Một số phương thức:
void write (int b) throws IOException:
• Viết byte b vào Stream hiện tại.
• Return : void
void write (int b[]) throws IOException:
• Viết b.length bytes trong mảng b vào Stream hiện tại
• Return : void
void write (int b[], int offset, int len) throws IOException:
• Viết len bytes trong mảng b vào Stream hiện tại, bắt đầu
từ phần tử có chỉ số offset trong mảng.
• Return : void
46. http://cyber24h.com
Nhập / Xuất với các Stream (6)
OutputStream – Ví dụ:
getBytes(): Phương
thức của đối tượng
String. Đọc dữ liệu
theo từng byte
47. http://cyber24h.com
Nhập / Xuất với các Stream (7)
Nhập chuỗi từ Stream nhập (1):
InputStream: là Stream nhập gồm mảng các bytes.
InputStreamReader: Chuyển Stream nhập dạng byte sang
Stream nhập dạng các ký tự.
BufferedReader: Hỗ trợ việc đọc văn bản từ một Stream nhập
dạng ký tự, lớp này thích hợp cho việc đọc các dòng văn bản.
Phương thức String readLine() throws IOException của
BufferedReader:
• Đọc dòng văn bản kế tiếp trong Stream nhập. Một dòng
kết thúc bởi cặp ký tự ‘r’’n’ hoặc kết thúc Stream.
• Return: Một chuỗi ký tự hoặc null.
Cách đọc một chuỗi từ một InputStream:
InputStream is = new InputStream();
BufferedReader br = new BufferedReader (new InputStreamReader(is));
String str = br.readLine();
49. http://cyber24h.com
Nhập / Xuất với các Stream (9)
Gửi chuỗi ra Stream xuất – lớp PrintWriter:
Khởi tạo: PrintWriter(OutputStream out);
Gửi một chuỗi: void write(String str);
Gửi một dòng: void println(String line);
Đẩy dữ liệu ra Stream: void flush();
Cách thức sử dụng:
OutputStream os = new OutputStream();
PrintWriter pw = new PrintWriter(os);
String str = “Day la mot dongrn”;
pw.write(str);
String line = “Day la mot dong”;
pw.println(line);
pw.flush();
51. http://cyber24h.com
Luồng (Thread)
Hệ điều hành đa nhiệm cổ điển:
Đơn vị cơ bản sử dụng CPU là quá trình.
Mỗi quá trình có một không gian địa chỉ và một không gian
trạng thái riêng
Hệ điều hành đa nhiệm hiện đại, hỗ trợ luồng:
Đơn vị cơ bản sử dụng CPU là luồng.
Mỗi quá trình có một không gian địa chỉ và nhiều luồng điều
khiển.
Mỗi luồng có bộ đếm chương trình, trạng thái các thanh ghi và
ngăn xếp riêng.
Luồng của một quá trình có thể chia sẻ nhau không gian địa
chỉ : Biến toàn cục, tập tin, chương trình con, hiệu báo, . . .
Luồng chia sẻ thời gian sử dụng CPU => Luồng cũng có các
trạng thái: Sẵn sàng (ready), Đang chạy (running),
Nghẽn(Block) như quá trình.
Luồng cung cấp cơ chế tính toán song song trong các ứng
dụng.
54. http://cyber24h.com
Luồng (Thread)
Luồng trong java là một đối tượng của lớp java.lang.Thread
Một chương trình cài đặt luồng bằng cách tạo ra các lớp con của
lớp Thread.
Lớp Thread có 3 phương thức cơ bản:
• public static synchronized void start() :
Chuẩn bị mọi thứ cần thiết để thực hiện luồng.
• public void run():
Chứa mã lệnh thực hiện công việc thực sự của luồng.
run() được gọi một cách tự động bởi start().
• public void stop() : kết thúc một luồng.
Luồng kết thúc khi:
• Hoặc tất cả các lệnh trong run() đã được thực thi.
• Hoặc phương thức stop() của luồng được gọi.
56. http://cyber24h.com
Luồng (Thread)
Giữa các luồng trong cùng một quá trình có thể gán độ ưu tiên
thực thi khác nhau (từ 1 – 10), có sẵn 3 mức chuẩn
• MAX_PRIORITY (giá trị 10)
• MIN_PRIORITY (giá trị 01)
• NORM_PRIORITY (giá trị 05)
Các luồng trong cùng một quá trình chia sẻ nhau không gian địa.
chỉ của quá trình (Ví dụ như cùng truy xuất đến một biến hoặc
một phương thức có thể gây sai lệch dữ liệu) => Cần có cơ chế
đồng bộ hóa (Synchronized).
Java sử dụng cơ chế biến khóa để đồng bộ hóa giữa các luồng.
Có hai cấp đồng bộ hóa:
• Giữa các phương thức trong cùng một đối tượng.
• Giữa các đối tượng của cùng một lớp.
57. http://cyber24h.com
Các kỹ thuật lập trình với luồng
Tạo luồng
Khai báo lớp kế thừa từ Thread
Viết chồng (Override) phương thức run
Ví dụ:
58. http://cyber24h.com
Các kỹ thuật lập trình với luồng
Tạo luồng
Tạo các đối tượng từ lớp kế thừa và thi hành (start())
Ví dụ:
Dịch: javac –d . ThreadX.java
javac –d . Main.java
Chạy: java DaLuong.Main
59. http://cyber24h.com
Các kỹ thuật lập trình với luồng
Độ ưu tiên của luồng
Thiết lập độ ưu tiên
void setPriority(int doUT)
doUT: Từ 1 đến 10
Lấy độ ưu tiên
int getPriority()
Ví dụ:
63. http://cyber24h.com
Một số ví dụ về Thread
Ví dụ 1: Tạo một lớp gồm 2 Thread. Mỗi Thread thực thi trong 2
giây (2000 ms), quá trình này lặp đi lặp lại
Thực hiện
- Tạo lớp Luong1
- Viết hàm tạo dựng cho lớp Luong1, tạo và gọi 2 Thread thực thi
public Luong1{
new Thread1().start();
new Thread2().start();
}
- Viết class Thread1 và Thread2
class Thread1{
- Viết nội dung cho phương thức run
public void run(){
- Đưa công việc vào vòng lặp, xử lý ngoại lệ
while(true){
try{System.out.println(“Thread 1”);sleep(2000);}
catch(InterruptException e){}
- Viết phương thức main tạo đối tượng Luong1
new Luong1();
64. http://cyber24h.com
Một số ví dụ về Thread
Ví dụ 2: Tạo lớp gồm 2 Thread. Thread thứ nhất tạo một số ngẫu
nhiên. Thread thứ 2 nhận số nguyên và tính bình phương của nó
Thực hiện: Tương tự ví dụ 1
- Để tạo số ngẫu nhiên
+ Khai báo import java.util.Random;
+ Khai báo đối tượng số ngẫu nhiên: Random so=new Random()
- Để tính lũy thừa: Dùng hàm Math.pow(n,csm)
* Lưu ý: Do Thread sẽ truy xuất vào biến chưa số ngẫu nhiên nên
để tránh xung đột nên dùng cơ chế đồng bộ cho đối tượng Thread
khi gán.
synchronized (this) {
i = so.nextInt(30);
…………………
}