Chương 2
Giới thiệu ngôn ngữ lập trình Java
1. Giới thiệu công nghệ Java
1.1 Lịch sử phát triển
Lịch sử phát triển của Java bắt đầu năm 1991 khi SUN tiến hành các dự án lập trình cho
vi xử lý dùng trong các thiết bị điện tử khác nhau. C++ không đáp ứng được các yêu
cầu này vì C++ cho đem mã nguồn từ máy này sang máy khác nhưng sau khi biên dịch
lại hoàn toàn phụ thuộc vào từng bộ vi xử lý cụ thể. Trong khi đó bộ vi xử lý dùng trong
các thiết bị điện tử rất đa dạng và có vòng đời khá ngắn ngủi. Nếu ta thay đổi bộ xử lý
dẫn đến cần phải thay đổi trình biên dịch C++, điều này gây lên tốn kém. SUN đã thiết
kế một ngôn ngữ lập trình mới có tính khả chuyển cao hơn đó chính là Java. Java là tên
địa phương nơi xuất xứ của một loại cà phê ngon nổi tiếng.
Java được chính thức công bố năm 1995 và ngay lập tức đã tạo lên một trào lưu
mới trên toàn thế giới và từ đó đến nay vẫn tạo được sức cuốn hút mạnh mẽ. Bởi vì
Java không chỉ đơn thuần là một ngôn ngữ lập trình mà nó là giải pháp cho nhiều vấn
đề.
1.2. Cấu trúc của máy ảo Java (Java Virtual Machine)
Chương trình ứng dụng hoạt động bằng cách sử dụng các đối tượng của Java (Java
Object). Máy ảo Java tạo thành một cầu nối giữa trình ứng dụng viết bằng Java và hệ
điều hành.
Máy ảo Java bao gồm các thành phần sau :
• Trình nạp lớp (Class Loader): đọc bytecode từ đĩa hoặc từ kết nối mạng.
• Trình kiểm tra lớp (Class Verifier): Kiểm tra các lớp sẽ không sinh ra các lỗi ảnh
hưởng tới hệ thống khi thực thi.
• Trình thực thi (Execution Unit): sẽ thực hiện các lệnh được quy định trong từng
bytecode.
Trong bộ công cụ Java, tệp tin java.exe chính là máy ảo Java.
1.3 Các đặc trưng của Java
• Java là một môi trường độc lập (Independent Platform)
Do cấu trúc của Java nên ta có thể soạn thảo chương trình trên bất kỳ hệ thống nào.
Sau khi đã được biên dịch thành tệp tin lớp (*.class) ứng dụng có thể thực thi ở bất kỳ
sẽ không gây lỗi ảnh hưởng tới hệ thống cũng như không đụng chạm tới dữ liệu riêng
tư trên máy khách.
Tầng 4: Trình bảo an. Kiểm tra mã byte vào lúc chạy nhằm bảo đảm mã đang xét không
vi phạm qui tắc an toàn đã được thiết lập. Các thao tác của ứng dụng được xem là có
khả năng gây nguy hiểm như đọc, xóa tệp đều phải được Trình bảo an cho phép.
• Java cung cấp cho người lập trình một thư viện khủng lồ
Java cung cấp cho người lập trình một thư viện khổng lồ các hàm chuẩn, gọi là core
API. Các hàm chuẩn này được đặt trong các gói.
• Java có cơ chế quản lý bộ nhớ tự động
Quản lý bộ nhớ là một trong những vấn đề phức tạp đối với C và C
++
. Khi thực hiện
chương trình người lập trình chịu trách nhiệm khởi tạo các vùng nhớ, sau khi dùng phải
giải phóng các vùng nhớ này. Chỉ cần một lỗi nhỏ có thể làm cạn kiệt tài nguyên dẫn
đến treo hệ thống.
Java đã loại bỏ gánh nặng này cho người lập trình. Các vùng nhớ được tự động giải
phóng nếu như nó không tham chiếu đến bất kỳ đối tượng nào đang hoạt động
• Chi phí phát triển ứng dụng bằng Java thấp
2
Khi phát triển ứng dụng dựa trên công nghệ Java thì sẽ có rất nhiều công cụ phát triển
và dịch vụ được cung cấp miễn phí.
1.4. Các ấn bản Java
• J2SE ( Java 2 Platform, Second Edition)
Đây là ấn bản chuẩn, bao gồm một môi trường thời gian chạy và một tập hợp các API
để xây dựng một loạt các ứng dụng khác nhau từ applet, cho tới các ứng dụng độc lập
chạy trên các nền khác nhau, ứng dụng cho client cho các ứng dụng doanh nghiệp khác
nhau.
• J2EE (Java 2 Platform, Enterprise Edition (J2EE)
J2EE là nền tảng để xây dựng các ứng dụng phía server.
• J2ME (Java 2 Platform, Micro Edition )
3
ớc của trình duyệt
Cách thức thực hiện Mọi hoạt động được bắt đầu và
kết thúc ở main() nh- trong C/C+
+
Gọi các hàm: init(), start(),
stop(), destroy(), paint()
Kiểu ứng dụng Ứng dụng trên các máy chủ
Server. Công cụ phát triển phần
mềm, - ứng dụng trên các máy
khách
Các ứng dụng trên Web
Bảng 2.1
1.7. Cài đặt chương trình dịch Java và các công cụ
Để cài đặt Java J2SDK ta cần tải về bộ J2SDK tại trang ,
trang này cập nhật những phiên bản mới nhất của Java. Sau đó ta tải về bộ công cụ
soạn thảo Edit Plus tại địa chỉ .
Các bước cài đặt Java
Bước 1: Cài đặt J2SDK. Sau khi cài đặt xong, Java được cài đặt tại thư mục:
C:\Program Files\Java. Trong thư mục này có hai thư mục con là: jdk1.5.0_01 và
jre1.5.0_01.
• Công cụ phát triển nằm trong thư mục:
• C:\Program Files\Java\jdk1.5.0_01\bin: Bao gồm các công cụ cho phép ta phát
triển, thực thi, gỡ rối và soạn thảo các chương trình được viết bằng ngôn ngữ
lập trình Java.
• Môi trường thời gian chạy (Runtime Environment)
• Nằm trong thư mục con JRE. Nó bao gồm một máy ảo Java, các thư viện lớp, và
các tệp tin hỗ trợ việc xử lý các chương trình được viết bằng ngôn ngữ lập trình
Java.
• Các thư viện
System.out.println(args[0]);
}
}
Biên dịch chương trình
C:\>javac ViDu1.java
Thực hiện chương trình
C:\>java ViDu1 "Lam quen voi ngon ngu lap trinh Java"
Kết quả in ra là:
Lam quen voi ngon ngu lap trinh Java
Chương trình trên ta nhận thấy ngay đây là một chương trình ứng dụng độc lập đơn
giản. Chương trình thực hiện một tác vụ hết sức đơn giản là nhận một xâu ký tự được
truyền vào từ đối dòng lệnh sau đó in xâu ký tự lên màn hình. Đối dòng lệnh là một
mảng xâu ký tự String[] args. Khi ta thực thi chương trình trên, args[0] được gán bằng
xâu ký tự "Lam quen voi ngon ngu lap trinh Java".
Ví dụ 2: Tạo một applet hiển thị một xâu ký tự lên màn hình
import java.applet.*;
import java.awt.*;
6
public class ViDu2 extends Applet
{
public void paint(Graphics g)
{
g.drawString("Chuc mung cac ban da thanh cong voi vi du thu 2",30,30);
}
}
Biên dịch applet
C:\>javac ViDu2.java
Tạo một trang html để nhúng applet
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
java.io.*;
// Phần 3: (0 hoặc nhiều hơn) //
Định nghĩa các lớp và các
interface public class
NewApp{ ...} class C1{...}
interface I1{...} // class Cn {...}
interface Im{...}
Lưu ý:
• Tệp chương trình Java luôn có tên trùng với tên của một lớp công khai
(lớp chứa hàm main() nếu là ứng dụng độc lập) và có phần mở rộng là
.java.
• Tệp NewApp.java nếu là chương trình ứng dụng độc lập thì phải có một
lớp có tên là NewApp và lớp này phải có phương thức main(). Phương
thức này luôn có dạng: public static void main(String args[]){ // Nội dung
cần thực hiện của chương trình ứng dụng }
• Khi dịch (javac) thì mỗi lớp trong tệp chương trình sẽ được dịch thành
byte code và được ghi thành tệp riêng có tên trùng với tên của lớp và có
đuôi .class. Những lớp này sẽ được nạp vào chương trình lúc thông dịch
và thực hiện theo yêu cầu.
• Trong chương trình Java không có các khai báo biến, hàm tách biệt khỏi
lớp và chỉ có các khai báo và định nghĩa các lớp, interface. Như thế
chương trình Java được xem như là tập các lớp, interface và các đối
tượng của chúng trao đổi thông điệp với nhau (bằng các lời gọi hàm) để
thực hiện các nhiệm vụ của ứng dụng.
2.2. Định danh, kiểu dữ liệu và khai báo biến
Định danh (Identifier) Tên gọi của các thành phần trong chương trình được gọi là định
danh
Định danh thường được sử dụng để xác định biến, kiểu, phương thức, lớp.
Qui tắc cho định danh:
• Định danh là một dãy các ký tự gồm các chữ cái, chữ số và các ký tự khác: ‘_’,
long 64
float 32
doube 64
Bảng 2.2
Chú ý:
• Các giá trị kiểu nguyên thủy không phải là đối tượng.
• Mỗi kiểu dữ liệu có miền xác định và các phép toán xác định trên nó.
• Mỗi kiểu dữ liệu nguyên thủy có một lớp gói (wrapper class) để sử dụng các kiểu
nguyên thủy như là các đối tượng.
10
Kiểu dữ liệu Lớp gói
char Char
byte Byte
short Short
int Integer
long Long
float Float
double Double
Bảng 2.3
2.4. Khai báo các biến
a. Các loại biến trong Java
• Các biến thành phần: là các thành phần của lớp và được khởi tạo giá trị mỗi khi
một đối tượng của lớp được tạo ra.
• Ví dụ:
URL u ;
HocSinh hs = new HocSinh(“Tuan Anh”);
• Các biến tham chiếu đối tượng (Object Reference) là biến được sử dụng để xử
lý các đối tượng.
• Các biễn tĩnh (static variable) là biến của lớp đại diện cho cả lớp.
• Các biến cục bộ: là biến được khai báo trong các phương thức và trong các
char c=(char)k;
2.3. Các lệnh trong Java
Một lệnh có thể thay đổi trạng thái của máy tính: giá trị của các biến, các phần tử của
mảng, nội dung của các tệp tin,…
2.3.1. Lệnh biểu thức
Một lệnh biểu thức là lệnh có dạng:
<Biểu thức>;
Nó được xử lý bằng cách đánh giá biểu thức mà không cần lưu lại giá trị tính toán.
2.3.2. Khối lệnh
Khối lệnh trong Java tương tự như khối lệnh trong C/C++, là những lệnh nằm trong cặp
ngoặc mở { và đóng }.
Một khối lệnh là một dãy không hoặc nhiều lệnh hoặc các khai báo biến hoặc khai báo
lớp theo bất kỳ thứ tự nào được đặt trong cặp ngoặc {}
{
S1;
S2;
…
Sn;
}
Lệnh gán
Ví dụ
int a, b, c,d;
d=b*b-4*a*c;
• Biểu thức điều kiện
Biểu thức điều kiện A?B:C trả về giá trị B nếu A có giá trị true, trả về giá trị C nếu A
có giá trị false.
12
Ví dụ:
• byte b;
• int i=b>=0?b:b+255;
System.out.println();
for(i=0;i<a.length-1;i++)
13
for(j=i+1;j<a.length;j++)
if(a[i]>a[j])
{
tg=a[i];
a[i]=a[j];
a[j]=tg;
}
System.out.println("Day so sau khi sap xep la:");
for(i=0;i<args.length;i++) System.out.print(a[i]+" ");
}
}
Biên dịch chương trình
C:\>javac SapXep.java
Thực hiện chương trình
C:\>java SapXep -2 3 1 4 -5 6 -10
-2 3 1 4 -5 6 -10
Day so sau khi sap xep la:
-10 -5 -2 1 3 4 6
Lệnh switch
Lệnh này cho phép rẽ nhánh theo nhiều nhánh tuyển chọn dựa trên các giá trị nguyên
của biểu thức.
Cú pháp:
switch(<biểu_thức_nguyên>)
{
case nhan_1:<câu_lệnh_1>;
case nhan_2:<câu_lệnh_2>;
case nhan_3:<câu_lệnh_3>;
Cú pháp
do
{
//Các lệnh
}
while(<Điều_kiện>);
Chú ý:
Thân chu trình được thực hiện ít nhất một lần
• Lệnh for
Cú pháp
for(<Biểu_thức_bắt_đầu>; <Điều_kiện_lặp>; <Biểu_thức_gia_tăng>)
<Thân_chu_trình>
o <Biểu_thức_bắt_đầu>: Khai báo và gán các giá trị khởi đầu cho các
biến điều khiển quá trình lặp.
o <Điều_kiện_lặp>:Biếu thức logic.
• Sự tương đương giữa vòng for và while
15
{
<Biểu_thức_bắt_đầu>;
while(<Điều_kiện_lặp>)
{
<lệnh>;
<Biểu_thức_gia_tăng>;
}
• Lệnh lặp vô hạn:
Ta có thể sử dụng vòng for với cú pháp như sau làm vòng lặp vô hạn.
for(;;)<lệnh>
Vòng lặp vô hạn while:
while(true){
}
vô hạn
• Lệnh continue
Lệnh continue sẽ bỏ qua không xử lý một lệnh nào đó trong vòng lặp nhưng vẫn tiếp tục
thực hiện phần còn lại của vòng lặp.
class ContinueDemo
{
public static void main(String[] args)
{
for(int i=0;i<20;i++){
if(i==10)continue;
System.out.println("i="+i);
}
}
}
Kết quả thực hiện chương trình trên như sau:
i=0
i=1
i=2
i=3
i=4
i=6
i=7
i=8
i=9
Ta thấy rằng chương trình không in ra giá trị i=5 vì khi kiểm tra điều kiện chương trình
bỏ qua giá trị i=5 và thực hiện lệnh với giá trị I còn lại của vòng lặp.
• Lệnh return
17