SlideShare a Scribd company logo
1 of 114
Download to read offline
AptechVietnam 1/114
Chương 1: Giới thiệu về Java
Mục tiêu bài học
Kết thúc bài học này, học viên có thể:
 Tìm hiểu các thực thể trong thế giới thực như là các đối tượng
 Định nghĩa một đối tượng phần mềm
 Tìm hiểu và giải thích cấu trúc của một lớp
 So sánh các lớp và các đối tượng
 Tìm hiểu tầm quan trọng của Java
 Tìm hiểu bộ JDK và các công cụ của nó
 Tìm hiểu về máy ảo Java - Java Virtual Machine (JVM)
1.1 Giới thiệu về lớp và đối tượng
Các đối tượng (object) và các lớp (class) là nền tảng để xây dựng Java. Lớp là
một khuôn mẫu, bao gồm một tập các đối tượng có tính chất tượng tự nhau. Lớp
mô tả tất cả các thuộc tính của một tập các đối tượng cụ thể.
1.1.1 Các thực thể trong thế giới thực như là các đối tượng
Đối tượng là khái niệm dùng để mô tả các thực thể trong thế giới thực. Ví dụ các
đối tượng có thể nhainf thấy quanh ta như: Chó - Dogs, Ô tô - Cars, bông hoa -
Flowers, ngôi nhà – Houses, … Bất kỳ một thực thể hữu hình hoặc có thể sờ mó
được nào đó, đều có thể xem như như một đối tượng trong thế giới thực.
Mỗi đối tượng có các thuộc tính hoặc tính chất nhằm mô tả nó là cái gì. Ví dụ,
các thuộc tính của đối tượng Dog là:
 Giống
 Màu lông
 Tuổi
Ngoài ra, một đối tượng có thể thực hiện các hành động. Chẳng hạn, các hành
động của Dog có thể thực hiện là:
 Sủa
 Ăn
Learn Java by Example
2/114 AptechVietnam
 Chạy
Như vậy, hai yếu tố quan trọng nhất của đối tượng trong thế giới thực là: thuộc
tính (Attribute) và hành động (Action). Nhờ đó, đối tượng có thể được định nghĩa
như một thực thể tồn tại, có các thuộc tính và hành động hoàn toàn xác định.
Tương tự như vậy, trong phạm vi của công nghệ phần mềm, các đối tượng cũng
được mô tả dựa theo trạng thái và hành vi của nó. Trạng thái của một đối tượng
phần mềm được định nghĩa bởi các thuộc tính của nó. Các hoạt động của một
đối tượng phần mềm được định nghĩa như là các hành vi của nó.
Hãy xem xét một đối tượng trong thế giới thực, chẳng hạn Dog, một con chó.
Nếu đối tượng này được ánh xạ đến một đối tượng phần mềm, trạng thái của nó
có thể là màu lông, giống và tuổi. Hành vi của đối tượng Dog có thể là sủa, ăn,
chạy, …
Vì vậy, một đối tượng phần mềm là một thực thể bao gồm các trạng thái (thuộc
tính) và hành vi (hành động). Nó lưu giữ các trạng thái của nó trong các trường,
được gọi là các biến trong ngôn ngữ lập trình. Còn các hành vi được xem như là
các phương thức, giống như các hàm trong ngôn ngữ lập trình. Một phương
thức là một chuỗi các câu lệnh được đặt tên nhằm thực hiện các tác vụ cụ thể
nào đó.
Tham khảo hình 1.1, đây là ví dụ về đối tượng „Cashier‟ (Thủ quỹ)
Hình 1.1: Đối tượng „Cashier‟ và đối tượng „Customer‟
Các thuộc tính của đối tượng „Cashier‟ là:
 Tên
 Chức vụ
 Tuổi
Một đối tượng thực thi một số hành động. Các hành động của đối tượng
‟Cashier‟ là:
Chương 1 Giới thiệu về Java
3/114
 Thu tiền từ khách hàng
 In hoá đơn
Sự thuận lợi khi sử dụng đối tượng là:
 Nó giúp chúng ta hiểu hơn về thế giới thực
 Nó ánh xạ các thuộc tính và các hành động của các đối tượng trong thế
giới thực thành trạng thái và hành vi của các đối tượng phần mềm.
1.1.2 Class (Lớp)
Như đề cập ở trên, Dog là một ví dụ về một đối tượng trong thế giới thực. Tuy
nhiên, trong thế giới thực có nhiều loại động vật khác như mèo, cừu, cọp, …Vì
vậy, Dog chỉ là một thể hiện của lớp động vật.
Các thuộc tính và hành động chung của một số đối tượng được nhóm lại thành
một đơn vị. Đơn vị này có thể được dùng để tạo ra một đại diện của loại tương
ứng, gọi là lớp. Mỗi một lớp mô tả một tập các đối tượng riêng lẻ.
Một lớp là một khuôn mẫu hoặc bản thiết kế định nghĩa đặc điểm chính của trạng
thái và hành vi cho tất cả các đối tượng thuộc về lớp. Tất cả các thể hiện của
lớp, được gọi là đối tượng, sẽ có chung các trạng thái và hành vi.
Tuy nhiên, các thuộc tính và hành động có thể được gán chỉ sau khi một đối
tượng được tạo ra. Khi đối tượng được tạo ra ta mới có một đại diện thật sự của
thực thể. Vì vậy, lớp là một mô hình khái niệm của thực thể. Nó mô tả các thuộc
tính và hành động chung chứ không riêng cho một đối tượng cụ thể nào.
Ví dụ, xem xét một lớp có tên Animal (Động vật) như trong bảng 1.1. Lớp chứa
các thuộc tính (trạng thái) và hành động (hành vi) của động vật.
Class Animal
Type
Animal Name
Color
Motion
Breathing
Eating
Bảng 1.1: Mô tả lớp Animal
Lớp này có trạng thái „Type‟, „Animal Name‟ và „Color‟.
Trong đó,
Type - Mô tả loài động vật.
Animal name - Tên loại động vật, chẳng hạn cừu, cọp, ếch, …
Learn Java by Example
4/114 AptechVietnam
Color - Mô tả màu da/ lông của loài đó
„Motion‟ (Di chuyển), „Breathing‟ (Thở) và „Eating‟ (Ăn) là các hành vi của lớp
Animal.
1.1.3 So sánh giữa lớp (class) và đối tượng (object)
Có sự khác biệt giữa một lớp và một đối tượng. Một lớp mô tả một thực thể,
trong khi một đối tượng là một thực thể thật sự.
Đối tượng là vật thật, trong khi lớp là một mô hình khái niệm định nghĩa tất cả
các trạng thái và hành vi cần thiết của một đối tượng.
Một lớp là một nguyên mẫu (prototype) của một đối tượng. Nó định rõ các hành
động và các tính chất cần thiết cho một loại đối tượng cụ thể. Bảng 1.2 là ví dụ
về lớp và đối tượng.
Class
(Lớp)
Object
(Đối tượng)
Animal
Cat
Dog
Car
Honda City
Benz
Bảng 1.2: Ví dụ về lớp và đối tượng
Lớp không thay đổi, trong khi dữ liệu chứa trong một đối tượng có thể thay đổi.
Các thuộc tính của lớp được thiết lập trong suốt thời gian chay chương trình,
không thể thêm bớt thuộc tính trong lúc chương trình đang chạy. Khi một đối
tượng được tạo từ một lớp, nó sẽ là một thành phần của lớp đó cho đến khi bị
huỷ bỏ. Sự tồn tại của đối tượng có hạn chế, đối tượng sẽ được tạo ra và hủy bỏ
theo đúng trình tự.
Mỗi đối tượng được gọi là một thể hiện của một lớp. Trong ví dụ bên dưới,
Employee là một lớp, còn các đối tượng là: Cashier, System Administrator, Stock
Manager, Salesman, Purchase Manager.
Chương 1 Giới thiệu về Java
5/114
Hình 1.2: Các đối tượng và lớp.
1.2 Giới thiệu về Java
Vào năm 1995, hãng Sun Microsystem giới thiệu một ngôn ngữ lập trình mới là
Java. Cho đến giờ, từ “Java” chỉ có nghĩa là tên một hòn đảo ở Indonesia hoặc
một kiểu cách pha café nào đó.
1.2.1 Sự cần thiết của Java
Java là một ngôn ngữ dành cho các nhà lập trình chuyên nghiệp. Java được xây
dựng trên cơ sở ngôn ngữ lập trình C và C++. Nó kế thừa cú pháp của C và các
nét đặc trưng của C++. Một nhóm kỹ sư của hãng Sun Microsystem cần thiết kế
một ngôn ngữ cho các thiết bị điện tử như tivi, máy giặt, …Vì vậy, mục đích cơ
bản là phát triển ngôn ngữ để tạo ra phần mềm có thể nhúng trong các thiết bị
điện tử. Trong ngôn ngữ C và C++ trình biên dịch phụ thuộc vào loại CPU riêng
biệt.
Các trình biên dịch rất đắt và mất nhiều thời gian để tạo ra. Do đó, không thể có
trình biên dịch cho mọi loại CPU. Và yêu cầu là cần có cách dễ dàng và hiệu quả
để tạo ra các trình biên dịch. Ngoài ra, phần mềm phải nhỏ, nhanh, hiệu quả và
độc lập nền tảng, nghĩa là mã chương trình có thể thực hiện trên nhiều CPU
khác nhau dưới các môi trường khác nhau. Trong nỗ lực tạo ra một ngôn ngữ
độc lập nền tảng và khả chuyển, James Gosling và nhóm cộng sự đi tiên phong
Learn Java by Example
6/114 AptechVietnam
trong vấn đề này. Kết quả là sự ra đời của ngôn ngữ Java. Đầu tiên nó được gọi
là “Oak”, sau đó được đổi tên thành Java. Ngày nay, Java đã có những bước
phát triển hết sức thành công và được chấp nhận bởi hàng triệu lập trình viên
trên toàn thế giới.
Java là một ngôn ngữ lập trình phổ dụng, được dùng để viết các chương trình có
thể chạy được trên Internet. Nét đặc trưng chính của Java là ngôn ngữ hướng
đối tượng và độc lập nền tảng. Độc lập nền tảng có nghĩa là chương trình có thể
chạy trên nhiều nền tảng khác nhau như: Microsoft Windows, Apple Macintosh,
Linux, …Java không những được dùng cho các ứng dụng độc lập, các chương
trình trên mạng, mà còn được dùng trong các thiết bị tiêu dùng như: điện thoại,
các thiết bị cầm tay, …
1.2.2 Các đặc trưng của ngôn ngữ Java
 Hướng đối tượng (Object-oriented)
Java là một ngôn ngữ hướng đối tượng. Trong Java không có các hằng, biến
hoặc hàm độc lập. Nghĩa là tất cả đều là một phần của đối tượng. Các hằng,
biến và hàm được truy nhập thông qua các lớp và các đối tượng.
Các ngôn ngữ hướng đối tượng lai ghép khác như C++, có đặc điểm của ngôn
ngữ cấu trúc cộng thêm sự mở rộng đối tượng. Ví dụ, C++ là một ngôn ngữ
hướng đối tượng, nhưng lập trình theo hướng cấu trúc, phương thức main() nằm
ngoài bất kỳ lớp và đối tượng nào. Java thì không cho phép cách khai báo này.
Trong Java, phương thức main() chỉ được khai báo bên trong một lớp.
 Độc lập nền tảng (Platform independent)
Java là một nền tảng để phát triển ứng dụng. Nó có thể được dùng như một
ngôn ngữ. Nền tảng ở đây là sự kết hợp giữa phần cứng và phần mềm hệ thống
mà hầu hết các phần mềm đều chạy được. Ví dụ, bộ xử lý Intel chạy trên nền
Windows XP là một nền tảng.
Độc lập nền tảng nói đến khả năng của chương trình di chuyển từ một nền tảng
này sang một nền tảng khác không có bất kỳ một khó khăn nào. Độc lập nền
tảng trong Java ở mức mã nguồn và mã bytecode (mã trung gian).
Java là một ngôn ngữ định kiểu mạnh mẽ, nghĩa là phải cần khai báo kiểu dữ
liệu cho mọi biến. Kiểu dữ liệu trong Java là đồng nhất trong tất cả các nền tảng
phát triển. Java có các lớp thư viện cơ sở. Điều này cho phép các lập trình viên
có thể di chuyển mã từ nền tảng này đến một nền tảng khác mà không cần viết
lại mã.
Chương 1 Giới thiệu về Java
7/114
Nói tóm lại, độc lập nền tảng ở mức mã nguồn cho phép di chuyển mã nguồn từ
một hệ thống này sang một hệ thống khác, biên dịch và thực hiện êm xuôi trên
mọi hệ thống.
Sử dụng mã bytecode, Java đã giải quyết vấn đề độc lập nền tảng. Không giống
như trình biên dịch của C, trình biên dịch Java đưa ra một định dạng đặc biệt, đó
là bytecode, giống nhau trên mọi nền tảng.
Các chương trình Java được biên dịch thành bytecode vẫn cần một trình thông
dịch để thực thi nó trên bất kỳ một nền tảng đã định sẵn nào. Công việc của trình
thông dịch là đọc mã bytecode và chuyển nó thành ngôn ngữ máy.
Để chạy Java trên một máy tính hoặc một hệ điều hành mới, chỉ cần trình thông
dịch và một vài gói thư viện cần thiết. Bởi vì bytecode là độc lập nền tảng.
 Mạnh mẽ
Java là ngôn ngữ định kiểu mạnh mẽ. Nó được thiết kế để viết các phần mềm có
độ tin cậy cao và mạnh. Tuy nhiên, nó yêu cầu phải khai báo các phương thức
một cách rõ ràng. Java kiểm tra lỗi cú pháp tại thời điểm biên dịch, và tại thời
điểm thông dịch. Vì vậy, nó chắc chắn loại bỏ một số lỗi trong lập trình.
Java không có con trỏ và phép tính con trỏ. Nó kiểm tra tất cả truy nhập đến
mảng và chuỗi tại thời điểm chạy chương trình. Ngoài ra nó còn kiểm tra sự
chuyển kiểu của đối tượng từ kiểu này đến kiểu khác tại thời điểm chạy chương
trình.
Trong các môi trường lập trình truyền thống, lập trình viên phải tự cấp phát bộ
nhớ. Kết thúc chương trình, lập trình viên phải giải phóng vùng bộ nhớ này. Các
sự cố sẽ nảy sinh khi lập trình viên quên giải phóng bộ nhớ. Trong Java, lập trình
viên không cần quan tâm đến việc giải phóng bộ nhớ. Nó được thực hiện tự
động bởi bộ thu gom rác (garbage collection).
 An toàn (Secure)
Virus máy tính là nguyên nhân gây ra sự lo lắng trong việc sử dụng máy tính.
Trước khi có Java, các lập trình viên phải quét virus các tập tin trước khi tải về
và thực hiện chúng. Thông thường việc này cũng không loại trừ hoàn toàn virus.
Ngoài ra, chương trình khi thực thi có khả năng tìm kiếm và đọc các thông tin
nhạy cảm trên máy của người sử dụng mà người sử dụng không hề hay biết.
Java cung cấp một môi trường quản lý việc thực thi chương trình. Nó cho rằng
không có một đoạn mã nào là an toàn cả. Vì thế, Java không chỉ là ngôn ngữ lập
Learn Java by Example
8/114 AptechVietnam
trình thuần tuý mà còn cung cấp nhiều mức để kiểm soát tính an toàn khi thực thi
chương trình.
Ở mức đầu tiên, dữ liệu và các phương thức được truy nhập thông qua các
interface (giao tiếp) do lớp cung cấp. Java không hỗ trợ các phép toán con trỏ.
Do đó, nó không cho phép truy nhập trực tiếp đến các vùng nhớ và cung cấp cơ
chế thu gom rác giúp thu hồi bộ nhớ không sử dụng. Các đặc trưng này giúp
Java an toàn tối đa và có khả năng khả chuyển cao.
Trong mức thứ hai, trình biên dịch kiểm soát để đảm bảo mã là an toàn, và tuân
theo các nguyên tắc của Java.
Mức thứ ba, được đảm bảo bởi trình thông dịch. Chúng kiểm tra xem bytecode
phải đảm bảo các qui tắc an toàn trước khi thực thi.
Mức thứ tư, kiểm soát việc nạp các lớp vào bộ nhớ để giám sát việc vi phạm giới
hạn truy xuất trước khi nạp vào hệ thống.
 Phân tán (Distributed)
Java có thể được dùng để phát triển các ứng dụng trên nhiều nền tảng, hệ điều
hành và nhiều giao tiếp người dùng đồ hoạ. Java được thiết kế để hỗ trợ các
ứng dụng trên mạng. Do đó, Java được dùng như là một công cụ phát triển trên
môi trường Internet.
 Đa luồng (Multithreaded)
Đa luồng là yếu tố cần thiết cho một ngôn ngữ như Java. Một ứng dụng thực
hiện một tác vụ trong khi đang chờ người dùng nhập liệu. Trong một ứng dụng
đồ hoạ trên mạng như một trình duyệt web, thường có rất nhiều tác vụ xảy ra tại
một thời điểm. Java cung cấp hỗ trợ cho xử lý gọi là “multithreading” để thực
hiện nhiều tác vụ đồng thời. Java cung cấp cơ chế đồng bộ nhiều xử lý. Cơ chế
này cũng hỗ trợ cho luồng (thread) giúp các ứng dụng tương tác trên mạng chạy
êm xuôi.
 Động (Dynamic)
Java được thiết kế như một ngôn ngữ động để đáp ứng cho những môi trường
mở. Mã nguồn Java được lưu trữ trong tập tin có dạng .java. Trình biên dịch sẽ
biên dịch chúng thành bytecode chứa trong tập tin .class. Mỗi tập tin .java
thường được biên dịch thành một tập tin .class.
Đầu tiên trình biên dịch kiểm tra đường dẫn trên thư mục hiện hành và các thư
mục khác được xác định trong biến môi trường CLASSPATH. Điều này cần thiết
giúp xác định các lớp khác được tham chiếu trong tập tin nguồn. Ví dụ, nếu tập
tin được biên dịch phụ thuộc vào các tập tin không được biên dịch khác, trình
biên dịch sẽ cố tìm và biên dịch chúng. Trình biên dịch có thể điều khiển sự phụ
thuộc vòng tròn cũng như các phương thức được sử dụng trước khi được khai
báo. Nó cũng xác định tập tin nguồn có thay đổi so với lần biên dịch cuối cùng
hay không. Vì vậy, trình biên dịch khá thông minh.
Chương 1 Giới thiệu về Java
9/114
 Kiến trúc trung lập (Architecture-neutral)
Công nghệ Java được thiết kế để hỗ trợ các ứng dụng sẽ được triển khai trong
các môi trường không đồng nhất trên mạng. Trong các môi trường như vậy, các
ứng dụng phải có khả năng thực thi tốt trên nhiều kiến trúc phần cứng.
Các chương trình Java được biên dịch thành một định dạng bytecode không phụ
thuộc kiến trúc có thể thực thi trên nhiều nền tảng phần cứng và phần mềm. Vì
vậy, vấn đề phân phối nhị phân và phiên bản được giải quyết bởi bản chất thông
dịch của công nghệ Java.
Các chương trình Java chạy trên bất kỳ hệ thống nào có hỗ trợ máy ảo Java.
Điều này không những hữu ích trên mạng mà còn có ích trên các hệ thống phân
tán.
 Khả chuyển (Portable)
Khả chuyển là hệ quả của kiến trúc trung lập. Công nghệ Java có được khả năng
khả chuyển là nhờ vào định nghĩa chặt chẽ của ngôn ngữ. Nó chỉ rõ kích thước
của các kiểu dữ liệu cơ bản để loại trừ sự phụ thuộc cài đặt và hành vi của các
toán tử số học. Hệ thống Java bản thân là khả chuyển. Trình biên dịch Java
được viết bằng Java, trong khi hệ thống thực thi Java được viết bằng ANSI C với
ranh giới khả chuyển rõ ràng.
 Hiệu suất cao (high performance)
Hiệu suất luôn được cân nhắc. So với các ngôn ngữ kịch bản thông dịch mức
cao, Java có hiệu suất cao nhất. Bộ thu gom rác tự động thực hiện như luồng
ngầm bên dưới, có độ ưu tiên thấp nhất, đảm bảo khả năng khả chuyển cao
nhất. Sun khẳng định khả năng thực thi của bytecode chuyển thành mã máy tốt
gần như C hoặc C++.
1.3 Giới thiệu JDK
Sun Microsystems cung cấp ngôn ngữ Java trong sản phẩm gọi là Java
Development Kit (JDK). JDK bao gồm các công cụ phát triển, môi trường thực thi
(Java Runtime Environment hay JRE), các thư viện, các chương trình demo và
mã nguồn. Một số công cụ nằm trong JDK dùng phát triển các ứng dụng Java
được mô tả dưới đây:
 Trình biên dịch Java, „Javac‟
Trình biên dịch dịch mã nguồn Java thành tập tin class. Trình biên dịch javac
được dùng để biên dịch các tập tin mã nguồn Java thành bytecode. Mã nguồn
Java có thể được tạo ra bằng bất kỳ trình soạn thảo văn bản nào, chẳng hạn
Notepad
Cú pháp:
Javac [option] source
Learn Java by Example
10/114 AptechVietnam
Trong đó,
source - 1 hoặc nhiều tên tập tin có phần mở rộng là .java
option - Các tuỳ chọn dòng lệnh
Ví dụ,
Javac FirstProgram.java
Câu lệnh này sẽ tạo ra một tập tin có tên „FirstProgram.class‟. Tập tin class này
sẽ chạy trên máy ảo Java (JVM). Một vài tuỳ chọn của câu lệnh javac được mô
tả trong bảng 1.3
Tùy chọn
(Option)
Mô tả
-classpath
Xác định rõ vị trí chứa các lớp được tham chiếu
trong mã nguồn (được lưu trong biến môi trường
CLASSPATH)
-d Xác định thư mục đích chứa các tập tin .class
-g
In tất cả các thông tin gỡ lỗi thay cho số dòng và
tên tập tin mặc định.
-verbose
Hiển thị các thông tin đầu ra mỗi lần lớp được nạp
và tập tin nguồn được biên dịch.
-version Hiển thị thông tin về phiên bản
-sourcepath Cho biết vị trí lớp
-help Hiển thị các tuỳ chọn chuẩn
Bảng 1.3: Các tuỳ chọn của trình biên dịch Javac
Xem xét ví dụ sau sử dụng tuỳ chọn –d:
javac –d c:FirstProgram.java
Câu lệnh này sẽ biên dịch và lưu tập tin „FirstProgram.class‟ trong ổ đĩa C.
 Trình thông dịch Java, „Java‟
Trình thông dịch Java được sử dụng để thực thi mã bytecode. Nó lấy đối số là
tên tập tin .class để thực thi hoặc tên tập tin lưu trữ Java gọi là jar.
Cú pháp:
Chương 1 Giới thiệu về Java
11/114
java [option] classname [arguments]
Trong đó,
option - Các tuỳ chọn dòng lệnh
classname - Tên tập tin class được dùng
arguments - Đối số được truyền vào cho hàm main
Ví dụ,
Java FirstProgram
Một vài tuỳ chọn của câu lệnh Java được mô tả trong bảng 1.4
Tùy chọn Mô tả
-classpath
Xác định rõ vị trí chứa các lớp cần (được lưu
trong biến môi trường CLASSPATH)
-v hoặc
–verbose
Hiển thị các thông tin đầu ra mỗi lần lớp được
nạp và tập tin nguồn được biên dịch.
-version Hiển thị thông tin về phiên bản và thoát
-jar Sử dụng tên tập tin JAR thay cho tập tin class
-help Hiển thị thông tin trợ giúp về lệnh Java và thoát
-X
Hiển thị thông tin và các tùy chọn phi chuẩn và
thoát
Bảng 1.4: Các tuỳ chọn của trình thông dịch Java
1.4 Máy ảo Java (Java Virtual Machine - JVM)
Máy ảo Java là trái tim của ngôn ngữ lập trình Java. Môi trường Java bao gồm
năm phần tử sau:
 Ngôn ngữ
 Ðịnh nghĩa Bytecode
 Các thư viện lớp Java/Sun
 Máy ảo Java (JVM)
 Cấu trúc của tập tin .class
Learn Java by Example
12/114 AptechVietnam
Đặc tính khả chuyển của tập tin .class cho phép các chương trình Java viết một
lần chạy mọi nơi (“Write once, run anywhere”). Đặc tính này có được nhờ sự cài
đặt máy ảo Java (JVM).
1.4.1 Máy ảo Java là gì?
Lập trình viên cần thiết phải biết máy ảo Java là gì và cách làm việc của nó. Điều
này sẽ giúp ta tận dụng được điểm mạnh của JVM và tránh những điểm yếu.
Máy ảo là một khái niệm phần mềm dựa trên ý tưởng của máy tính tưởng tượng.
Nó có tập hợp các lệnh logic để xác định các hoạt động của máy tính. Máy ảo có
thể được xem như một hệ điều hành thu nhỏ. Nó thiết lập các lớp trừu tượng
cho: phần cứng bên dưới, hệ điều hành, mã biên dịch.
Trình biên dịch chuyển mã nguồn thành tập các lệnh của máy ảo không phụ
thuộc vào phần cứng riêng biệt. Trình thông dịch là một ứng dụng hiểu các lệnh
của máy ảo và chuyển các lệnh đó thành các lệnh thực hiện trên phần cứng bên
dưới. Máy ảo, về cơ bản, tạo ra một hệ thống thực thi giúp thực hiện các mã
lệnh bằng cách:
 Nạp các tập tin .class
Các trình “Class Loaders” là một trong các thành phần cơ bản của kiến
trúc máy ảo Java. Nó cho phép máy ảo Java nạp các lớp mà không cần
biết bất cứ thứ gì về ngữ nghĩa hệ thống tập tin và cho phép các ứng
dụng nạp các lớp Java như các module mở rộng.
 Quản lý bộ nhớ
Máy ảo Java quản lý bộ nhớ theo các cách sau:
 Khi một máy ảo Java được triệu gọi để chạy một ứng dụng, nó yêu
cầu hệ điều hành cấp đủ bộ nhớ cho bản thân JVM chạy và bộ nhớ
trống cho các ứng dụng tạo các đối tượng mới.
 Khi một đối tượng mới được tạo, JVM cấp phát bộ nhớ cho đối
tượng đó từ vùng nhớ trống.
 Khi vùng nhớ trống giảm xuống sau khi tạo một số đối tượng, JVM
yêu cầu hệ điều hành cấp thêm.
 Khi một đối tượng không còn được dùng nó sẽ bị huỷ bỏ. Bộ nhớ bị
chiếm dụng sẽ được giải phóng và trả lại vùng bộ nhớ trống.
 Khi vùng nhớ trống bị chiếm giữ, và không thể xin cấp thêm vùng
nhớ từ hệ điều hành thì JVM tạm dừng ứng dụng và đưa ra thông
báo lỗi “Out of memory error”.
 Thực hiện thu gom “rác” (Garbage Collection)
Quá trình thu gom rác là giải phóng bộ nhớ đang sử dụng của một đối tượng
ngay khi nó kết thúc, nghĩa là đối tượng đó không được truy nhập sau một thời
Chương 1 Giới thiệu về Java
13/114
gian dài. Quá trình này xảy ra tự động và an toàn đối với các đối tượng không
còn cần tham chiếu đến nữa.
Khi máy ảo Java thực thi mã, một thanh ghi cục bộ gọi là „program counter‟ được
dùng. Thanh ghi này trỏ đến các lệnh đang được thực thi hiện tại. Nếu cần thiết,
các lệnh này sửa nội dung thanh ghi này để thay đổi luồng thực thi. Mặt khác,
luồng được thực hiện tuần tự nên nó trỏ từ lệnh này đến lệnh khác.
Một khái niệm phổ biến khác được dùng trong Java là trình biên dịch JIT – Just-
In-Time. Các trình duyệt web như Netscape Navigator, Internet Explorer bao
gồm trình biên dịch JIT nhằm tăng tốc độ thực thi mã Java. Mục đích chính của
JIT là chuyển đổi mã bytecode sang mã máy ứng với từng bộ vi xử lý cụ thể.
Các lệnh này được lưu trữ và dùng bất cứ lúc nào, được gọi như là một phương
thức xác định. Hình 1.3 hiển thị mối quan hệ giữa trình biên dịch Java và JIT.
Hình 1.3: Mối quan hệ giữa trình biên dịch Java và JIT
Mã chương trình được biên dịch và chạy thông qua một máy ảo thay cho vi xử lý
của máy tính. Bằng cách sử dụng cách tiếp cận này, mã nguồn Java có thể chạy
trên bất kỳ nền tảng nào, nó được biên dịch và chạy thông qua máy ảo Java.
Máy ảo Java không biết gì về ngôn ngữ lập trình Java, nó chỉ nhận ra một định
dạng nhị phân xác định của một file gọi là file class. Các chương trình Java được
biên dịch thành mã bytecode có thể tuyền trên mạng và thực thi bởi máy ảo
Java. Mỗi file class chứa định nghĩa của một lớp hoặc một giao tiếp. File
bytecode có phần tên mở rộng là .class
Learn Java by Example
14/114 AptechVietnam
Tóm Tắt Bài Học
 Một đối tượng là một thể hiện của một lớp.
 Một lớp định nghĩa một thực thể trên giới hạn của các tính chất và hành
động phổ biến.
 Một lớp định nghĩa một thực thể, trong khi đó một đối tượng là một thực
thể thực sự.
 Java là một ngôn ngữ thông dịch và biên dịch.
 Các tính năng của Java:
o Hướng đối tượng
o Độc lập nền tảng
o Mạnh mẽ
o An toàn
o Phân tán
o Đa luồng
o Động
o Kiến trúc trung lập
o Khả chuyển
o Hiệu suất cao
 Sun Microsystems giới thiệu ngôn ngữ Java như là một sản phẩm dưới
tên gọi Java Development Kit (JDK)
 Bên trong máy ảo, Java tạo ra một hệ thống thời gian thực giúp thực thi
mã lệnh như sau:
o Nạp các files .class
o Quản lý bộ nhớ
o Thực thi việc thu gom rác
AptechVietnam 15/114
t
Chương 2: Biến và toán tử
Mục tiêu bài học
Kết thúc bài học này, học viên có thể:
 Cú pháp khai báo biến
 Định nghĩa các kiểu dữ liệu cơ bản
 Tìm hiểu và giải thích cấu trúc của một lớp
 Mô tả các kiểu định dạng
 Mô tả các ký tự đặc biệt (escape sequences)
 Xác định các toán tử khác nhau
2.1 Biến
Biến là đơn vị lưu trữ cơ bản trong chương trình Java. Biến là các thành phần
xác định dữ liệu và được dùng để tham chiếu đến các giá trị xác định được tạo
ra trong chương trình. Đặt tên các biến có ý nghĩa giúp ta dễ dàng đọc hiểu mã
nguồn hơn.
2.1.1 Khai báo biến
Tất cả các biến phải được khai báo trước khi sử dụng. Dạng khai báo biến cơ
bản là:
datatype variablename;
Trong đó,
datatype - Kiểu dữ liệu hợp lệ
variablename - Tên biến hợp lệ
Các biến có thể khai báo và khởi tạo theo nhiều cách khác nhau, được minh hoạ
trong đoạn mã 1.
Đoạn mã 1:
Line0: int x,y,z; //Khai báo 3 biến kiểu int x,y
//và z
Learn Java by Example
16/114 AptechVietnam
Line1: int a=5,b,c=10; //Khai báo 3 biến kiểu int
//, khởi tạo a và c
Line2: byte num=20; // Khai báo 1 biến num có kiểu
//byte và khởi tạo giá trị là 20
Line3: char c=‟c‟; //Khai báo c là biến có kiểu
//char, khởi tạo giá trị là c
Line4: int num1=num2=10; //Giá trị 10 được lưu trữ
//trong num1 và num2
Line0 và Line1 là các ví dụ về khai báo danh sách các biến được cách nhau bởi
dấu phẩy và Line4 là ví dụ về gán một giá trị cho một hoặc nhiều biến lúc khai
báo biến.
Đoạn mã 2 là một ví dụ về gán các giá trị hệ bát phân (8) và hệ thập lục phân
(16) cho các biến.
Đoạn mã 2:
Line1: int decVal = 10;//giá trị 10 trong hệ
// thập phân (hệ 10)
Line2: int octVal = 012;//giá trị 10 trong hệ
// bát phân (hệ 8)
Line3: int hexVal = 0xa;//giá trị 10 trong hệ
// thập lục phân (hệ 16)
Đoạn mã 2 hiển thị cú pháp đúng để chứa các giá trị trong hệ bát phân và hệ
thập lục phân. Line2 biểu diễn một định dạng trong hệ bát phân với tiếp đầu ngữ
0. Hệ thống số bác phân có 8 ký tự số từ 0 đến 7 để mô tả các số.
Line3 biểu diễn định dạng trong hệ thập lục phân với tiếp đầu ngữ 0x. Hệ thống
số thập lục phân có 16 ký tự số để mô tả các số, từ 0 đến 9 và từ ký tự A đến F.
Từ A đến F tương ứng từ 10 đến 15. Ví dụ, giá trị 26 trong hệ 16 là:
int hexVal = 0x1a;
Hệ thống thập phân được mô tả trong Line1, là cách dùng thông dụng trong lập
trình.
Chương 2 Biến và toán tử
17/114
2.1.2 Khai báo hằng (literals)
Hằng là một giá trị không đổi và được mô tả trực tiếp trong đoạn mã mà không
cần đến tính toán. Ví dụ,
Đoạn mã 3:
Line1: int val = 50;
Line2: float num = 35.7F;
Line3: char x = „x‟;
Một hằng được sử dụng ở bất kỳ nơi nào cho phép kiểu giá trị của nó. Tuy
nhiên, có nhiều kiểu hằng khác nhau. Một vài trong số chúng là:
 Hằng nguyên (Integer literals)
Hằng nguyên được dùng để biểu diễn một giá trị nguyên (int), trong Java là một
giá trị số nguyên 32 bit. Trong một chương trình, số nguyên là kiểu thường được
sử dụng nhất. Bất kỳ một giá trị số nguyên nào đều là một hằng số nguyên.
Các số nguyên có thể biểu diễn như:
 Các giá trị thập phân được biểu diễn trong hệ cơ số 10
 Các giá trị bát phân được biểu diễn trong hệ cơ số 8
 Các giá trị thập lục phân được biểu diễn trong hệ cơ số 16
Mỗi một loại trên có hằng tương ứng. Một hằng số nguyên có thể được gán đến
một kiểu số nguyên khác như byte hoặc long. Khi một giá trị hằng được gán đến
một biến kiểu byte hoặc short, sẽ không có lỗi nếu giá trị hằng nằm trong phạm vi
của kiểu đích. Các số nguyên có thể được biểu diễn với một ký tự hoa („L‟)hoặc
thường („l‟) ở cuối, để biểu diễn một số nguyên dài 64 bit.
 Hằng dấu chấm động (floating-point literals)
Các hằng số thực biểu diễn các giá trị thập phân với phần lẻ. Các hằng số thực
có các thành phần sau:
 Thành phần số, ví dụ 0, 1, 2, …, 9
 Dấu thập phân, ví dụ 4.90, 3.141
 Số mũ được biểu diễn bởi E hoặc e đi theo sau một số thập phân
có thể dương hoặc âm. Ví dụ: e+208, 7.436E6, 23763E-05, …
 Kiểu hậu tố D, d, F hoặc f
Learn Java by Example
18/114 AptechVietnam
Trong Java, các hằng số thực, ngầm định, có độ chính xác double. Một hằng
float được biểu diễn bởi F hoặc f, theo sau là giá trị, và một hằng số thực double
được biểu diễn bởi D hoặc d.
 Hằng Boolean (boolean literals)
Các hằng boolean đơn giản và chỉ có hai giá trị logic là true và false. Các giá trị
này không thể chuyển đổi đến bất kỳ hệ thống số nào. Trong Java, true không
bằng 1 và false không bằng 0. Nó chỉ có thể gán đến các biến được khi báo là
boolean hoặc dùng trong các biểu thức với các toán tử boolean.
 Hằng ký tự (character literals)
Các hằng ký tự được đặt trong cặp dấu ngoặc đơn. Tất cả các ký tự ASCII hợp
lệ có thể đặt trực tiếp trong cặp dấu ngoặc đơn, như „g‟, „$‟ và „z‟.
 Hằng Null (null literals)
Khi một đối tượng được tạo, lượng bộ nhớ xác định được cấp phát cho đối
tượng. Địa chỉ bắt đầu của bộ nhớ được lưu trong đối tượng, đó là, một biến
tham chiếu. Tuy nhiên đôi khi, biến tham chiếu không tham chiếu đến đối tượng.
Trong hợp này, biến tham chiếu được gán một hằng null như ví dụ bên dưới:
obj = null ;
 Hằng chuỗi (String literals)
Hằng chuỗi chứa chuỗi các ký tự trong cập dấu ngoặc kép. Các ký tự có thể là
ký tự thường, có thể đọc được trên màn hình, hoặc ký tự điều khiển, không nhìn
thấy được trên màn hình. Các dấu vạch chéo ngược, dấu nháy kép và các ký tự
điều khiển khác có thể được biểu diễn bằng dấu chéo ngược () đi kèm với mã
điều khiển, các ký tự này còn gọi là escape sequences. Ví dụ sau là một xâu
thường, không có ký tự điều khiển:
“Welcome to Java”
2.2 Kiểu dữ liệu (Data type)
Chương 2 Biến và toán tử
19/114
Các ứng dụng xử lý dữ liệu đầu vào và xuất dữ liệu kết quả. Đầu vào, đầu ra, và
kết quả của các quá trình tính toán đều liên quan đến dữ liệu. Trong môi trường
tính toán, dữ liệu được phân lớp theo các tiêu chí khác nhau phụ thuộc vào bản
chất của nó. Ở mỗi tiêu chí, dữ liệu có một tính chất xác định và có một kiểu thể
hiện riêng biệt.
Java cung cấp một vài kiểu dữ liệu mà chúng được hỗ trợ trên tất cả các nền
tảng. Ví dụ, dữ liệu loại int (integer) của Java được thể hiện bằng 4 bytes trong
bộ nhớ của tất cả các loại máy bất luận ở đâu chạy chương trình Java. Bởi vậy
các chương trình Java không cần phải thay đổi khi chạy trên các nền khác nhau.
Trong Java kiểu dữ liệu được chia thành hai loại:
 Các kiểu dữ liệu nguyên thủy (primitive)
 Các kiểu dữ liệu tham chiếu (reference)
2.2.1 Các kiểu dữ liệu nguyên thuỷ (Primitive Data Type)
Java hỗ trợ tám kiểu dữ liệu nguyên thuỷ được chia ra thành 4 nhóm:
 Kiểu số nguyên (Integer)
Trong nhóm này có các kiểu dữ liệu: byte, short, int và long và, hầu hết, biểu
diễn các giá trị số nguyên có dấu.
 Kiểu dấu chấm động (Floating-point)
Trong nhóm này có các kiểu dữ liệu: float và double và biểu diễn các số có phần
thập phân.
 Kiểu ký tự (Character)
Nhóm này có kiểu dữ liệu char, biểu diễn các ký hiệu trong tập hợp các ký tự
như ký tự chữ cái và ký tự số.
 Kiểu Boolean
Kiểu dữ liệu boolean thuộc nhóm này và biểu diễn cho hai giá trị true (Đúng)
hoặc false (Sai).
Learn Java by Example
20/114 AptechVietnam
Kiểu dữ liệu số nguyên gồm 4 loại:
 Kiểu byte
Dùng để lưu trữ lượng dữ liệu nhỏ. Đây là kiểu dữ liệu có độ dài 8 bit, phạm vi
lưu trữ từ -128 đến 127. Nó thường được dùng khi làm việc với luồng dữ liệu từ
mạng hoặc từ file. Kiểu dữ liệu này thường dùng khi làm việc với dữ liệu nhị
phân chuẩn và có thể không tương thích với các kiểu dữ liệu khác của Java. Từ
khoá byte được dùng trong khai báo một biến kiểu này. Ví dụ:
byte val;
 Kiểu short
Đây là kiểu dữ liệu ít dùng nhất. Có độ dài 16 bit và phạm vi lưu trữ từ -
32.768 đến 32.767. Kiểu dữ liệu này thường dùng cho các ứng dụng trên các
máy tính 16 bit. Kiểu dữ liệu này cũng được dùng để lưu trữ dữ liệu số nhỏ. Từ
khoá short dùng để khai báo biến kiểu này.
 Kiểu int
Đây là kiểu dữ liệu thường dùng nhất. Nó có độ dài 32 bit, với phạm vi lưu trữ từ
-2.147.483.648 đến 2.147.483.647. Kiểu int là kiểu linh hoạt và hiệu quả nhất. Ví
dụ: Tổng số lương phải trả cho tất cả nhân viên trong công ty.
 Kiểu long
long là kiểu dữ liệu 64 bit có dấu, với phạm vi lưu trữ từ
-9.223.372.036.854.775.808 đến +9.223.372.036.854.775.807. Nó được dùng
khi kiểu int không đủ để lưu một số lớn hơn phạm vi của nó. Ví dụ, dân số của
một nước.
2.2.2 Các kiểu dữ liệu tham chiếu
Trong Java, các đối tượng và các mảng là các biến tham chiếu. Khi một đối
tượng hoặc một mảng được tạo, một vùng nhớ nhất định được gán cho nó và
địa chỉ của vùng nhớ này được lưu trữ trong biến tham chiếu. Nói cách khác,
kiểu dữ liệu tham chiếu là địa chỉ của một đối tượng hoặc một mảng được tạo ra
trong bộ nhớ.
Chương 2 Biến và toán tử
21/114
2.3 Định dạng nhập và xuất
Bất cứ khi nào kết quả hiển thị trên màn hình, thì cần phải được định dạng. Java
cung cấp các ký tự điều khiển định dạng (escape sequence) để thực hiện định
dạng các dữ liệu nhập và xuất
2.3.1 Định dạng xuất
Có thể định dạng theo 2 cách:
 print() và println()
 format()
Các phương thức này hoạt động tương tự nhau. Phương thức format()dùng lớp
Java.util.Formatter để thực hiện nhiều định dạng phức tạp hơn.
 Các phương thức print() và println()
Các phương thức này chuyển dữ liệu dùng phương thức toString thích hợp và
trả lại một giá trị chuỗi. Hãy xem xét đoạn mã 4.
Đoạn mã 4:
int num1 = 5;
int num2 = 10;
int sum = num1 + num2;
System.out.print(“The sum of”);
System.out.print(num1);
System.out.print(“ and ”);
System.out.print(num2);
System.out.print(“ is “);
System.out.print(sum);
System.out.println(“.”);
Learn Java by Example
22/114 AptechVietnam
int num3 = 2;
sum = num1 + num2 + num3;
System.out.println(“The sum of ” + num1 + “, ” + num2 + “
and ” + num3 + “ is ” + sum + “.”);
Kết quả của đoạn mã trên là:
The sum of 5 and 10 is 15.
The sum of 5, 10, and 2 is 17.
Biến sum được định dạng hai lần: lần đầu trong lệnh print; lần thứ hai bằng mã
chuyển được tự động tạo ra bởi trình biên dịch Java và sử dụng phương thức
toString. Trong trường hợp này, bất kỳ giá trị nào cũng có thể được định dạng.
 Phương thức format()
Phương thức này định dạng nhiều đối số dựa trên một chuỗi định dạng. Chuỗi
định dạng chứa cả phần định dạng lẫn hằng chuỗi bình thường nhưng nó không
kết hợp với bất kỳ một đối số nào. Các chuỗi định dạng hỗ trợ nhiều đặc tính.
Thành phần định dạng bắt đầu bằng dấu %. Ví dụ,
System.out.println(“%d”, + sum);
Câu lệnh này hiển thị giá trị nguyên của biến sum.
Cú pháp của một chuỗi định dạng như sau:
Cú pháp:
%[arg_index$][flags][width][.precision]conversion character
Trong đó,
arg_index – Là một số nguyên theo sau là $. Số nguyên cho biết đối số sẽ
được in tại vị trí được đề cập.
flags – Có nhiều biến cờ khác nhau trong Java như bảng 2.1
Flag (Cờ) Mô tả
“-“ Đối số được canh thẳng theo bên trái
“+” Chèn một dấu + hoặc - với đối số này
Chương 2 Biến và toán tử
23/114
“0” Dẫn đầu đối số này với các số 0
“,” Dùng dấu ngăn cách nhóm
“(“ Số âm được bao quanh bằng dấu
ngoặc đơn
Bảng 2.1: Kiểu của các flag
width - Xác định số tối thiểu các ký tự sẽ được in
precision – xác định số ký tự số sẽ được in sau dấu thập phân. Dùng với
các số dấu chấm động.
conversion character - Kiểu của đối số được định dạng. Ví dụ, b là
boolean, c là char, d là số nguyên, ….
Các giá trị đặt trong cặp dấu “[]” là tùy chọn. Chỉ các thành phần yêu cầu xác
định định dạng là dấu % và ký tự chuyển đổi.
Đoạn mã 5 minh họa cách sử dụng phương thức format()
int val = 5;
double sq = 2.236068;
System.out.format("The square root of %d is %f.%n",val,sq);
Kết quả của đoạn mã trên như sau:
The square root of 5 is 2.236068.
2.3.2 Ký tự điều khiển (escape sequences)
Ký tự điều khiển được dùng để biểu diễn các ký tự đặc biệt. Các ký tự điều khiển
có thể dùng cho hằng ký tự hoặc hằng chuỗi.
Bảng 2.2 giới thiệu một vài ký tự đặc biệt trong Java
Learn Java by Example
24/114 AptechVietnam
Ký tự đặc biệt Giá trị ký tự
f Cuộn trang giấy vào máy in (Form feed)
r Xuống hàng (Carriage return)
xxx Ký tự tương ứng với giá trị bát phân xxx, xxx nằm
trong khoảng 000 đến 0377.
uxxxx Ký tự unicode với mã hoá xxxx, trong đó xxxx là
một số thập lục phân gồm 4 ký số.
Bảng 2.2: Ký tự điều khiển (Escape sequence)
Để biểu diễn một ký tự unicode , ký tự điều khiển unicode u có thể được dùng
trong chương trình Java. Một ký tự unicode có thể được biểu diễn bằng một
chuỗi thập lục phân hoặc bát phân. Đoạn mã 6 minh hoạ vấn đề này.
Đoạn mã 6:
// In „Hello‟ sử dụng chuỗi thập lục phân
System.out.println("u0048u0065u006Cu006Cu006F" +
"!n");
//In „Blake‟ sử dụng chuỗi bát phân cho ký tự „a‟
System.out.println("Bl141ke"2007"");
Chú ý: Các ký tự điều khiển thập lục phân bắt đầu với u, theo sau là 4 ký số hệ
thập lục phân. Các ký tự điều khiển bát phân gồm 3 ký số sau dấu . Ví dụ:
xyy
Trong đó, x có thể bất kỳ ký số nào từ 0 đến 3, y từ 0 đến 7.
Kết quả đoạn mã 6 là:
Hello!
Blake”2007”
Hai kiểu ký tự điều khiển có thể có nghĩa khác nhau bởi vì ký tự đặc biệt u được
xử lý trước các ký tự đặc biệt khác.
Chương 2 Biến và toán tử
25/114
2.4 Các toán tử
Các toán tử kết hợp với các biến đơn hoặc các biểu thức thành các biểu thức
mới phức tạp hơn mà nó trả lại các giá trị.
2.4.1 Loại toán tử
Java cung cấp các loại toán tử khác nhau như sau:
 Toán tử số học
Các toán tử số học được dùng trong các biểu thức toán học. Các toán hạng của
các toán tử số học phải ở dạng số. Các toán hạng kiểu boolean không sử dụng
được, song các toán hạng ký tự cho phép sử dụng với loại toán tử này.
 Toán tử quan hệ
Các toán tử quan hệ kiểm tra mối quan hệ giữa hai toán hạng. Kết quả của một
biểu thức có dùng các toán tử quan hệ là những giá trị boolean, true (đúng) hoặc
false (sai).
 Toán tử logic
Các toán tử logic làm việc với các toán hạng boolean.
 Toán tử gán
Toán tử gán là một dấu bằng, =, dùng để gán giá trị cho một biến. Có thể gán giá
trị cho một hoặc nhiều biến kế tiếp nhau. Nghĩa là, có thể sử dụng một dãy các
phép gán.
 Toán tử thao tác bit (bitwise)
Một toán tử bitwise cho phép ta thao tác trên từng bit riêng biệt trong các kiểu dữ
liệu nguyên thuỷ. Toán tử bitwise dựa trên cơ sở đại số boolean. Nó thực hiện
Learn Java by Example
26/114 AptechVietnam
phép tính trên hai bit có vị trí tương ứng trên hai toán hạng để tạo ra một kết quả
mới.
Khi các toán hạng là các số, toán tử „&‟ thực thi hàm AND giữa hai bit, và toán tử
„|‟ thực thi hàm OR giữa hai bit. Bảng 2.3 mô tả vấn đề này.
Condition1
(Điều kiện 1)
Condition2
(Điều kiện 2)
Condition1 &
Condition2
Condition1 |
Condition2
True True True True
True False False True
False False False False
False False False False
Bảng 2.3: AND và OR
Toán tử dịch bit sang phải không dấu
Mỗi lần một dịch bit xảy ra, toán tử >>> tự động điền bit có thứ tự ưu tiên cao với
nội dung trước đó của nó nhưng vẫn giữ dấu của giá trị. Tuy nhiên, thỉnh thoảng
dịch chuyển này không thích hợp với những giá trị không phải là số. Trường hợp
này thường xảy ra khi làm việc với dữ liệu là đồ họa và các giá trị dựa trên pixel.
Trong tình huống đó, một giá trị 0 được dịch chuyển đến bit có thứ tự ưu tiên cao
không quan tâm tới giá trị ban đầu của nó. Điều này gọi là dịch chuyển bit không
dấu. Vì vậy, một toán tử dịch bit sang phải không dấu, >>>, luôn luôn dịch
chuyển 0 đến các bit có thứ tự ưu tiên cao hơn.
Đoạn mã 7:
int val = -3;
val = val >>> 20;
Trong đó, val được gán bằng -3. Giá trị này sau đó được dịch chuyển sang phải
20 bits, điền 0 vào 20 bits đó và lờ đi bit dấu. Giá trị sau khi dịch bit là 4095.
 Toán tử instanceof
Chương 2 Biến và toán tử
27/114
Toán tử này chỉ được dùng cho các biến tham chiếu đối tượng để kiểm tra một
đối tượng có thuộc một kiểu xác định hay không. Dạng tổng quát của toán tử
instanceof là:
object instanceof type
Ở đây, đối tượng là thể hiện của một lớp, và có kiểu là kiểu của lớp. Nếu đối
tượng thuộc về một kiểu xác định hoặc có thể ép kiểu thành kiểu xác định, thì
toán tử instanceof trả lại giá trị true, ngược lại thì false.
Đoạn mã 8 minh hoạ cách dùng toán tử này.
Đoạn mã 8:
Scanner input = new Scanner(System.in);
Boolean val = input instanceof Scanner;
System.out.println(val);
Giá trị được in ra trong đoạn mã trên là true
 Toán điều kiện
Toán tử điều kiện là một loại toán tử đặc biệt vì nó gồm ba thành phần cấu thành
biểu thức điều kiện. Toán tử này có thể thay thế câu lệnh if-then-else.
Cú pháp :
expression1 ? expression2 : expression3;
Trong đó,
expression1: là biểu thức logic bất kỳ trả về giá trị true hoặc false.
expression2: là biểu thức sẽ được ước lượng khi giá trị của expression 1 là true.
expression3: là biểu thức sẽ được ước lượng khi giá trị của expression 1 là false
Các toán tử điều kiện có thể lồng nhau và được minh họa trong đoạn mã 9:
Đoạn mã 9:
int num1 = 5;
Learn Java by Example
28/114 AptechVietnam
int num2 = 10;
char op = '*';
System.out.println( (op == '-') ? (num1 - num2) : (op ==
'+') ? (num1 + num2) : (op == '*') ? (num1 * num2) :
"Invalid operator");
Trong đoạn mã 9, điều kiện cuối cùng là true nên kết quả là 50.
2.4.2 Thứ tự ưu tiên của các toán tử và sự kết hợp
Khi một biểu thức chứa nhiều toán tử, chúng sẽ được thực hiện theo một thứ tự
xác định bởi thứ tự ưu tiên của nó. Thứ tự ưu tiên của các toán tử toán học tuân
theo các nguyên tắc số học. Nếu không chắc chắn, ta dùng dấu ngoặc đơn để
thay đổi thứ tự ưu tiên.
Xét biểu thức 5+3*2, nó được tính 5+(3*2) bằng 11, chứ không tính (5+3)*2 bằng
16. Toán tử (*) có độ ưu tiên cao hơn toán tử (+), do vậy phép nhân được thực
hiện trước.
Xét biểu thức 8-3-2, nó được tính (8-3)-5 bằng 3, chứ không tính 8-(3-2) bằng 7.
Vì vậy , khi biểu thức có nhiều toán tử - thì độ ưu tiên (sự kết hợp) được thực
hiện từ trái sang phải.
Hai toán tử + và – có cùng độ ưu tiên. Nên cũng được thực hiện từ trái sang
phải. Xét biểu thức:
x + 3 – y +5
(x + 3) – y +5
((x + 3) – y) +5
((x + 3) – y +5)
Các toán tử =, += và -= có cùng độ ưu tiên nhưng được thực hiện từ phải sang
trái trong cùng biểu thức. Xét biểu thức:
x = y += z -= 4
x = y += (z -= 4)
x = (y += (z -= 4))
Chương 2 Biến và toán tử
29/114
(x = y += (z -= 4))
Dùng dấu ngoặc đơn để thay đổi thứ tự ưu tiên của các toán tử. Nếu không dùng
nó thì độ ưu tiên và sự kết hợp sẽ được dùng để xác định thứ tự các toán tử sẽ
thực thi. Khoảng trắng không có tác dụng.
Thứ tự ưu tiên được thực hiện như sau:
 Trong một biểu thức các toán tử được thực hiện theo thứ tự ưu tiên từ
cao xuống thấp (tightest binding)
 Nếu có nhiều hơn 1 toán tử ưu tiên như nhau trong biểu thức thì thực hiện
từ trái sang phải
 Hãy đặt các biểu thức ưu tiên nhất trong dấu ngoặc tròn để chúng được
thực hiện trước nhất.
 Tiếp tục với biểu thức con thứ hai và các biểu thức tiếp theo
 Tiếp đến các toán tử có độ ưu tiên cao nhất còn lại theo cùng qui trình
trên.
Rất dễ bị sai nếu quên đi thứ tự ưu tiên. Hãy xem biểu thức sau:
x = a+b/5.0-c**d+1*e
là tương đương với
x = ((a+(b/5.0))-(c**d))+ (1*e)
Tuân theo qui trình sau để đóng ngoặc các biểu thức
 Toán tử ưu tiên cao nhất là **. Nghĩa là c**d được thực hiện trước tiên, ta
đóng nó trong ngoặc tròn.
 Dấu / và dấu * là toán tử ưu tiên cao nhất thứ hai, sẽ được thực hiện kế
tiếp, do vậy đặt b/5.0 và 1*e vào ngoặc tròn.
 Dấu + và – có độ ưu tiên cao nhất kế tiếp. Do chúng có cùng độ ưu tiên
với nhau nên thực hiện từ trái sang phải.
 Cuối cùng phép gán được thực hiện.
2.4.3 Ép kiểu
Ép kiểu hay chuyển đổi kiểu hàm ý nói đến việc thay đổi kiểu dữ liệu của một
biến sang kiểu khác. Thực hiện điều này ta thu được một số tinh năng ưu việt
Learn Java by Example
30/114 AptechVietnam
của thang bậc các dữ liệu. Chẳng hạn, các giá trị giới hạn của một tập các số
nguyên integer có thể chứa trong một khuôn dạng cô đọng hơn. Có thể chuyển
đổi kiểu sang dạng khác phù hợp với việc tính toán hơn vì không thể tính toán
với kiểu dữ liệu trước đó, chẳng hạn như là chia các số với độ chính xác cao
hơn. Trong ngôn ngữ lập trình hướng đối tượng, chuyển đổi kiểu cho phép
chương trình xem đối tượng của một kiểu như là kiểu tiền bối của chúng để làm
đơn giản việc tương tác với chúng.
Có 2 loại chuyển kiểu: mặc định và tường minh. Thuật ngữ chuyển kiếu mặc
định có nghĩa là nâng kiểu. Hầu hết các dạng chuyển kiểu tường minh được hiểu
là ép kiểu. Chuyển kiểu tường minh cũng có thể thu được từ các thường trình
chuyển kiểu được viết riêng như là nạp chồng hàm dựng của đối tượng.
 Chuyển kiểu ngầm định
Chuyển kiểu ngầm định, cũng còn gọi là nâng kiểu (coercion), là tự động
chuyển kiểu bởi trình biên dịch. Một số ngôn ngữ cho phép, thậm chí đòi
hỏi bộ biên dịch phải hỗ trợ chuyển kiểu.
Trong một biểu thức phức hợp, chương trình sẽ chạy đúng nếu dữ liệu
của kiểu dưới có thể chuyển lên kiểu trên.
Đoạn lệnh 10 mô tả chuyển kiểu mặc định.
short a=2000;
int b;
b=a;
Ở đây giá trị ‟a‟ được nâng cấp từ short lên int và không cần toán tử ép
kiểu nào cả. Điều này được hiểu là chuyển kiểu thông thường. Chuyển
kiểu thông thường tác động trên các kiểu dữ liệu cơ bản, cho phép
chuyển đổi các dữ liệu số (short lên int, int lên float, float lên double...) và
một số chuyển đổi con trỏ. Một số chuyển đổi có thể gây ra mất độ chính
xác, lúc ấy trình biên dịch có thể cảnh báo. Điều này có thể không cần đến
chuyển kiểu tường minh.
 Chuyển kiểu tường minh
Nhiều loại chuyển kiểu, đặc biệt là hạ thấp kiểu gây mất dữ liệu, đòi hỏi
chuyển kiểu tường minh.
Đoạn lệnh 11 mô tả chuyển kiểu tường minh
short a=2000;
int b;
b= (int)a; // cú pháp ép kiểu
Chương 2 Biến và toán tử
31/114
b= int (a); // cú pháp kiểu hàm
Có nhiều loại ép kiểu tường minh, đó là:
 Có kiểm tra
Trước khi chuyển kiểu được thực hiện, một kiểm tra trong lúc chạy
chương trình được thực hiện để xem kiểu đích đến có chứa được giá
trị nguồn hay không. Nếu không, một lỗi bị sinh ra.
 Không kiểm tra
Không có kiểm tra nào được thực hiện. Nếu kiểu đích không chứa
được giá trị gốc, kết quả không được ghi nhận.
 Mẫu bit
Dữ liệu không được xem xét gì tất, các bít thô được sao chép nguyên
bản.
Learn Java by Example
32/114 AptechVietnam
Tóm tắt bài học
 Biến là một tên được dùng để tham chiếu đến các giá trị
chỉ định trong chương trình.
 Hằng là giá trị không đổi được viết thẳng trong mã lệnh
không đòi hỏi sự tính toán nào cả.
 Java có các loại dữ liệu có sẵn, gọi là dữ liệu nguyên
thủy.
 Định dạng dữ liệu để xuất ra người ta dùng lớp Formatter
hoặc sử dụng các phương thức format() và printf() của
lớp PrintStream.
 Một số các ký tự đặc biệt được biểu diễn kết hợp với dấu

 Java cung cấp nhiều loại toán tử, đó là
 Toán tử số học
 Toán tử bit
 Toán tử quan hệ
 Toán tử logic
 Toán tử điều kiện
 Toán tử gán
AptechVietnam 33/114
Chương 3: Lệnh rẽ nhánh và vòng lặp
Mục đích
Cuối chương này, học viên có thể nắm được:
 Các cấu trúc rẽ nhánh if
 Cấu trúc switch-case
 Cấu trúc vòng lặp while, do while, for và vòng lặp lồng nhau
 Câu lệnh break, continue
3.1 Câu lệnh rẽ nhánh
Câu lệnh rẽ nhánh hay câu lệnh điều khiển được sử dụng để điều khiển luồng
thực thi trong ngôn ngữ lập trình. Java hỗ trợ hai loại lệnh rẽ nhánh đó là: cấu
trúc if và cấu trúc switch. Các câu lệnh này cho phép chương trình thực thi các
đoạn mã lệnh khác nhau dựa trên kết quả của biểu thức điều kiện hoặc giá trị
của biến.
3.1.1 Lệnh if lồng nhau
Câu lệnh if-else kiểm tra kết quả của biểu thức hoặc biến điều kiện rồi dựa trên
kết quả trả về để thực hiện các lệnh tương ứng. Câu lệnh if có thể được sử dụng
lồng trong một cấu trúc if khác, loại if này được gọi là nested-if. Như vậy, nested-
if là cấu trúc if được lồng trong cấu trúc if hoặc else khác.
Các điểm quan trọng cần lưu ý khi sử dụng lệnh if lồng nhau:
Câu lệnh else luôn luôn được kết hợp lệnh if gần nhất.
Nó nằm trong cùng khối với else và không kết hợp với else nào cả.
Learn Java by Example
34/114 AptechVietnam
Cú pháp:
if (Điều_kiện)
{
if (Điều_kiện)
{
//câu lệnh/khối lệnh này được thực hiện nếu điều kiện đúng
}
else
{
//câu lệnh/khối lệnh này được thực hiện nếu điều kiện sai
}
}
else
{
//câu lệnh/khối lệnh này được thực hiện nếu điều kiện sai
}
Đoạn mã dưới đây minh họa cách sử dụng cấu trúc nested-if
Đoạn mã 1:
Scanner input = new Scanner(System.in);
System.out.println(“Nhập một số: ”);
num = input.nextInt();
//Kiểm tra xem num có chia hết cho 3 không?
//câu lệnh if ngoài
if(num % 3 == 0)
{
//kiểm tra xem num có chia hết cho 5 không?
if(num % 5 == 0)
{
//in ra thông báo num chia hết cho 3 và 5
System.out.println(“The number is divisible by both 3 and 5.”);
}
else
{
//Số chia hết cho 3 nhưng không chia hết cho 5
System.out.println(“The number is divisible by 3 but not by 5.”);
}
}
else
{
//Số không chia hết cho 3 và 5
System.out.println(“The number is not divisible by 3 and 5.”);
}
Chương 3 Rẽ nhánh và vòng lặp
35/114
Giải thích đoạn mã lệnh
Đoạn mã trên khái báo một biến num và chứa số nguyên nhập vào từ người
dùng. Chương trình sử dụng cấu trúc if lồng nhau, đầu tiên chương trình kiểm tra
số nguyên người dùng nhập vào (biến num) có chia hết cho 3 và 5 hay chỉ chia
hết cho 3 và in ra các thông báo tương ứng. Ở đây, câu lệnh else cuối cùng
được kết hợp với if (num % 3 ==0). Câu lệnh else bên trong được kết hợp với if
(num % 5 == 0) bởi vì nó được kết hợp với if gần nhất trong cùng khối lệnh.
3.1.2 Lệnh Switch-case lồng nhau
Cấu trúc switch-case có thể được sử dụng thay thế cho cấu trúc if-else-if khi có
nhiều if-else lồng nhau. Sử dụng switch-case khiến khả năng thực thi của
chương trình tốt hơn. Tương tự như if-else, switch-case có thể sử dụng lồng
trong một switch-case khác.
Do switch-case định nghĩa các khối lệnh riêng, nên không có sự xung đột giữa
các hằng giá trị case của lệnh switch-case trong và lệnh switch-case ngoài. Đoạn
mã dưới đây minh họa cách sử dụng các lệnh switch-case:
Đoạn mã 2:
......
switch (day)
{
case 0:
switch(target)
{
case 1:
System.out.println(“Target is 1 to 7.”);
break;
}
break;
case 1:
System.out.println(“Sunday”);
break;
case 2:
System.out.println(“Monday”);
break;
case 3:
System.out.println(“Tuesday”);
break;
case 4:
System.out.println(“Wednesday”);
break;
......
}
Learn Java by Example
36/114 AptechVietnam
Trong đoạn mã trên, khối lệnh case 1 của switch-case trong không xung
đột/nhầm lẫn với khối lệnh case 1 của switch-case ngoài. Biến day được sử
dụng để so sánh với danh sách các khối case của switch-case ngoài, nếu giá trị
của biến day bằng 0 thì biến target mới được so sánh với danh sách các khối
case của switch-case bên trong.
Có ba điểm quan trọng cần lưu ý khi sử dụng cấu trúc switch-case;
 Cấu trúc switch khác với cấu trúc if. switch chỉ có thể kiểm tra bằng, trong
khi đó if có thể kiểm tra bất kỳ giá trị của biểu thức logic nào.
 Không cho phép 2 giá trị case giống nhau trong cùng một switch-case.
Nếu switch-case lồng nhau, giá trị của các hằng case của switch-case
trong và ngoài có thể giống nhau.
 Cấu trúc lệnh switch-case hiệu quả hơn sử dụng nhiều câu lệnh if-else
lồng nhau.
3.2 Vòng lặp
Vòng lặp được sử dụng rất phổ biến trong lập trình, nó được sử dụng để thực
hiện các câu lệnh lặp lại nhiều lần. Các loại vòng lặp được hỗ trợ trong Java
gồm:
- Vòng lặp while
- Vòng lặp do while
- Vòng lặp for
Vòng lặp thực hiện một lệnh (hoặc khối lệnh) chừng nào thõa mãn một điều kiện
hoặc thõa mãn số lần lặp xác định.
3.2.1 Vòng lặp while
Vòng lặp while dùng để thực hiện một lệnh hoặc khối lệnh chừng nào điều kiện
còn true (đúng). Tại một vị trí nào đó trong vòng lặp làm cho biểu thức điều kiện
thành false (sai), nếu không vòng lặp sẽ thực hiện vô tận.
Chương 3 Rẽ nhánh và vòng lặp
37/114
Cú pháp:
...
while(điều_kiện)
{
Các câu lệnh;
...
}
...
Thân của vòng lặp là rỗng nếu nó không chứa câu lệnh nào cả, về mặt cú pháp,
nó vẫn đúng trong Java. Đoạn mã dưới đây minh họa cách sử dụng thân vòng
lặp rỗng:
Đoạn mã 3:
......
int num1 = 1;
int num2 = 30;
while (++num1 < --num2);
System.out.println(“The midpoint is: ” + num1);
......
Trong đoạn mã trên, giá trị của biến num1 được tăng 1 và giá trị của biến num2
được giảm 1, sau đó đem so sánh. Vòng lặp được thực hiện chừng nào giá trị
của num1 lớn hoặc bằng num2. Do vậy, biến num1 có giá trị giữa num1 và
num2, kết quả in ra:
The midpoint is: 16
Learn Java by Example
38/114 AptechVietnam
Biểu thức điều kiện của vòng lặp có thể phức tạp, biến điều khiển có thể được
thay đổi giá trị trong thân vòng lặp. Tuy nhiên biểu thức điều kiện phải false (sai
hoặc không thõa) nếu không vòng lặp sẽ thực hiện vô tận. Đoạn mã dưới đây
minh họa vòng lặp vô tận:
Đoạn mã 4:
......
int count = 0;
while (count < 100)
{
System.out.println(“This goes on forever, HELP!!!”);
count = count + 10; //Tăng count lên 10 đơn vị
System.out.println(“Count = ” + count);
count = count - 10; //giảm count 10 đơn vị
System.out.println(“Count = ” + count);
}
......
Trong đoạn mã trên, giá trị của count luôn bằng 0 và nhỏ hơn 100. Vì vậy, biểu
thức điều kiện luôn luôn true (đúng), vòng lặp không bao giờ kết thúc. Một lệnh
break có thể được dùng để ngắt vòng lặp trong chương trình trên. Nếu có dòng
này ở cuối vòng lặp, vòng lặp chỉ thực hiện 1 lần và kết thúc, kết quả hiển thị:
This goes on forever, HELP!!!
Count = 10
Count = 0
Tuy nhiên, đây chỉ là minh họa cách sử dụng, trong thực tế chúng ta không dùng
như vậy.
Chương 3 Rẽ nhánh và vòng lặp
39/114
Điểm quan trọng cần lưu ý khi sử dụng vòng lặp while là, các biến điều khiển
(biến được sử dụng trong biểu thức điều kiện) phải được khai báo trước khi sử
dụng. Xem ví dụ dưới đây là không hợp lệ
while (int val = 10) { } //biểu thức điều khiển không hợp
lệ
3.2.2 Vòng lặp do-while
Vòng lặp do-while thực hiện các câu lệnh chừng nào điều kiện còn true (đúng).
Khác với vòng lặp while, vòng lặp do-while thực hiện các câu lệnh ít nhất một
lần sau đó biểu thức điều kiện mới được kiểm tra. Nếu điều kiện đúng, vòng lặp
tiếp tục thực hiện, nếu điều kiện sai, vòng lặp kết thúc. Đoạn mã dưới đây minh
họa cách sử dụng vòng lặp do-while
Đoạn mã 5:
......
int number = 5;
int guest;
Scanner input = new Scanner(System.in);
System.out.println(“Guess a number between 1 to 10”);
do
{
System.out.println(“Enter your guess: ”);
guess = input.nextInt();
if (guess > number)
{
System.out.println(“Value too high”);
}
if (guess < number)
Learn Java by Example
40/114 AptechVietnam
{
System.out.println(“Value too low”);
}
}while (guess != number);
System.out.println(“The answer is %d.”, number);
......
Trong đoạn mã trên, 2 biến number và guess được khai báo. Biến number được
gán giá trị 5, biến guess được nhập vào từ người dùng. Nếu giá trị người dùng
nhập vào bằng giá trị của biến number thì dòng lệnh println() in ra dòng “The
answer is 5.” còn nếu không thì vòng lặp tiếp tục thực hiện.
3.2.3 Vòng lặp for
Vòng lặp for được sử dụng khi người dùng biết trước số bước lặp. Khai báo của
vòng lặp for gồm 3 phần:
 Khai báo và khởi tạo giá trị của các biến
 Biểu thức logic
 Biểu thức điều khiển lặp
Ba phần khai báo này phân cách nhau bằng dấu chấm phẩy (;). Khi vòng lặp bắt
đầu, phần khai báo của vòng lặp được thực hiện. Thông thường, đây là biểu
thức khởi gán giá trị ban đầu và đóng vai trò là biến đếm điều khiển vòng lặp.
Biểu thức khởi tạo chỉ thực hiện duy nhất một lần. Tiếp đến, biểu thức logic được
thực hiện để kiểm tra biến điều khiển với giá trị của số lần lặp. Nếu biểu thức
logic có giá trị đúng thì vòng lặp tiếp tục thực hiện, ngược lại vòng lặp kết thúc.
Sau cùng, biểu thức điều khiển lặp được thực hiện, thông thường biểu thức lặp
dùng để tăng hoặc giảm giá trị của biến điều khiển.
Chương 3 Rẽ nhánh và vòng lặp
41/114
Trong phần khai báo và biểu thức lặp, chúng ta có thể sử dụng nhiều biến phân
cách nhau bởi dấu phẩy và thứ tự thực hiện từ trái qua phải. Thứ tự thực hiện
rất quan trọng nếu như giá trị của biểu thức thứ 2 phụ thuộc vào kết quả thực
hiện. Đoạn mã dưới đây minh họa cách sử dụng vòng lặp for với phân cách
nhiều biến khai báo:
Đoạn mã 6:
......
int i,j;
int max = 10;
System.out.println(“The sum of two variables for a table of
10 is: ”);
for(i=0,j=max;i<=max;i++,j--)
{
System.out.println(“n%d + %d = %d”,i,j,i+j);
}
......
Trong đoạn mã trên, 3 biến i, j, max được khai báo. Biến max được gán giá trị
bằng 10. Trong phần khởi tạo, biến i được gán bằng 0 và biến j được gán bằng
max = 10. Ở đây chúng ta thấy 2 biến được khởi tạo giá trị phân cách bởi dấu
phẩy. Biểu thức điều kiện; i<=max đảm bảo rằng vòng lặp thực hiện chừng nào i
còn nhỏ hơn hoặc bằng max=10.Vòng lặp sẽ kết thúc khi biểu thức điều kiện trả
về false (sai) có nghĩa lúc đó i = 11. Cuối cùng, biểu thức lặp cũng bao gồm 2
phép tính i++, j--. Sau mỗi bước lặp, i được tăng 1 đơn vị và j giảm 1 đơn vị.
Tổng của 2 biến này luôn luôn bằng max và bằng 10 được in ra. Kết quả của
đoạn mã trên như dưới đây:
The sum of two variables for a table of 10 is:
0 + 10 = 10
Learn Java by Example
42/114 AptechVietnam
1 + 9 = 10
2 + 8 = 10
3 + 7 = 10
4 + 6 = 10
5 + 5 = 10
6 + 4 = 10
7 + 3 = 10
8 + 2 = 10
9 + 1 = 10
10 + 0 = 10
Như thảo luận trong phần trước, có 3 phần trong khai báo vòng lặp for, tuy nhiên
bất kỳ một hoặc tất cả các phần trong khai báo for có thể để trống. Đoạn mã
dưới đây minh họa cách sử dụng vòng lặp for không sử dụng phần khai báo:
Đoạn mã 7:
......
//Khởi tạo giá trị của biến num
int num = 1;
for(; num != 40;num++)
{
System.out.println(“Enter a number: ”);
num = input.nextInt();
}
......
Trong đoạn mã trên, biến num được người dùng nhập vào cho đến khi có giá trị
bằng 40. Vòng lặp không có phần khởi tạo. Thay vào đó, num được khởi tạo ở
ngoài phần khai báo vòng lặp. Biến num được tăng lên 1. Vòng lặp sẽ kết thúc
Chương 3 Rẽ nhánh và vòng lặp
43/114
khi num bằng 40. Nếu cả 3 phần để trống, vòng lặp sẽ lặp vô tận. Đoạn mã dưới
đây minh họa cách sử dụng đó:
Đoạn mã 8:
......
for( ; ; )
{
System.out.println(“This will go on and on”);
}
......
Trong đoạn mã trên, dòng chữ “This will go on and on” được in cho đến khi
vòng lặp kết thúc. Câu lệnh break có thể dùng để kết thúc vòng lặp này. Đoạn
mã trên dẫn đến vòng lặp vô hạn, vòng lặp vô hạn khiến chương trình chạy
không giới hạn trong khoảng thời gian dài và sử dụng hết tài nguyên của hệ
thống, điều này dẫn đến treo hệ thống. Trong thực tế, chúng ta nên tránh sử
dụng loại vòng lặp kiểu này trong chương trình của mình.
3.2.4 Vòng lặp lồng nhau
Trong Java, chúng ta có thể sử dụng vòng lặp lồng nhau, đó là vòng lặp được
đặt trong một vòng lặp khác. Đoạn mã dưới đây minh họa cách sử dụng vòng lặp
lồng nhau:
Đoạn mã 9:
......
int num = 0;
//Lặp từ 0 cho đến 5 (lặp 6 lần)
System.out.println(“The factorials of the first five
Learn Java by Example
44/114 AptechVietnam
numbers are: ”);
do
{
int i = 1;
int factorial = 1;
System.out.println(“Factorial of “ + num + “ :”);
if(num==0)
{
System.out.println(factorial);
}else
{
while(num>=i)
{
factorial = factorial * i;
i++;
}
System.out.println(factorial);
}
num++;
}while(num < 6);
......
Trong đoạn mã trên, chương trình in ra giai thừa của các số từ 0 – 5. Câu lệnh
if-else được dùng để tính giai thừa của biến num. Lệnh được đặt trong vòng lặp
do-while. Kết quả hiển thị như sau:
The factorials of the first five numbers are:
Factorial of 0 : 1
Factorial of 1 : 1
Factorial of 2 : 2
Factorial of 3 : 6
Chương 3 Rẽ nhánh và vòng lặp
45/114
Factorial of 4 : 24
Factorial of 5 : 120
3.3 Câu lệnh nhảy
Đôi khi số bước lặp của vòng lặp không được biết trước. Điều kiện để kết thúc
vòng lặp được xác định sau, và ngay trong thân vòng lặp. Trong một số tình
huống khác, một số câu lệnh trong thân vòng lặp được bỏ qua dựa trên điều kiện
nào đó. Đáp ứng những yêu cầu đó, Java cung cấp hai lệnh nhảy đó là break và
continue dùng để thay đổi luồng điều khiển của chương trình dựa trên các điều
kiện. Do vậy, các câu lệnh nhảy này được sử dụng để chuyển điều khiển đến
phần khác của chương trình.
3.3.1 Lệnh break
Lệnh break thoát khỏi vòng lặp trong cùng và thực hiện câu lệnh tiếp theo sau
khối lệnh của vòng lặp ngoài. Câu lệnh break là câu lệnh độc lập, do vậy cần
phải kết thúc lệnh break bằng dấu chấm phẩy. Lệnh break không chỉ được sử
dụng trong vòng lặp for mà còn được sử dụng trong cả while và do-while. Các
câu lệnh sau break không được thực hiện. Ví dụ dưới đây minh họa cách sử
dụng break trong vòng lặp while.
Đoạn mã 10:
......
int i = 1;
int sum = 0;
while (i < 100)
{
sum = sum + i;
System.out.println(“Sum: “ + sum);
if(i==10)
break;
i++;
}
......
Learn Java by Example
46/114 AptechVietnam
Trong đoạn mã trên, vòng lặp while được thiết kế để chạy từ 1 đến 99 và tính
tổng của các số từ 1 đến 99. Nhưng câu lệnh break được sử dụng để kết thúc
vòng lặp khi i bằng 10. Do vậy kết quả được hiển thị như sau:
Sum: 1
Sum: 3
Sum: 6
Sum: 10
Sum: 15
Sum: 21
Sum: 28
Sum: 36
Sum: 45
Sum: 55
3.3.2 Lệnh continue
Câu lệnh continue chuyển điều khiển sang bước lặp kế tiếp và bỏ qua các câu
lệnh sau continue. Có nghĩa là khi gặp câu lệnh continue, các lệnh sau continue
trong thân vòng lặp sẽ không được thực hiện mà điều khiển sẽ được chuyển
sang bước lặp kế tiếp. Câu lệnh continue thường được sử dụng với một biểu
thức điều kiện trong thân vòng lặp như lệnh break. Lệnh continue sử dụng
được trong 3 loại vòng lặp: while, do-while và vòng lặp for. Với vòng lặp while,
do-while, lệnh continue chuyển điều khiển đến biểu thức điều khiển của vòng
lặp. Trong khi đó, với vòng lặp for, điều khiển nhảy đến phần biểu thức lặp (phần
thứ 3 trong khai báo vòng lặp) sau đó thực hiện tiếp biểu thức điều khiển. Đoạn
mã dưới đây minh họa cách sử dụng continue trong vòng lặp do-while:
Đoạn mã 11:
......
char letter = „A‟;
do
{
if(letter ==‟J‟ || letter == „L‟)
{
Chương 3 Rẽ nhánh và vòng lặp
47/114
letter++;
continue;
}
System.out.println(“Letter: ” + letter);
letter++;
}while(letter !=‟N‟)
...
Trong đoạn mã trên, các ký tự từ A đến M được in ra màn hình bằng vòng lặp
do-while. Lệnh continue bỏ qua 2 ký tự in ra là J và L.
3.4 Nhãn
Các câu lệnh trong Java có thể đánh nhãn. Nhãn thường được hay dùng với
vòng lặp for, while kết hợp với break hoặc continue. Nhãn được nhận diện bởi
tên định danh theo sau là dấu 2 chấm và đặt trước lệnh đánh nhãn.
Lệnh đánh nhãn được sử dụng trong trường hợp các vòng lặp lồng nhau. Nó
dùng để chỉ định vòng lặp lồng trong thực hiện bước lặp kế tiếp hay ngắt vòng
lặp. Đoạn mã dưới đây minh họa cách sử dụng nhãn
Đoạn mã 12:
int i;
outer:
for(i=0;i<5;i++)
{
if(i==2)
{
System.out.println("Hello");
break outer;
}
Learn Java by Example
48/114 AptechVietnam
System.out.println("This is the outer loop");
}
System.out.println("Good bye");
......
Trong đoạn mã trên, vòng lặp thực hiện 5 lần. Hai lần lặp đầu tiên chương trình
in ra dòng chữ “This is the outer loop”. Bước lặp thứ 3 giá trị của i = 2, do vậy
sẽ in ra dòng chữ “Hello”. Tiếp đến, lệnh break được thực hiện và chuyển điều
khiển đến nhãn outer: . Vòng lặp kết thúc và dòng lệnh cuối được in ra. Kết quả
hiển thị như sau:
This is the outer loop
This is the outer loop
Hello
Good bye
Đoạn mã dưới đây minh họa cách sử dụng lệnh continue
Đoạn mã 13:
......
outer:
for(i=0;i<5;i++)
{
if(j=0;j<5;j++)
{
System.out.println("Hello");
continue outer;
}
System.out.println("This is the outer loop");
}
Chương 3 Rẽ nhánh và vòng lặp
49/114
System.out.println("Good bye");
......
Trong đoạn mã trên, dòng chữ “Hello” được in ra 5 lần. Sau khi câu lệnh
continue được thực hiện, luồng điều khiển của chương trình được chuyển sang
bước lặp kế tiếp của vòng lặp có đánh nhãn. Cuối cùng, điều kiện của vòng lặp
ngoài (vòng lặp có đánh nhãn) trả về false, vòng lặp kết thúc và chương trình in
ra dòng chữ “Good bye”. Kết quả thực hiện như sau:
Hello
Hello
Hello
Hello
Hello
Good bye
Learn Java by Example
50/114 AptechVietnam
Tóm tắt bài học
 Luồng điều khiển chương trình được điều khiển bởi các cấu trúc lệnh rẽ
nhánh
 Các loại vòng lặp hỗ trợ trong Java gồm: while, do-while, for. Vòng lặp sử
dụng để thực hiện các câu lệnh một cách lặp lại
 Lệnh break và continue là các câu lệnh nhảy trong Java
 Lệnh break kết thúc vòng lặp lồng trong và thực hiện lệnh kế tiếp trong
khối lệnh của vòng lặp ngoài.
 Lệnh continue bỏ qua các câu lệnh nằm sau nó và thực hiện bước lặp tiếp
theo
 Lệnh nhãn thường được sử dụng với các vòng lặp như for, while.
AptechVietnam 51/114
Chương 4: Giới thiệu về lớp
Mục tiêu bài học
Kết thúc bài học này, học viên có thể nắm được những vấn đề sau:
 Tạo mảng đối tượng
 Khái niệm đệ qui trong Java
 Mô tả và sử dụng kiểu enum
 Thu gom rác (Garbage collection) trong Java và cơ chế hoạt động
4.1 Mảng các tham chiếu đối tượng
Trong Java, có thể khai báo mảng chứa các phần có bất kỳ kiểu dữ liệu nào, kể
cả kiểu tham chiếu đến đối tượng. Khi một mảng được tạo ra, tham chiếu đến
một lớp, ta nói đó là một mảng các đối tượng.
Các đối tượng được khởi tạo chỉ khi hàm dựng của đối tượng được gọi khi thực
thi chương trình. Sau khi đối tượng được khởi tạo, nó có thể truy nhập thông qua
biến đối tượng.
Nếu kiểu của mảng khai báo là một lớp thì các tham chiếu đến các đối tượng
của kiểu lớp được khai báo được lưu trong mảng. Do vậy, các thành phần của
mảng các đối tượng chỉ là các tham chiếu đến các đối tượng chứ không phải là
các thể hiện thực sự của các đối tượng.
4.2 Tạo mảng đối tượng
Learn Java by Example
52/114 AptechVietnam
Tạo mảng đối tượng thực hiện theo 3 bước như sau:
1. Khai báo biến có thể tham chiếu đến mảng đối tượng có kiểu thích hợp.
2. Tạo đối tượng mảng
3. Gán các phần tử mảng với các thể hiện của kiểu tương ứng.
Ví dụ dưới đây khai bảo mảng có tên emp_Array chứa 20 đối tượng của lớp
Employee;
Đoạn mã 1:
Employee [] emp_Array = new Employee[20];
Khởi tạo mảng bằng vòng lặp for
Đoạn mã 2:
for (int m=0;m<emp_Array.length;m++)
{
//khởi tạo mảng đối tượng
emp_Array[m] = new Employee();
}
Giá trị ngầm định của mỗi phần tử mảng đối tượng là null trừ khi các đối tượng
thực sự được tạo và tham chiếu của chúng được gán cho mỗi phần tử mảng.
Đoạn mã dưới đây minh họa cách khởi tạo các đối tượng
Đoạn mã 3:
Chương 4 Giới Thiệu về Lớp
53/114
emp_Array[0] = new Employee(“Derek”,121);
emp_Array[1] = new Employee(“Clark”,55);
Hoặc khởi tạo bằng cách khác như sau:
Đoạn mã 4:
Employee [2] emp_Array = {new Employee(“Derek”,121),new
Employee(“Clark”,55)};
4.3 Đệ qui trong Java
Trong lập trình, đệ qui là cách thức gọi lại chính nó (gọi lại chính hàm đó). Trong
thực tế, rất nhiều bài toán được biểu diễn và giải quyết bằng thuật toán đệ qui. Ví
dụ trong Java, tính giai thừa dùng đệ qui được biểu diễn như sau:
Đoạn mã 5:
public static int calculateFactorial(int n)
{
if(n==0)
return 1;
else
return n * calculateFactorial(n–1);
//lời gọi đệ qui
}
Đệ qui là phương thức gọi lại chính nó. Ở ví dụ trên, phương thức
calculateFactorial() gọi lại chính nó. Một điều lưu ý là làm sao để đảm bảo rằng
đến lúc nào đó thì lời gọi đệ qui kết thúc còn không chương trình sẽ chạy vô tận
và sử dụng hết tài nguyên của máy tính dẫn đến treo máy. Với minh họa ở trên
Learn Java by Example
54/114 AptechVietnam
chúng ta thấy đệ qui sẽ kết thúc khi n =0. Tình huống kết thúc đệ qui còn được
gọi là tình huống nền (base case) của đệ qui.
Tất cả các phương thức dùng thuật giải đệ qui có những đặc tính như sau:
 Số lần mà phương thức gọi lại chính nó còn được gọi là độ sâu của đệ qui
 Mỗi khi phương thức gọi chính nó, máy tính sẽ lưu các biến trong ngăn
xếp (stack). Stack là vùng nhớ hạn chế, do vậy với thuật giải đệ qui có độ
sâu lớn sẽ dẫn đến treo máy. Trường hợp như vậy được gọi là Stack
Overflow (tràn stack).
 Phương thức đệ qui có một điều kiện kết thúc. Trong ví dụ trên, phương
thức calculateFactorial() sẽ kết thúc khi n = 0. Nếu điều kiện này không có
thì phương thức sẽ gọi lại chính nó vô hạn. Trường hợp này được gọi là
đệ qui không điểm dừng.
 Tất cả các phương thức đệ qui đều có 2 giai đoạn. Giai đoạn thứ nhất
được gọi là Winding, xảy ra khi phương thức gọi lại chính nó và đẩy giá trị
vào stack. Giai đoạn thứ 2 được gọi là Unwinding, xảy ra khi phương thức
lấy giá trị từ stack ra.
Ví dụ dưới đây dùng thuật giải đệ qui để tính lũy thừa hai:
Ví dụ 1:
package test;
import Java.util.Scanner;
public class PowerOfTwo
{
public static void main(String [] args)
Chương 4 Giới Thiệu về Lớp
55/114
{
Scanner input = new Scanner(System.in);
int power, result;
System.out.println(“Calculate the power of two”);
System.out.println(“Enter an integer power: ”);
Power = input.nextInt();
Result = powerOfTwo(power);
System.out.println(“Two to power ” + power + “ is “ +
result);
return;
}
public static int powerOfTwo(int exponent)
{
if(exponent ==0)
return 1;
else
return (2 * powerOfTwo(exponent - 1));
}
}
4.4 Kiểu dữ liệu liệt kê (enum)
Giả sử bạn muốn biểu diễn các mùa trong năm trong chương trình, bạn có thể
sử dụng các con số 0, 1, 2, 3 tương ứng với mùa xuân, mùa hè, mùa thu và mùa
đông. Dùng theo cách này hệ thống hoạt động được nhưng không trực quan và
không rõ ràng. Đây không phải là giải pháp tốt để xây dựng những tình huống
như vậy. Chẳng hạn người ta có thể nhập sai các con số khác chứ không phải
các con số 0, 1, 2, 3 như mong muốn và không có cách gì để khống chế việc
nhập sai. Java hỗ trợ kiểu dữ liệu enum để giải quyết tốt những vấn đề trên. Với
kiểu dữ liệu enum, giá trị của nó là các tên tượng trưng.
4.5 Tạo kiểu liệt kê
Kiểu enum có thể có thứ tự hoặc không có thứ tự. Kiểu enum không thứ tự là
kiểu không có thứ tự logic. Ví dụ: kiểu dữ liệu boolean là một dạng của kiểu
Learn Java by Example
56/114 AptechVietnam
không thứ tự vì không có lập luận nào xác định true trước hay sau false. Với
kiểu enum có thứ tự, các giá trị có thể sắp xếp theo một trật tự logic.
4.5.1 Mục đích của enum
Kiểu enum được giới thiệu nhằm giúp liệt kê hiệu quả dãy các giá trị, ví dụ như
biểu diễn các ngày trong tuần. Ưu điểm của kiểu enum:
 Khắc phục được việc ánh xạ giữa số và chuỗi một cách tẻ nhạt. Kiểu
enum được sử dụng bằng các chuỗi thay cho các con số.
 Dùng số nguyên dùng để để thay cho kiểu liệt kê không an toàn. Chẳng
hạn, biến DaysOfWeek là biến nguyên để liệt kê ngày trong tuần, chúng ta
có thể gán giá trị bằng 9, như vậy là không hợp lệ. Rõ ràng, dùng số
nguyên thay cho kiểu liệt kê là không an toàn. Để giải quyết các hhược
điểm này người ta dùng kiểu liệt kê. Với kiểu liệt kê, chúng ta chỉ có thể
gán các giá trị đã được định nghĩa trước.
Trong Java, kiểu dữ liệu enum được định nghĩa bằng tứ khóa enum. Vì các giá
trị của nó là các hằng số, nên các trường của kiểu enum khai báo bằng chữ hoa.
Ví dụ dưới đây khai báo biến Months thuộc kiểu enum:
Đoạn mã 6:
public enum Months
{
JANUARY,
FEBRUARY,
MARCH,
APRIL,
MAY,
JUNE,
Chương 4 Giới Thiệu về Lớp
57/114
JULY,
AUGUST,
SEPTEMBER,
OCTOBER,
NOVEMBER,
DECEMBER
}
Kiểu enum sử dụng cú pháp khai báo như khai báo lớp, chỉ khác sử dụng từ
khóa enum thay cho class và được gọi là lớp đặc biệt. Phần thân của kiểu
enum có thể khai báo các phương thức cũng như các trường. Trình biên dịch sẽ
bổ sung thêm các phương thức đặc biệt khi enum được tạo ra. Chúng ta có thể
định nghĩa kiểu enum trong một tập tin riêng hoặc trong một tập tin định nghĩa
các lớp. Nếu định nghĩa kiểu enum public thì phải định nghĩa trong một tập tin
riêng biệt có tên trùng với tên enum.
Ví dụ dưới đây minh họa việc định nghĩa kiểu enum để biểu diễn lược đồ màu:
Đoạn mã 7:
enum ColorScheme
{
Red, Blue, Green, Cyan, Magenta, Yellow, Black
}
Sau khi định nghĩa kiểu enum, chúng ta có thể khai báo biến thuộc kiểu enum
như sau:
ColorScheme CMYK;
Sau đó gán giá trị cho biến:
CMYK = ColorScheme.Magenta;
In ra giá trị của biến ColorSchema bằng lệnh như sau:
System.out.println(“The color used is: ” + CMYK);
Learn Java by Example
58/114 AptechVietnam
Kết quả sẽ là:
The color used is: Magenta
4.6 Garbage Collection (GC) – Thu gom rác
Khi một đối tượng (Object) được tạo ra, nó được cấp phát vùng nhớ trong bộ
nhớ. Vùng nhớ này được gọi là Heap. Các đối tượng trong Java được tạo ra
bằng toán tử new và vùng nhớ của đối tượng được cấp phát trong Heap lúc
thực thi. Khi đối tượng trên Heap không còn được tham chiếu bởi chương trình,
chúng trở nên thích hợp cho thành phần thu gom rác (Garbage Collection), và
Java Heap được gọi là Garbage Collection Heap. Thuật ngữ “Garbage
Collection” (Thu gom rác) hàm ý các đối tượng trong Java khi không còn cần
thiết bởi chương trình, gọi là rác và có thể loại bỏ. Điều đó có nghĩa là vùng nhớ
cấp phát cho các đối tượng sẽ được tái sử dụng cho đối tượng mới tiếp sau.
Java Virtual Machine sẽ xác định những đối tượng nào mà không còn dùng
nữa và sẽ thu hồi vùng nhớ bị chiếm dụng.
Bên cạnh việc giải phóng vùng nhớ của các đối tượng không được tham chiếu,
Garbage Collector (bộ thu gom rác) còn giúp ngăn sự phân mãnh vùng nhớ
heap. Sự phân mãnh heap xảy ra trong quá trình chương trình thực thi. Trong
quá trình thực thi, các đối tượng được tạo ra và hủy bỏ khi không dùng đến nữa,
do đó dẫn đến tình trạng có các block (khối) rỗng nằm giữa các block đang dùng.
Khi yêu cầu vùng nhớ để cấp phát cho các đối tượng mới cần phải nới rộng kích
thước của heap mặc dù vẫn còn đủ vùng nhớ trong heap để cấp phát. Vấn đề
này thường hay xảy ra do không còn đủ vùng nhớ liên tục trong heap để cấp
phát.
Chương 4 Giới Thiệu về Lớp
59/114
Trong đặc tả JVM, chỉ vùng heap của JVM phải được thu gom rác. Nhưng không
định nghĩa cách thức bộ thu gom rác (Garbage Collector) hoạt động, mà mỗi nhà
phát triển JVM phải quyết định cách cài đặt.
4.6.1 Ưu điểm của GC (Garbage Collection)
GC làm giảm bớt gánh nặng cho lập trình viên trong việc giải phóng vùng nhớ.
Đối với lập trình viên, việc quyết định khi nào giải phóng vùng nhớ rất khó khăn
và đầy rủi ro, do vậy công việc này được giao cho JVM, điều này có nhiều ưu
điểm:
 Ưu điểm thứ nhất là tăng hiệu suất cho lập trình viên và cho phép họ tập
trung hơn vào việc lập trình.
 Thứ hai, GC đảm bảo tính toàn vẹn chương trình. GC là phần quan trọng
trong chiến lược bảo mật của Java. Lập trình viên Java không thể tình cờ
làm hỏng JVM do việc giải phóng sai vùng nhớ.
Nhược điểm tiềm ẩn của GC là làm tăng tài nguyên sử dụng và làm giảm hiệu
năng của chương trình. JVM luôn theo dõi những đối tượng nào đang được sử
dụng bởi chương trình và giải phóng những đối tượng không còn dùng nữa.
Hoạt động này gây tiêu tốn nhiều thời gian của CPU.
Learn Java by Example
60/114 AptechVietnam
Tóm tắt bài học
 Mảng đối tượng là một mảng chứa tham chiếu đến các đối tượng
 Đệ qui là hình thức gọi (gọi hàm) lại chính nó
 Kiểu enum là một danh sách hằng số và tập hữu hạn các giá trị có thể gán
cho biến.
 GC (Garbage Collection) là giải pháp quản lý vùng nhớ tự động
AptechVietnam 61/114
Chương 5: Arrays – Mảng
Mục tiêu của bài
Kết thúc bài học này, học viên có thể:
 Mô tả mảng trong Java
 Mô tả lớp String và những phương thức của nó
 Giải nghĩa lớp StringBuilder và những phương thức của nó
5.1 Giới thiệu về mảng (Arrays)
Mảng lưu trữ các phần tử cùng kiểu dữ liệu vào những vùng nhớ liên tiếp nhau.
Dữ liệu trong mảng có thể là kiểu dữ liệu nguyên thuỷ (primitive data type) hoặc
đối tượng. Giống như biến, giá trị trong mảng có thể được gán giá trị ngay lúc
tạo mảng. Nếu không có giá trị nào được gán cho mảng, thì Java sẽ gán giá trị
mặc định cho tất cả các phần tử trong mảng, tùy thuộc vào kiểu dữ liệu. Ví dụ,
những phần tử của mảng có kiểu dữ liệu là int, mặc định, được khởi gán là 0.
Mảng có thể là mảng một chiều hay mảng nhiều chiều. Một phần tử xác định
trong mảng được truy nhập bằng tên hoặc chỉ số. Phần tử đầu tiên trong mảng
có chỉ số là 0, phần tử thứ 2 có chỉ số là 1, và cứ tiếp tục như vậy. Mảng là
phương tiện thuận tiện để nhóm thông tin có liên quan với nhau.
Mảng có thể được tạo theo ba cách như bảng 5.1
Phương pháp Mô tả Cú pháp Ví dụ
Chỉ khai báo Khai báo một
mảng
datatype[]
identifier
char[] ch;
khai báo một mảng kiểu
ký tự tên là ch
Khai báo và
tạo mảng
Khai báo và cấp
phát vùng nhớ
cho các phần tử
trong mảng dùng
từ khoá new
datatype[]
identifier = new
datatype[size]
char[] ch = new
char[10];
khai báo và khởi tạo
một mảng ch để lưu 10
ký tự.
Khai báo, tạo
và khởi gán
giá trị cho các
phần tử
Khai báo mảng,
cấp phát vùng
nhớ và khởi gán
giá trị cho các
phần tử
datatype[]
identifier =
{value1,
value2,…valueN}
char[] ch =
{„A‟,‟B‟,‟C‟,‟D‟};
khai báo một mảng ch
bốn phần tử với các giá
trị được khởi gán
Bảng 5.1 : Tạo mảng
Learn Java by Example
62/114 AptechVietnam
5.1.1 Mảng ký tự
Mảng ký tự có thể được tạo như trong đoạn mã sau.
Đoạn mã 1:
char[] ch ={„A‟,‟B‟,‟C‟,‟D‟};
System.out.println(ch[3]);
Đoạn mã 1 tạo mảng một chiều có tên ch, với các giá trị khởi tạo A, B, C và D.
Dòng thứ hai in ra giá trị của phần tử có chỉ số 3, đó là D.
Trong Java, mảng nhiều chiều là một mảng có các thành phần một mảng khác,
ta cũng nói đó là mảng của các mảng. Mảng nhiều chiều các ký tự có thể được
tạo ra như đoạn mã 2.
Đoạn mã 2 :
Char [][] ch = {{„A‟,‟B‟,‟C‟,‟D‟}, {„E‟,‟F‟,‟G‟,‟H‟}};
System.out.println(ch[1][1]);
Đoạn mã 2 khởi tạo một mảng nhiều chiều với hai hàng và bốn cột. Dòng thứ 2
in ra giá trị của phần tử tại vị trí hàng 1, cột 1. Kết quả in ra là „F‟.
Đoạn mã 3 mô tả mảng chuỗi 2 chiều.
Đoạn mã 3:
String [][] names = {{“John”, “Andrews”, “David”,
“Scott”},{“- Manager”,” – CEO”}};
System.out.println(names[0][0] + names[0][1]);
System.out.println(names[0][2] + names[1][1]);
Đoạn mã 3 sẽ được hiển thị kết quả như:
John – Manager
David – CEO
Thuộc tính length có thể dùng để xác định kích thước của mảng hay số các phần
tử được lưu trong mảng.
System.out.println(ch.length);
Câu lệnh trên sẽ in ra kích thước của mảng
Chương 5 Mảng
63/114
5.1.2 Sắp xếp mảng
Luôn cần thiết để sắp xếp các phần tử trong mảng theo giá trị có thứ tự từ cao
đến thấp (thứ tự giảm dẫn - descending order) hoặc ngược lại (thứ tự tăng dần –
ascending order).
Quá trình sắp xếp mảng cần phải hoán đổi giá trị giữa các phần tử mảng. Có
nhiều cách khác nhau để sắp xếp mảng. Các cách sắp xếp giống nhau ở chỗ
chúng đều so sách mỗi phần tử trong mảng với phần tử khác và hoán đổi giá trị
nếu giá trị đặt sai vị trí.
Quá trình sắp xếp hoán đổi thực hiện với các phần tử bắt đầu tập giá trị. Kiểu
sắp xếp này so sánh giá trị của phần tử đầu tiên với mỗi phần tử tiếp theo và
thực hiện các hoán đổi cần thiết. Tiếp đến phần tử thứ hai sẽ được so sánh với
mỗi phần tử tiếp theo còn lại trong mảng và thực hiện các hoán đổi cần thiết.
Tương tự với các phần tử còn lại trong mảng đến khi không còn hoán đổi nào
xảy ra ở bước cuối cùng.
Hình 5.1 mô tả khái niệm của sắp xếp hoán đổi.
65 10 57 98 105 304
Hình 5.1 : Sắp xếp hoán đổi
Bảng 5.2 chỉ rõ các phần tử được sắp xếp theo thứ tự tăng dần sau mỗi bước.
Mỗi bước bắt đầu từ khi lấy một phần tử và so sánh với các phần tử còn lại tiếp
theo trong mảng, nếu cần thiết, thực hiện các hoán đổi giá trị của các phần tử.
Các giá trị gốc trong
mảng
65 10 57 98 105 304
Sau bước thứ nhất 304 10 57 65 98 105
Sau bước thứ hai 304 105 10 57 65 98
Sau bước thứ ba 304 105 98 10 57 65
Sau bước thứ tư 304 105 98 65 10 57
Sau bước thứ năm 304 105 98 65 57 10
Bảng 5.2: Giá trị của các thành phần sau mỗi bước trong sắp xếp hoán đổi.
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )

More Related Content

What's hot

đồ áN phân tích thiết kế hệ thống quản lý bán hàng siêu thị
đồ áN phân tích thiết kế hệ thống quản lý bán hàng siêu thịđồ áN phân tích thiết kế hệ thống quản lý bán hàng siêu thị
đồ áN phân tích thiết kế hệ thống quản lý bán hàng siêu thịThanh Hoa
 
Mô hình hóa yêu cầu
Mô hình hóa yêu cầuMô hình hóa yêu cầu
Mô hình hóa yêu cầuNguyen Tran
 
Ch3 Cay Qd
Ch3  Cay QdCh3  Cay Qd
Ch3 Cay QdJACDS
 
Hạn chế của giai cấp công nhân Việt Nam hiện nay
Hạn chế của giai cấp công nhân Việt Nam hiện nayHạn chế của giai cấp công nhân Việt Nam hiện nay
Hạn chế của giai cấp công nhân Việt Nam hiện nayVuKirikou
 
Bài 16 đến 25-TCD
Bài 16 đến 25-TCDBài 16 đến 25-TCD
Bài 16 đến 25-TCDKim Trương
 
Kế toán tài sản cố định và bất động sản đầu tư
Kế toán tài sản cố định và bất động sản đầu tưKế toán tài sản cố định và bất động sản đầu tư
Kế toán tài sản cố định và bất động sản đầu tưTuấn Anh
 
Các công cụ mô tả HTTT kế toán
Các công cụ mô tả HTTT kế toánCác công cụ mô tả HTTT kế toán
Các công cụ mô tả HTTT kế toánleemindinh
 
Mô hình hóa dữ liệu mức quan niệm
Mô hình hóa dữ liệu mức quan niệm Mô hình hóa dữ liệu mức quan niệm
Mô hình hóa dữ liệu mức quan niệm nataliej4
 
Bai tap ttck kem loi giai
Bai tap ttck kem loi giaiBai tap ttck kem loi giai
Bai tap ttck kem loi giaiQuynh Nga
 
Bai tap ttck kem loi giai
Bai tap ttck kem loi giaiBai tap ttck kem loi giai
Bai tap ttck kem loi giaiBichtram Nguyen
 
Báo cáo thực hành thực tập quản trị bán hàng công ty cổ phần bánh kẹo Kinh Đô
Báo cáo thực hành thực tập quản trị bán hàng công ty cổ phần bánh kẹo Kinh ĐôBáo cáo thực hành thực tập quản trị bán hàng công ty cổ phần bánh kẹo Kinh Đô
Báo cáo thực hành thực tập quản trị bán hàng công ty cổ phần bánh kẹo Kinh Đôluanvantrust
 
Hệ thống thông tin quản lý - Bài 2 Tổng quan về hệ thống thông tin (phần 2)
Hệ thống thông tin quản lý - Bài 2 Tổng quan về hệ thống thông tin (phần 2)Hệ thống thông tin quản lý - Bài 2 Tổng quan về hệ thống thông tin (phần 2)
Hệ thống thông tin quản lý - Bài 2 Tổng quan về hệ thống thông tin (phần 2)MasterCode.vn
 
BA DAY: 5 bước phân tích yêu cầu nghiệp vụ
BA DAY: 5 bước phân tích yêu cầu nghiệp vụ BA DAY: 5 bước phân tích yêu cầu nghiệp vụ
BA DAY: 5 bước phân tích yêu cầu nghiệp vụ Le Cuong
 
Giáo trình phân tích thiết kế hệ thống thông tin
Giáo trình phân tích thiết kế hệ thống thông tinGiáo trình phân tích thiết kế hệ thống thông tin
Giáo trình phân tích thiết kế hệ thống thông tinVõ Phúc
 

What's hot (20)

đồ áN phân tích thiết kế hệ thống quản lý bán hàng siêu thị
đồ áN phân tích thiết kế hệ thống quản lý bán hàng siêu thịđồ áN phân tích thiết kế hệ thống quản lý bán hàng siêu thị
đồ áN phân tích thiết kế hệ thống quản lý bán hàng siêu thị
 
Mô hình hóa yêu cầu
Mô hình hóa yêu cầuMô hình hóa yêu cầu
Mô hình hóa yêu cầu
 
Ch3 Cay Qd
Ch3  Cay QdCh3  Cay Qd
Ch3 Cay Qd
 
Hạn chế của giai cấp công nhân Việt Nam hiện nay
Hạn chế của giai cấp công nhân Việt Nam hiện nayHạn chế của giai cấp công nhân Việt Nam hiện nay
Hạn chế của giai cấp công nhân Việt Nam hiện nay
 
Bài 16 đến 25-TCD
Bài 16 đến 25-TCDBài 16 đến 25-TCD
Bài 16 đến 25-TCD
 
Kế toán tài sản cố định và bất động sản đầu tư
Kế toán tài sản cố định và bất động sản đầu tưKế toán tài sản cố định và bất động sản đầu tư
Kế toán tài sản cố định và bất động sản đầu tư
 
Bài tập hệ thống thông tin kế toán
Bài tập hệ thống thông tin kế toánBài tập hệ thống thông tin kế toán
Bài tập hệ thống thông tin kế toán
 
Xây dựng chiến lược phát triển của cty dược phẩm đến năm 2020
Xây dựng chiến lược phát triển của cty dược phẩm đến năm 2020Xây dựng chiến lược phát triển của cty dược phẩm đến năm 2020
Xây dựng chiến lược phát triển của cty dược phẩm đến năm 2020
 
Các công cụ mô tả HTTT kế toán
Các công cụ mô tả HTTT kế toánCác công cụ mô tả HTTT kế toán
Các công cụ mô tả HTTT kế toán
 
Luận văn: Marketing trong doanh nghiệp xây dựng, 9 ĐIỂM!
Luận văn: Marketing trong doanh nghiệp xây dựng, 9 ĐIỂM!Luận văn: Marketing trong doanh nghiệp xây dựng, 9 ĐIỂM!
Luận văn: Marketing trong doanh nghiệp xây dựng, 9 ĐIỂM!
 
Mô hình hóa dữ liệu mức quan niệm
Mô hình hóa dữ liệu mức quan niệm Mô hình hóa dữ liệu mức quan niệm
Mô hình hóa dữ liệu mức quan niệm
 
Bai tap ttck kem loi giai
Bai tap ttck kem loi giaiBai tap ttck kem loi giai
Bai tap ttck kem loi giai
 
Giáo trình tài chính doanh nghiệp
Giáo trình tài chính doanh nghiệpGiáo trình tài chính doanh nghiệp
Giáo trình tài chính doanh nghiệp
 
Bai tap ttck kem loi giai
Bai tap ttck kem loi giaiBai tap ttck kem loi giai
Bai tap ttck kem loi giai
 
Luận văn: Xây dựng ứng dụng web với HTML 5.0, HAY
Luận văn: Xây dựng ứng dụng web với HTML 5.0, HAYLuận văn: Xây dựng ứng dụng web với HTML 5.0, HAY
Luận văn: Xây dựng ứng dụng web với HTML 5.0, HAY
 
Báo cáo thực hành thực tập quản trị bán hàng công ty cổ phần bánh kẹo Kinh Đô
Báo cáo thực hành thực tập quản trị bán hàng công ty cổ phần bánh kẹo Kinh ĐôBáo cáo thực hành thực tập quản trị bán hàng công ty cổ phần bánh kẹo Kinh Đô
Báo cáo thực hành thực tập quản trị bán hàng công ty cổ phần bánh kẹo Kinh Đô
 
Đề tài: Thiết kế hệ thống thông tin quản lý phân phối Gas, HOT
Đề tài: Thiết kế hệ thống thông tin quản lý phân phối Gas, HOTĐề tài: Thiết kế hệ thống thông tin quản lý phân phối Gas, HOT
Đề tài: Thiết kế hệ thống thông tin quản lý phân phối Gas, HOT
 
Hệ thống thông tin quản lý - Bài 2 Tổng quan về hệ thống thông tin (phần 2)
Hệ thống thông tin quản lý - Bài 2 Tổng quan về hệ thống thông tin (phần 2)Hệ thống thông tin quản lý - Bài 2 Tổng quan về hệ thống thông tin (phần 2)
Hệ thống thông tin quản lý - Bài 2 Tổng quan về hệ thống thông tin (phần 2)
 
BA DAY: 5 bước phân tích yêu cầu nghiệp vụ
BA DAY: 5 bước phân tích yêu cầu nghiệp vụ BA DAY: 5 bước phân tích yêu cầu nghiệp vụ
BA DAY: 5 bước phân tích yêu cầu nghiệp vụ
 
Giáo trình phân tích thiết kế hệ thống thông tin
Giáo trình phân tích thiết kế hệ thống thông tinGiáo trình phân tích thiết kế hệ thống thông tin
Giáo trình phân tích thiết kế hệ thống thông tin
 

Similar to Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )

Tự học lập trình java b1
Tự học lập trình java  b1Tự học lập trình java  b1
Tự học lập trình java b1Tuyen Nguyen
 
OOP Review - Ôn tập Hướng Đối Tượng
OOP Review - Ôn tập Hướng Đối TượngOOP Review - Ôn tập Hướng Đối Tượng
OOP Review - Ôn tập Hướng Đối TượngNguyễn Quang Thiện
 
Print_to_OOP.pdf
Print_to_OOP.pdfPrint_to_OOP.pdf
Print_to_OOP.pdfcLong52
 
Chuong 06
Chuong 06Chuong 06
Chuong 06volll
 
Lap trinh huong_doi_tuong_cpp_dhct_lesson06
Lap trinh huong_doi_tuong_cpp_dhct_lesson06Lap trinh huong_doi_tuong_cpp_dhct_lesson06
Lap trinh huong_doi_tuong_cpp_dhct_lesson06xcode_esvn
 
Core java 3
Core java 3Core java 3
Core java 3. .
 
Giới thiệu về Rational Rose và Các diagram
Giới thiệu về Rational Rose và Các diagramGiới thiệu về Rational Rose và Các diagram
Giới thiệu về Rational Rose và Các diagramHuy Vũ
 
Lesson 06 : OOP and Access modifier
Lesson 06 : OOP and Access modifierLesson 06 : OOP and Access modifier
Lesson 06 : OOP and Access modifierHallo Patidu
 
OOP_01_Tong Quan LTHDT.pdf
OOP_01_Tong Quan LTHDT.pdfOOP_01_Tong Quan LTHDT.pdf
OOP_01_Tong Quan LTHDT.pdfssuserd01a5c
 
Báo cáo thực tập chuyên nghành lập trình Android GPSGroup
Báo cáo thực tập chuyên nghành lập trình Android GPSGroupBáo cáo thực tập chuyên nghành lập trình Android GPSGroup
Báo cáo thực tập chuyên nghành lập trình Android GPSGroupTinh Ngo
 

Similar to Lập Trình Hướng Đối Tượng trong Java ( Vietnamese ) (20)

Bai01 oop overview
Bai01 oop overviewBai01 oop overview
Bai01 oop overview
 
Tự học lập trình java b1
Tự học lập trình java  b1Tự học lập trình java  b1
Tự học lập trình java b1
 
lopvadoituong.pdf
lopvadoituong.pdflopvadoituong.pdf
lopvadoituong.pdf
 
OOP Review - Ôn tập Hướng Đối Tượng
OOP Review - Ôn tập Hướng Đối TượngOOP Review - Ôn tập Hướng Đối Tượng
OOP Review - Ôn tập Hướng Đối Tượng
 
Print_to_OOP.pdf
Print_to_OOP.pdfPrint_to_OOP.pdf
Print_to_OOP.pdf
 
Java
JavaJava
Java
 
Chuong 06
Chuong 06Chuong 06
Chuong 06
 
Oop 0
Oop 0Oop 0
Oop 0
 
Java Tieng Viet
Java Tieng VietJava Tieng Viet
Java Tieng Viet
 
Lap trinh huong_doi_tuong_cpp_dhct_lesson06
Lap trinh huong_doi_tuong_cpp_dhct_lesson06Lap trinh huong_doi_tuong_cpp_dhct_lesson06
Lap trinh huong_doi_tuong_cpp_dhct_lesson06
 
Core java 3
Core java 3Core java 3
Core java 3
 
Giới thiệu về Rational Rose và Các diagram
Giới thiệu về Rational Rose và Các diagramGiới thiệu về Rational Rose và Các diagram
Giới thiệu về Rational Rose và Các diagram
 
Chuong 06 lap trinh huong doi tuong
Chuong 06 lap trinh huong doi tuongChuong 06 lap trinh huong doi tuong
Chuong 06 lap trinh huong doi tuong
 
Lesson 06 : OOP and Access modifier
Lesson 06 : OOP and Access modifierLesson 06 : OOP and Access modifier
Lesson 06 : OOP and Access modifier
 
OOP_01_Tong Quan LTHDT.pdf
OOP_01_Tong Quan LTHDT.pdfOOP_01_Tong Quan LTHDT.pdf
OOP_01_Tong Quan LTHDT.pdf
 
Báo cáo thực tập chuyên nghành lập trình Android GPSGroup
Báo cáo thực tập chuyên nghành lập trình Android GPSGroupBáo cáo thực tập chuyên nghành lập trình Android GPSGroup
Báo cáo thực tập chuyên nghành lập trình Android GPSGroup
 
[Cntt] all java
[Cntt] all java[Cntt] all java
[Cntt] all java
 
Chapter1
Chapter1Chapter1
Chapter1
 
On thi kpdl
On thi kpdlOn thi kpdl
On thi kpdl
 
On thitotnghiep
On thitotnghiepOn thitotnghiep
On thitotnghiep
 

Recently uploaded

30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...Nguyen Thanh Tu Collection
 
GIÁO ÁN DẠY THÊM (KẾ HOẠCH BÀI DẠY BUỔI 2) - TIẾNG ANH 7 GLOBAL SUCCESS (2 CỘ...
GIÁO ÁN DẠY THÊM (KẾ HOẠCH BÀI DẠY BUỔI 2) - TIẾNG ANH 7 GLOBAL SUCCESS (2 CỘ...GIÁO ÁN DẠY THÊM (KẾ HOẠCH BÀI DẠY BUỔI 2) - TIẾNG ANH 7 GLOBAL SUCCESS (2 CỘ...
GIÁO ÁN DẠY THÊM (KẾ HOẠCH BÀI DẠY BUỔI 2) - TIẾNG ANH 7 GLOBAL SUCCESS (2 CỘ...Nguyen Thanh Tu Collection
 
Các điều kiện bảo hiểm trong bảo hiểm hàng hoá
Các điều kiện bảo hiểm trong bảo hiểm hàng hoáCác điều kiện bảo hiểm trong bảo hiểm hàng hoá
Các điều kiện bảo hiểm trong bảo hiểm hàng hoámyvh40253
 
sách sinh học đại cương - Textbook.pdf
sách sinh học đại cương   -   Textbook.pdfsách sinh học đại cương   -   Textbook.pdf
sách sinh học đại cương - Textbook.pdfTrnHoa46
 
TÀI LIỆU BỒI DƯỠNG HỌC SINH GIỎI LÝ LUẬN VĂN HỌC NĂM HỌC 2023-2024 - MÔN NGỮ ...
TÀI LIỆU BỒI DƯỠNG HỌC SINH GIỎI LÝ LUẬN VĂN HỌC NĂM HỌC 2023-2024 - MÔN NGỮ ...TÀI LIỆU BỒI DƯỠNG HỌC SINH GIỎI LÝ LUẬN VĂN HỌC NĂM HỌC 2023-2024 - MÔN NGỮ ...
TÀI LIỆU BỒI DƯỠNG HỌC SINH GIỎI LÝ LUẬN VĂN HỌC NĂM HỌC 2023-2024 - MÔN NGỮ ...Nguyen Thanh Tu Collection
 
1.DOANNGOCPHUONGTHAO-APDUNGSTEMTHIETKEBTHHHGIUPHSHOCHIEUQUA (1).docx
1.DOANNGOCPHUONGTHAO-APDUNGSTEMTHIETKEBTHHHGIUPHSHOCHIEUQUA (1).docx1.DOANNGOCPHUONGTHAO-APDUNGSTEMTHIETKEBTHHHGIUPHSHOCHIEUQUA (1).docx
1.DOANNGOCPHUONGTHAO-APDUNGSTEMTHIETKEBTHHHGIUPHSHOCHIEUQUA (1).docxTHAO316680
 
SÁNG KIẾN ÁP DỤNG CLT (COMMUNICATIVE LANGUAGE TEACHING) VÀO QUÁ TRÌNH DẠY - H...
SÁNG KIẾN ÁP DỤNG CLT (COMMUNICATIVE LANGUAGE TEACHING) VÀO QUÁ TRÌNH DẠY - H...SÁNG KIẾN ÁP DỤNG CLT (COMMUNICATIVE LANGUAGE TEACHING) VÀO QUÁ TRÌNH DẠY - H...
SÁNG KIẾN ÁP DỤNG CLT (COMMUNICATIVE LANGUAGE TEACHING) VÀO QUÁ TRÌNH DẠY - H...Nguyen Thanh Tu Collection
 
3-BẢNG MÃ LỖI CỦA CÁC HÃNG ĐIỀU HÒA .pdf - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI
3-BẢNG MÃ LỖI CỦA CÁC HÃNG ĐIỀU HÒA .pdf - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI3-BẢNG MÃ LỖI CỦA CÁC HÃNG ĐIỀU HÒA .pdf - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI
3-BẢNG MÃ LỖI CỦA CÁC HÃNG ĐIỀU HÒA .pdf - ĐIỆN LẠNH BÁCH KHOA HÀ NỘIĐiện Lạnh Bách Khoa Hà Nội
 
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...Nguyen Thanh Tu Collection
 
Đề cương môn giải phẫu......................
Đề cương môn giải phẫu......................Đề cương môn giải phẫu......................
Đề cương môn giải phẫu......................TrnHoa46
 
BỘ ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
BỘ ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...BỘ ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
BỘ ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...Nguyen Thanh Tu Collection
 
GIÁO TRÌNH KHỐI NGUỒN CÁC LOẠI - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI
GIÁO TRÌNH  KHỐI NGUỒN CÁC LOẠI - ĐIỆN LẠNH BÁCH KHOA HÀ NỘIGIÁO TRÌNH  KHỐI NGUỒN CÁC LOẠI - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI
GIÁO TRÌNH KHỐI NGUỒN CÁC LOẠI - ĐIỆN LẠNH BÁCH KHOA HÀ NỘIĐiện Lạnh Bách Khoa Hà Nội
 
Chuong trinh dao tao Su pham Khoa hoc tu nhien, ma nganh - 7140247.pdf
Chuong trinh dao tao Su pham Khoa hoc tu nhien, ma nganh - 7140247.pdfChuong trinh dao tao Su pham Khoa hoc tu nhien, ma nganh - 7140247.pdf
Chuong trinh dao tao Su pham Khoa hoc tu nhien, ma nganh - 7140247.pdfhoangtuansinh1
 
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...Nguyen Thanh Tu Collection
 
powerpoint lịch sử đảng cộng sản việt nam.pptx
powerpoint lịch sử đảng cộng sản việt nam.pptxpowerpoint lịch sử đảng cộng sản việt nam.pptx
powerpoint lịch sử đảng cộng sản việt nam.pptxAnAn97022
 
chuong-7-van-de-gia-dinh-trong-thoi-ky-qua-do-len-cnxh.pdf
chuong-7-van-de-gia-dinh-trong-thoi-ky-qua-do-len-cnxh.pdfchuong-7-van-de-gia-dinh-trong-thoi-ky-qua-do-len-cnxh.pdf
chuong-7-van-de-gia-dinh-trong-thoi-ky-qua-do-len-cnxh.pdfVyTng986513
 
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...Nguyen Thanh Tu Collection
 
Campbell _2011_ - Sinh học - Tế bào - Ref.pdf
Campbell _2011_ - Sinh học - Tế bào - Ref.pdfCampbell _2011_ - Sinh học - Tế bào - Ref.pdf
Campbell _2011_ - Sinh học - Tế bào - Ref.pdfTrnHoa46
 
PHÁT TRIỂN DU LỊCH BỀN VỮNG Ở TUYÊN QUANG
PHÁT TRIỂN DU LỊCH BỀN VỮNG Ở TUYÊN QUANGPHÁT TRIỂN DU LỊCH BỀN VỮNG Ở TUYÊN QUANG
PHÁT TRIỂN DU LỊCH BỀN VỮNG Ở TUYÊN QUANGhoinnhgtctat
 
TỔNG HỢP ĐỀ THI CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN NĂM ...
TỔNG HỢP ĐỀ THI CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN NĂM ...TỔNG HỢP ĐỀ THI CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN NĂM ...
TỔNG HỢP ĐỀ THI CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN NĂM ...Nguyen Thanh Tu Collection
 

Recently uploaded (20)

30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
 
GIÁO ÁN DẠY THÊM (KẾ HOẠCH BÀI DẠY BUỔI 2) - TIẾNG ANH 7 GLOBAL SUCCESS (2 CỘ...
GIÁO ÁN DẠY THÊM (KẾ HOẠCH BÀI DẠY BUỔI 2) - TIẾNG ANH 7 GLOBAL SUCCESS (2 CỘ...GIÁO ÁN DẠY THÊM (KẾ HOẠCH BÀI DẠY BUỔI 2) - TIẾNG ANH 7 GLOBAL SUCCESS (2 CỘ...
GIÁO ÁN DẠY THÊM (KẾ HOẠCH BÀI DẠY BUỔI 2) - TIẾNG ANH 7 GLOBAL SUCCESS (2 CỘ...
 
Các điều kiện bảo hiểm trong bảo hiểm hàng hoá
Các điều kiện bảo hiểm trong bảo hiểm hàng hoáCác điều kiện bảo hiểm trong bảo hiểm hàng hoá
Các điều kiện bảo hiểm trong bảo hiểm hàng hoá
 
sách sinh học đại cương - Textbook.pdf
sách sinh học đại cương   -   Textbook.pdfsách sinh học đại cương   -   Textbook.pdf
sách sinh học đại cương - Textbook.pdf
 
TÀI LIỆU BỒI DƯỠNG HỌC SINH GIỎI LÝ LUẬN VĂN HỌC NĂM HỌC 2023-2024 - MÔN NGỮ ...
TÀI LIỆU BỒI DƯỠNG HỌC SINH GIỎI LÝ LUẬN VĂN HỌC NĂM HỌC 2023-2024 - MÔN NGỮ ...TÀI LIỆU BỒI DƯỠNG HỌC SINH GIỎI LÝ LUẬN VĂN HỌC NĂM HỌC 2023-2024 - MÔN NGỮ ...
TÀI LIỆU BỒI DƯỠNG HỌC SINH GIỎI LÝ LUẬN VĂN HỌC NĂM HỌC 2023-2024 - MÔN NGỮ ...
 
1.DOANNGOCPHUONGTHAO-APDUNGSTEMTHIETKEBTHHHGIUPHSHOCHIEUQUA (1).docx
1.DOANNGOCPHUONGTHAO-APDUNGSTEMTHIETKEBTHHHGIUPHSHOCHIEUQUA (1).docx1.DOANNGOCPHUONGTHAO-APDUNGSTEMTHIETKEBTHHHGIUPHSHOCHIEUQUA (1).docx
1.DOANNGOCPHUONGTHAO-APDUNGSTEMTHIETKEBTHHHGIUPHSHOCHIEUQUA (1).docx
 
SÁNG KIẾN ÁP DỤNG CLT (COMMUNICATIVE LANGUAGE TEACHING) VÀO QUÁ TRÌNH DẠY - H...
SÁNG KIẾN ÁP DỤNG CLT (COMMUNICATIVE LANGUAGE TEACHING) VÀO QUÁ TRÌNH DẠY - H...SÁNG KIẾN ÁP DỤNG CLT (COMMUNICATIVE LANGUAGE TEACHING) VÀO QUÁ TRÌNH DẠY - H...
SÁNG KIẾN ÁP DỤNG CLT (COMMUNICATIVE LANGUAGE TEACHING) VÀO QUÁ TRÌNH DẠY - H...
 
3-BẢNG MÃ LỖI CỦA CÁC HÃNG ĐIỀU HÒA .pdf - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI
3-BẢNG MÃ LỖI CỦA CÁC HÃNG ĐIỀU HÒA .pdf - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI3-BẢNG MÃ LỖI CỦA CÁC HÃNG ĐIỀU HÒA .pdf - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI
3-BẢNG MÃ LỖI CỦA CÁC HÃNG ĐIỀU HÒA .pdf - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI
 
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
 
Đề cương môn giải phẫu......................
Đề cương môn giải phẫu......................Đề cương môn giải phẫu......................
Đề cương môn giải phẫu......................
 
BỘ ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
BỘ ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...BỘ ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
BỘ ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
 
GIÁO TRÌNH KHỐI NGUỒN CÁC LOẠI - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI
GIÁO TRÌNH  KHỐI NGUỒN CÁC LOẠI - ĐIỆN LẠNH BÁCH KHOA HÀ NỘIGIÁO TRÌNH  KHỐI NGUỒN CÁC LOẠI - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI
GIÁO TRÌNH KHỐI NGUỒN CÁC LOẠI - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI
 
Chuong trinh dao tao Su pham Khoa hoc tu nhien, ma nganh - 7140247.pdf
Chuong trinh dao tao Su pham Khoa hoc tu nhien, ma nganh - 7140247.pdfChuong trinh dao tao Su pham Khoa hoc tu nhien, ma nganh - 7140247.pdf
Chuong trinh dao tao Su pham Khoa hoc tu nhien, ma nganh - 7140247.pdf
 
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
 
powerpoint lịch sử đảng cộng sản việt nam.pptx
powerpoint lịch sử đảng cộng sản việt nam.pptxpowerpoint lịch sử đảng cộng sản việt nam.pptx
powerpoint lịch sử đảng cộng sản việt nam.pptx
 
chuong-7-van-de-gia-dinh-trong-thoi-ky-qua-do-len-cnxh.pdf
chuong-7-van-de-gia-dinh-trong-thoi-ky-qua-do-len-cnxh.pdfchuong-7-van-de-gia-dinh-trong-thoi-ky-qua-do-len-cnxh.pdf
chuong-7-van-de-gia-dinh-trong-thoi-ky-qua-do-len-cnxh.pdf
 
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
 
Campbell _2011_ - Sinh học - Tế bào - Ref.pdf
Campbell _2011_ - Sinh học - Tế bào - Ref.pdfCampbell _2011_ - Sinh học - Tế bào - Ref.pdf
Campbell _2011_ - Sinh học - Tế bào - Ref.pdf
 
PHÁT TRIỂN DU LỊCH BỀN VỮNG Ở TUYÊN QUANG
PHÁT TRIỂN DU LỊCH BỀN VỮNG Ở TUYÊN QUANGPHÁT TRIỂN DU LỊCH BỀN VỮNG Ở TUYÊN QUANG
PHÁT TRIỂN DU LỊCH BỀN VỮNG Ở TUYÊN QUANG
 
TỔNG HỢP ĐỀ THI CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN NĂM ...
TỔNG HỢP ĐỀ THI CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN NĂM ...TỔNG HỢP ĐỀ THI CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN NĂM ...
TỔNG HỢP ĐỀ THI CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN NĂM ...
 

Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )

  • 1. AptechVietnam 1/114 Chương 1: Giới thiệu về Java Mục tiêu bài học Kết thúc bài học này, học viên có thể:  Tìm hiểu các thực thể trong thế giới thực như là các đối tượng  Định nghĩa một đối tượng phần mềm  Tìm hiểu và giải thích cấu trúc của một lớp  So sánh các lớp và các đối tượng  Tìm hiểu tầm quan trọng của Java  Tìm hiểu bộ JDK và các công cụ của nó  Tìm hiểu về máy ảo Java - Java Virtual Machine (JVM) 1.1 Giới thiệu về lớp và đối tượng Các đối tượng (object) và các lớp (class) là nền tảng để xây dựng Java. Lớp là một khuôn mẫu, bao gồm một tập các đối tượng có tính chất tượng tự nhau. Lớp mô tả tất cả các thuộc tính của một tập các đối tượng cụ thể. 1.1.1 Các thực thể trong thế giới thực như là các đối tượng Đối tượng là khái niệm dùng để mô tả các thực thể trong thế giới thực. Ví dụ các đối tượng có thể nhainf thấy quanh ta như: Chó - Dogs, Ô tô - Cars, bông hoa - Flowers, ngôi nhà – Houses, … Bất kỳ một thực thể hữu hình hoặc có thể sờ mó được nào đó, đều có thể xem như như một đối tượng trong thế giới thực. Mỗi đối tượng có các thuộc tính hoặc tính chất nhằm mô tả nó là cái gì. Ví dụ, các thuộc tính của đối tượng Dog là:  Giống  Màu lông  Tuổi Ngoài ra, một đối tượng có thể thực hiện các hành động. Chẳng hạn, các hành động của Dog có thể thực hiện là:  Sủa  Ăn
  • 2. Learn Java by Example 2/114 AptechVietnam  Chạy Như vậy, hai yếu tố quan trọng nhất của đối tượng trong thế giới thực là: thuộc tính (Attribute) và hành động (Action). Nhờ đó, đối tượng có thể được định nghĩa như một thực thể tồn tại, có các thuộc tính và hành động hoàn toàn xác định. Tương tự như vậy, trong phạm vi của công nghệ phần mềm, các đối tượng cũng được mô tả dựa theo trạng thái và hành vi của nó. Trạng thái của một đối tượng phần mềm được định nghĩa bởi các thuộc tính của nó. Các hoạt động của một đối tượng phần mềm được định nghĩa như là các hành vi của nó. Hãy xem xét một đối tượng trong thế giới thực, chẳng hạn Dog, một con chó. Nếu đối tượng này được ánh xạ đến một đối tượng phần mềm, trạng thái của nó có thể là màu lông, giống và tuổi. Hành vi của đối tượng Dog có thể là sủa, ăn, chạy, … Vì vậy, một đối tượng phần mềm là một thực thể bao gồm các trạng thái (thuộc tính) và hành vi (hành động). Nó lưu giữ các trạng thái của nó trong các trường, được gọi là các biến trong ngôn ngữ lập trình. Còn các hành vi được xem như là các phương thức, giống như các hàm trong ngôn ngữ lập trình. Một phương thức là một chuỗi các câu lệnh được đặt tên nhằm thực hiện các tác vụ cụ thể nào đó. Tham khảo hình 1.1, đây là ví dụ về đối tượng „Cashier‟ (Thủ quỹ) Hình 1.1: Đối tượng „Cashier‟ và đối tượng „Customer‟ Các thuộc tính của đối tượng „Cashier‟ là:  Tên  Chức vụ  Tuổi Một đối tượng thực thi một số hành động. Các hành động của đối tượng ‟Cashier‟ là:
  • 3. Chương 1 Giới thiệu về Java 3/114  Thu tiền từ khách hàng  In hoá đơn Sự thuận lợi khi sử dụng đối tượng là:  Nó giúp chúng ta hiểu hơn về thế giới thực  Nó ánh xạ các thuộc tính và các hành động của các đối tượng trong thế giới thực thành trạng thái và hành vi của các đối tượng phần mềm. 1.1.2 Class (Lớp) Như đề cập ở trên, Dog là một ví dụ về một đối tượng trong thế giới thực. Tuy nhiên, trong thế giới thực có nhiều loại động vật khác như mèo, cừu, cọp, …Vì vậy, Dog chỉ là một thể hiện của lớp động vật. Các thuộc tính và hành động chung của một số đối tượng được nhóm lại thành một đơn vị. Đơn vị này có thể được dùng để tạo ra một đại diện của loại tương ứng, gọi là lớp. Mỗi một lớp mô tả một tập các đối tượng riêng lẻ. Một lớp là một khuôn mẫu hoặc bản thiết kế định nghĩa đặc điểm chính của trạng thái và hành vi cho tất cả các đối tượng thuộc về lớp. Tất cả các thể hiện của lớp, được gọi là đối tượng, sẽ có chung các trạng thái và hành vi. Tuy nhiên, các thuộc tính và hành động có thể được gán chỉ sau khi một đối tượng được tạo ra. Khi đối tượng được tạo ra ta mới có một đại diện thật sự của thực thể. Vì vậy, lớp là một mô hình khái niệm của thực thể. Nó mô tả các thuộc tính và hành động chung chứ không riêng cho một đối tượng cụ thể nào. Ví dụ, xem xét một lớp có tên Animal (Động vật) như trong bảng 1.1. Lớp chứa các thuộc tính (trạng thái) và hành động (hành vi) của động vật. Class Animal Type Animal Name Color Motion Breathing Eating Bảng 1.1: Mô tả lớp Animal Lớp này có trạng thái „Type‟, „Animal Name‟ và „Color‟. Trong đó, Type - Mô tả loài động vật. Animal name - Tên loại động vật, chẳng hạn cừu, cọp, ếch, …
  • 4. Learn Java by Example 4/114 AptechVietnam Color - Mô tả màu da/ lông của loài đó „Motion‟ (Di chuyển), „Breathing‟ (Thở) và „Eating‟ (Ăn) là các hành vi của lớp Animal. 1.1.3 So sánh giữa lớp (class) và đối tượng (object) Có sự khác biệt giữa một lớp và một đối tượng. Một lớp mô tả một thực thể, trong khi một đối tượng là một thực thể thật sự. Đối tượng là vật thật, trong khi lớp là một mô hình khái niệm định nghĩa tất cả các trạng thái và hành vi cần thiết của một đối tượng. Một lớp là một nguyên mẫu (prototype) của một đối tượng. Nó định rõ các hành động và các tính chất cần thiết cho một loại đối tượng cụ thể. Bảng 1.2 là ví dụ về lớp và đối tượng. Class (Lớp) Object (Đối tượng) Animal Cat Dog Car Honda City Benz Bảng 1.2: Ví dụ về lớp và đối tượng Lớp không thay đổi, trong khi dữ liệu chứa trong một đối tượng có thể thay đổi. Các thuộc tính của lớp được thiết lập trong suốt thời gian chay chương trình, không thể thêm bớt thuộc tính trong lúc chương trình đang chạy. Khi một đối tượng được tạo từ một lớp, nó sẽ là một thành phần của lớp đó cho đến khi bị huỷ bỏ. Sự tồn tại của đối tượng có hạn chế, đối tượng sẽ được tạo ra và hủy bỏ theo đúng trình tự. Mỗi đối tượng được gọi là một thể hiện của một lớp. Trong ví dụ bên dưới, Employee là một lớp, còn các đối tượng là: Cashier, System Administrator, Stock Manager, Salesman, Purchase Manager.
  • 5. Chương 1 Giới thiệu về Java 5/114 Hình 1.2: Các đối tượng và lớp. 1.2 Giới thiệu về Java Vào năm 1995, hãng Sun Microsystem giới thiệu một ngôn ngữ lập trình mới là Java. Cho đến giờ, từ “Java” chỉ có nghĩa là tên một hòn đảo ở Indonesia hoặc một kiểu cách pha café nào đó. 1.2.1 Sự cần thiết của Java Java là một ngôn ngữ dành cho các nhà lập trình chuyên nghiệp. Java được xây dựng trên cơ sở ngôn ngữ lập trình C và C++. Nó kế thừa cú pháp của C và các nét đặc trưng của C++. Một nhóm kỹ sư của hãng Sun Microsystem cần thiết kế một ngôn ngữ cho các thiết bị điện tử như tivi, máy giặt, …Vì vậy, mục đích cơ bản là phát triển ngôn ngữ để tạo ra phần mềm có thể nhúng trong các thiết bị điện tử. Trong ngôn ngữ C và C++ trình biên dịch phụ thuộc vào loại CPU riêng biệt. Các trình biên dịch rất đắt và mất nhiều thời gian để tạo ra. Do đó, không thể có trình biên dịch cho mọi loại CPU. Và yêu cầu là cần có cách dễ dàng và hiệu quả để tạo ra các trình biên dịch. Ngoài ra, phần mềm phải nhỏ, nhanh, hiệu quả và độc lập nền tảng, nghĩa là mã chương trình có thể thực hiện trên nhiều CPU khác nhau dưới các môi trường khác nhau. Trong nỗ lực tạo ra một ngôn ngữ độc lập nền tảng và khả chuyển, James Gosling và nhóm cộng sự đi tiên phong
  • 6. Learn Java by Example 6/114 AptechVietnam trong vấn đề này. Kết quả là sự ra đời của ngôn ngữ Java. Đầu tiên nó được gọi là “Oak”, sau đó được đổi tên thành Java. Ngày nay, Java đã có những bước phát triển hết sức thành công và được chấp nhận bởi hàng triệu lập trình viên trên toàn thế giới. Java là một ngôn ngữ lập trình phổ dụng, được dùng để viết các chương trình có thể chạy được trên Internet. Nét đặc trưng chính của Java là ngôn ngữ hướng đối tượng và độc lập nền tảng. Độc lập nền tảng có nghĩa là chương trình có thể chạy trên nhiều nền tảng khác nhau như: Microsoft Windows, Apple Macintosh, Linux, …Java không những được dùng cho các ứng dụng độc lập, các chương trình trên mạng, mà còn được dùng trong các thiết bị tiêu dùng như: điện thoại, các thiết bị cầm tay, … 1.2.2 Các đặc trưng của ngôn ngữ Java  Hướng đối tượng (Object-oriented) Java là một ngôn ngữ hướng đối tượng. Trong Java không có các hằng, biến hoặc hàm độc lập. Nghĩa là tất cả đều là một phần của đối tượng. Các hằng, biến và hàm được truy nhập thông qua các lớp và các đối tượng. Các ngôn ngữ hướng đối tượng lai ghép khác như C++, có đặc điểm của ngôn ngữ cấu trúc cộng thêm sự mở rộng đối tượng. Ví dụ, C++ là một ngôn ngữ hướng đối tượng, nhưng lập trình theo hướng cấu trúc, phương thức main() nằm ngoài bất kỳ lớp và đối tượng nào. Java thì không cho phép cách khai báo này. Trong Java, phương thức main() chỉ được khai báo bên trong một lớp.  Độc lập nền tảng (Platform independent) Java là một nền tảng để phát triển ứng dụng. Nó có thể được dùng như một ngôn ngữ. Nền tảng ở đây là sự kết hợp giữa phần cứng và phần mềm hệ thống mà hầu hết các phần mềm đều chạy được. Ví dụ, bộ xử lý Intel chạy trên nền Windows XP là một nền tảng. Độc lập nền tảng nói đến khả năng của chương trình di chuyển từ một nền tảng này sang một nền tảng khác không có bất kỳ một khó khăn nào. Độc lập nền tảng trong Java ở mức mã nguồn và mã bytecode (mã trung gian). Java là một ngôn ngữ định kiểu mạnh mẽ, nghĩa là phải cần khai báo kiểu dữ liệu cho mọi biến. Kiểu dữ liệu trong Java là đồng nhất trong tất cả các nền tảng phát triển. Java có các lớp thư viện cơ sở. Điều này cho phép các lập trình viên có thể di chuyển mã từ nền tảng này đến một nền tảng khác mà không cần viết lại mã.
  • 7. Chương 1 Giới thiệu về Java 7/114 Nói tóm lại, độc lập nền tảng ở mức mã nguồn cho phép di chuyển mã nguồn từ một hệ thống này sang một hệ thống khác, biên dịch và thực hiện êm xuôi trên mọi hệ thống. Sử dụng mã bytecode, Java đã giải quyết vấn đề độc lập nền tảng. Không giống như trình biên dịch của C, trình biên dịch Java đưa ra một định dạng đặc biệt, đó là bytecode, giống nhau trên mọi nền tảng. Các chương trình Java được biên dịch thành bytecode vẫn cần một trình thông dịch để thực thi nó trên bất kỳ một nền tảng đã định sẵn nào. Công việc của trình thông dịch là đọc mã bytecode và chuyển nó thành ngôn ngữ máy. Để chạy Java trên một máy tính hoặc một hệ điều hành mới, chỉ cần trình thông dịch và một vài gói thư viện cần thiết. Bởi vì bytecode là độc lập nền tảng.  Mạnh mẽ Java là ngôn ngữ định kiểu mạnh mẽ. Nó được thiết kế để viết các phần mềm có độ tin cậy cao và mạnh. Tuy nhiên, nó yêu cầu phải khai báo các phương thức một cách rõ ràng. Java kiểm tra lỗi cú pháp tại thời điểm biên dịch, và tại thời điểm thông dịch. Vì vậy, nó chắc chắn loại bỏ một số lỗi trong lập trình. Java không có con trỏ và phép tính con trỏ. Nó kiểm tra tất cả truy nhập đến mảng và chuỗi tại thời điểm chạy chương trình. Ngoài ra nó còn kiểm tra sự chuyển kiểu của đối tượng từ kiểu này đến kiểu khác tại thời điểm chạy chương trình. Trong các môi trường lập trình truyền thống, lập trình viên phải tự cấp phát bộ nhớ. Kết thúc chương trình, lập trình viên phải giải phóng vùng bộ nhớ này. Các sự cố sẽ nảy sinh khi lập trình viên quên giải phóng bộ nhớ. Trong Java, lập trình viên không cần quan tâm đến việc giải phóng bộ nhớ. Nó được thực hiện tự động bởi bộ thu gom rác (garbage collection).  An toàn (Secure) Virus máy tính là nguyên nhân gây ra sự lo lắng trong việc sử dụng máy tính. Trước khi có Java, các lập trình viên phải quét virus các tập tin trước khi tải về và thực hiện chúng. Thông thường việc này cũng không loại trừ hoàn toàn virus. Ngoài ra, chương trình khi thực thi có khả năng tìm kiếm và đọc các thông tin nhạy cảm trên máy của người sử dụng mà người sử dụng không hề hay biết. Java cung cấp một môi trường quản lý việc thực thi chương trình. Nó cho rằng không có một đoạn mã nào là an toàn cả. Vì thế, Java không chỉ là ngôn ngữ lập
  • 8. Learn Java by Example 8/114 AptechVietnam trình thuần tuý mà còn cung cấp nhiều mức để kiểm soát tính an toàn khi thực thi chương trình. Ở mức đầu tiên, dữ liệu và các phương thức được truy nhập thông qua các interface (giao tiếp) do lớp cung cấp. Java không hỗ trợ các phép toán con trỏ. Do đó, nó không cho phép truy nhập trực tiếp đến các vùng nhớ và cung cấp cơ chế thu gom rác giúp thu hồi bộ nhớ không sử dụng. Các đặc trưng này giúp Java an toàn tối đa và có khả năng khả chuyển cao. Trong mức thứ hai, trình biên dịch kiểm soát để đảm bảo mã là an toàn, và tuân theo các nguyên tắc của Java. Mức thứ ba, được đảm bảo bởi trình thông dịch. Chúng kiểm tra xem bytecode phải đảm bảo các qui tắc an toàn trước khi thực thi. Mức thứ tư, kiểm soát việc nạp các lớp vào bộ nhớ để giám sát việc vi phạm giới hạn truy xuất trước khi nạp vào hệ thống.  Phân tán (Distributed) Java có thể được dùng để phát triển các ứng dụng trên nhiều nền tảng, hệ điều hành và nhiều giao tiếp người dùng đồ hoạ. Java được thiết kế để hỗ trợ các ứng dụng trên mạng. Do đó, Java được dùng như là một công cụ phát triển trên môi trường Internet.  Đa luồng (Multithreaded) Đa luồng là yếu tố cần thiết cho một ngôn ngữ như Java. Một ứng dụng thực hiện một tác vụ trong khi đang chờ người dùng nhập liệu. Trong một ứng dụng đồ hoạ trên mạng như một trình duyệt web, thường có rất nhiều tác vụ xảy ra tại một thời điểm. Java cung cấp hỗ trợ cho xử lý gọi là “multithreading” để thực hiện nhiều tác vụ đồng thời. Java cung cấp cơ chế đồng bộ nhiều xử lý. Cơ chế này cũng hỗ trợ cho luồng (thread) giúp các ứng dụng tương tác trên mạng chạy êm xuôi.  Động (Dynamic) Java được thiết kế như một ngôn ngữ động để đáp ứng cho những môi trường mở. Mã nguồn Java được lưu trữ trong tập tin có dạng .java. Trình biên dịch sẽ biên dịch chúng thành bytecode chứa trong tập tin .class. Mỗi tập tin .java thường được biên dịch thành một tập tin .class. Đầu tiên trình biên dịch kiểm tra đường dẫn trên thư mục hiện hành và các thư mục khác được xác định trong biến môi trường CLASSPATH. Điều này cần thiết giúp xác định các lớp khác được tham chiếu trong tập tin nguồn. Ví dụ, nếu tập tin được biên dịch phụ thuộc vào các tập tin không được biên dịch khác, trình biên dịch sẽ cố tìm và biên dịch chúng. Trình biên dịch có thể điều khiển sự phụ thuộc vòng tròn cũng như các phương thức được sử dụng trước khi được khai báo. Nó cũng xác định tập tin nguồn có thay đổi so với lần biên dịch cuối cùng hay không. Vì vậy, trình biên dịch khá thông minh.
  • 9. Chương 1 Giới thiệu về Java 9/114  Kiến trúc trung lập (Architecture-neutral) Công nghệ Java được thiết kế để hỗ trợ các ứng dụng sẽ được triển khai trong các môi trường không đồng nhất trên mạng. Trong các môi trường như vậy, các ứng dụng phải có khả năng thực thi tốt trên nhiều kiến trúc phần cứng. Các chương trình Java được biên dịch thành một định dạng bytecode không phụ thuộc kiến trúc có thể thực thi trên nhiều nền tảng phần cứng và phần mềm. Vì vậy, vấn đề phân phối nhị phân và phiên bản được giải quyết bởi bản chất thông dịch của công nghệ Java. Các chương trình Java chạy trên bất kỳ hệ thống nào có hỗ trợ máy ảo Java. Điều này không những hữu ích trên mạng mà còn có ích trên các hệ thống phân tán.  Khả chuyển (Portable) Khả chuyển là hệ quả của kiến trúc trung lập. Công nghệ Java có được khả năng khả chuyển là nhờ vào định nghĩa chặt chẽ của ngôn ngữ. Nó chỉ rõ kích thước của các kiểu dữ liệu cơ bản để loại trừ sự phụ thuộc cài đặt và hành vi của các toán tử số học. Hệ thống Java bản thân là khả chuyển. Trình biên dịch Java được viết bằng Java, trong khi hệ thống thực thi Java được viết bằng ANSI C với ranh giới khả chuyển rõ ràng.  Hiệu suất cao (high performance) Hiệu suất luôn được cân nhắc. So với các ngôn ngữ kịch bản thông dịch mức cao, Java có hiệu suất cao nhất. Bộ thu gom rác tự động thực hiện như luồng ngầm bên dưới, có độ ưu tiên thấp nhất, đảm bảo khả năng khả chuyển cao nhất. Sun khẳng định khả năng thực thi của bytecode chuyển thành mã máy tốt gần như C hoặc C++. 1.3 Giới thiệu JDK Sun Microsystems cung cấp ngôn ngữ Java trong sản phẩm gọi là Java Development Kit (JDK). JDK bao gồm các công cụ phát triển, môi trường thực thi (Java Runtime Environment hay JRE), các thư viện, các chương trình demo và mã nguồn. Một số công cụ nằm trong JDK dùng phát triển các ứng dụng Java được mô tả dưới đây:  Trình biên dịch Java, „Javac‟ Trình biên dịch dịch mã nguồn Java thành tập tin class. Trình biên dịch javac được dùng để biên dịch các tập tin mã nguồn Java thành bytecode. Mã nguồn Java có thể được tạo ra bằng bất kỳ trình soạn thảo văn bản nào, chẳng hạn Notepad Cú pháp: Javac [option] source
  • 10. Learn Java by Example 10/114 AptechVietnam Trong đó, source - 1 hoặc nhiều tên tập tin có phần mở rộng là .java option - Các tuỳ chọn dòng lệnh Ví dụ, Javac FirstProgram.java Câu lệnh này sẽ tạo ra một tập tin có tên „FirstProgram.class‟. Tập tin class này sẽ chạy trên máy ảo Java (JVM). Một vài tuỳ chọn của câu lệnh javac được mô tả trong bảng 1.3 Tùy chọn (Option) Mô tả -classpath Xác định rõ vị trí chứa các lớp được tham chiếu trong mã nguồn (được lưu trong biến môi trường CLASSPATH) -d Xác định thư mục đích chứa các tập tin .class -g In tất cả các thông tin gỡ lỗi thay cho số dòng và tên tập tin mặc định. -verbose Hiển thị các thông tin đầu ra mỗi lần lớp được nạp và tập tin nguồn được biên dịch. -version Hiển thị thông tin về phiên bản -sourcepath Cho biết vị trí lớp -help Hiển thị các tuỳ chọn chuẩn Bảng 1.3: Các tuỳ chọn của trình biên dịch Javac Xem xét ví dụ sau sử dụng tuỳ chọn –d: javac –d c:FirstProgram.java Câu lệnh này sẽ biên dịch và lưu tập tin „FirstProgram.class‟ trong ổ đĩa C.  Trình thông dịch Java, „Java‟ Trình thông dịch Java được sử dụng để thực thi mã bytecode. Nó lấy đối số là tên tập tin .class để thực thi hoặc tên tập tin lưu trữ Java gọi là jar. Cú pháp:
  • 11. Chương 1 Giới thiệu về Java 11/114 java [option] classname [arguments] Trong đó, option - Các tuỳ chọn dòng lệnh classname - Tên tập tin class được dùng arguments - Đối số được truyền vào cho hàm main Ví dụ, Java FirstProgram Một vài tuỳ chọn của câu lệnh Java được mô tả trong bảng 1.4 Tùy chọn Mô tả -classpath Xác định rõ vị trí chứa các lớp cần (được lưu trong biến môi trường CLASSPATH) -v hoặc –verbose Hiển thị các thông tin đầu ra mỗi lần lớp được nạp và tập tin nguồn được biên dịch. -version Hiển thị thông tin về phiên bản và thoát -jar Sử dụng tên tập tin JAR thay cho tập tin class -help Hiển thị thông tin trợ giúp về lệnh Java và thoát -X Hiển thị thông tin và các tùy chọn phi chuẩn và thoát Bảng 1.4: Các tuỳ chọn của trình thông dịch Java 1.4 Máy ảo Java (Java Virtual Machine - JVM) Máy ảo Java là trái tim của ngôn ngữ lập trình Java. Môi trường Java bao gồm năm phần tử sau:  Ngôn ngữ  Ðịnh nghĩa Bytecode  Các thư viện lớp Java/Sun  Máy ảo Java (JVM)  Cấu trúc của tập tin .class
  • 12. Learn Java by Example 12/114 AptechVietnam Đặc tính khả chuyển của tập tin .class cho phép các chương trình Java viết một lần chạy mọi nơi (“Write once, run anywhere”). Đặc tính này có được nhờ sự cài đặt máy ảo Java (JVM). 1.4.1 Máy ảo Java là gì? Lập trình viên cần thiết phải biết máy ảo Java là gì và cách làm việc của nó. Điều này sẽ giúp ta tận dụng được điểm mạnh của JVM và tránh những điểm yếu. Máy ảo là một khái niệm phần mềm dựa trên ý tưởng của máy tính tưởng tượng. Nó có tập hợp các lệnh logic để xác định các hoạt động của máy tính. Máy ảo có thể được xem như một hệ điều hành thu nhỏ. Nó thiết lập các lớp trừu tượng cho: phần cứng bên dưới, hệ điều hành, mã biên dịch. Trình biên dịch chuyển mã nguồn thành tập các lệnh của máy ảo không phụ thuộc vào phần cứng riêng biệt. Trình thông dịch là một ứng dụng hiểu các lệnh của máy ảo và chuyển các lệnh đó thành các lệnh thực hiện trên phần cứng bên dưới. Máy ảo, về cơ bản, tạo ra một hệ thống thực thi giúp thực hiện các mã lệnh bằng cách:  Nạp các tập tin .class Các trình “Class Loaders” là một trong các thành phần cơ bản của kiến trúc máy ảo Java. Nó cho phép máy ảo Java nạp các lớp mà không cần biết bất cứ thứ gì về ngữ nghĩa hệ thống tập tin và cho phép các ứng dụng nạp các lớp Java như các module mở rộng.  Quản lý bộ nhớ Máy ảo Java quản lý bộ nhớ theo các cách sau:  Khi một máy ảo Java được triệu gọi để chạy một ứng dụng, nó yêu cầu hệ điều hành cấp đủ bộ nhớ cho bản thân JVM chạy và bộ nhớ trống cho các ứng dụng tạo các đối tượng mới.  Khi một đối tượng mới được tạo, JVM cấp phát bộ nhớ cho đối tượng đó từ vùng nhớ trống.  Khi vùng nhớ trống giảm xuống sau khi tạo một số đối tượng, JVM yêu cầu hệ điều hành cấp thêm.  Khi một đối tượng không còn được dùng nó sẽ bị huỷ bỏ. Bộ nhớ bị chiếm dụng sẽ được giải phóng và trả lại vùng bộ nhớ trống.  Khi vùng nhớ trống bị chiếm giữ, và không thể xin cấp thêm vùng nhớ từ hệ điều hành thì JVM tạm dừng ứng dụng và đưa ra thông báo lỗi “Out of memory error”.  Thực hiện thu gom “rác” (Garbage Collection) Quá trình thu gom rác là giải phóng bộ nhớ đang sử dụng của một đối tượng ngay khi nó kết thúc, nghĩa là đối tượng đó không được truy nhập sau một thời
  • 13. Chương 1 Giới thiệu về Java 13/114 gian dài. Quá trình này xảy ra tự động và an toàn đối với các đối tượng không còn cần tham chiếu đến nữa. Khi máy ảo Java thực thi mã, một thanh ghi cục bộ gọi là „program counter‟ được dùng. Thanh ghi này trỏ đến các lệnh đang được thực thi hiện tại. Nếu cần thiết, các lệnh này sửa nội dung thanh ghi này để thay đổi luồng thực thi. Mặt khác, luồng được thực hiện tuần tự nên nó trỏ từ lệnh này đến lệnh khác. Một khái niệm phổ biến khác được dùng trong Java là trình biên dịch JIT – Just- In-Time. Các trình duyệt web như Netscape Navigator, Internet Explorer bao gồm trình biên dịch JIT nhằm tăng tốc độ thực thi mã Java. Mục đích chính của JIT là chuyển đổi mã bytecode sang mã máy ứng với từng bộ vi xử lý cụ thể. Các lệnh này được lưu trữ và dùng bất cứ lúc nào, được gọi như là một phương thức xác định. Hình 1.3 hiển thị mối quan hệ giữa trình biên dịch Java và JIT. Hình 1.3: Mối quan hệ giữa trình biên dịch Java và JIT Mã chương trình được biên dịch và chạy thông qua một máy ảo thay cho vi xử lý của máy tính. Bằng cách sử dụng cách tiếp cận này, mã nguồn Java có thể chạy trên bất kỳ nền tảng nào, nó được biên dịch và chạy thông qua máy ảo Java. Máy ảo Java không biết gì về ngôn ngữ lập trình Java, nó chỉ nhận ra một định dạng nhị phân xác định của một file gọi là file class. Các chương trình Java được biên dịch thành mã bytecode có thể tuyền trên mạng và thực thi bởi máy ảo Java. Mỗi file class chứa định nghĩa của một lớp hoặc một giao tiếp. File bytecode có phần tên mở rộng là .class
  • 14. Learn Java by Example 14/114 AptechVietnam Tóm Tắt Bài Học  Một đối tượng là một thể hiện của một lớp.  Một lớp định nghĩa một thực thể trên giới hạn của các tính chất và hành động phổ biến.  Một lớp định nghĩa một thực thể, trong khi đó một đối tượng là một thực thể thực sự.  Java là một ngôn ngữ thông dịch và biên dịch.  Các tính năng của Java: o Hướng đối tượng o Độc lập nền tảng o Mạnh mẽ o An toàn o Phân tán o Đa luồng o Động o Kiến trúc trung lập o Khả chuyển o Hiệu suất cao  Sun Microsystems giới thiệu ngôn ngữ Java như là một sản phẩm dưới tên gọi Java Development Kit (JDK)  Bên trong máy ảo, Java tạo ra một hệ thống thời gian thực giúp thực thi mã lệnh như sau: o Nạp các files .class o Quản lý bộ nhớ o Thực thi việc thu gom rác
  • 15. AptechVietnam 15/114 t Chương 2: Biến và toán tử Mục tiêu bài học Kết thúc bài học này, học viên có thể:  Cú pháp khai báo biến  Định nghĩa các kiểu dữ liệu cơ bản  Tìm hiểu và giải thích cấu trúc của một lớp  Mô tả các kiểu định dạng  Mô tả các ký tự đặc biệt (escape sequences)  Xác định các toán tử khác nhau 2.1 Biến Biến là đơn vị lưu trữ cơ bản trong chương trình Java. Biến là các thành phần xác định dữ liệu và được dùng để tham chiếu đến các giá trị xác định được tạo ra trong chương trình. Đặt tên các biến có ý nghĩa giúp ta dễ dàng đọc hiểu mã nguồn hơn. 2.1.1 Khai báo biến Tất cả các biến phải được khai báo trước khi sử dụng. Dạng khai báo biến cơ bản là: datatype variablename; Trong đó, datatype - Kiểu dữ liệu hợp lệ variablename - Tên biến hợp lệ Các biến có thể khai báo và khởi tạo theo nhiều cách khác nhau, được minh hoạ trong đoạn mã 1. Đoạn mã 1: Line0: int x,y,z; //Khai báo 3 biến kiểu int x,y //và z
  • 16. Learn Java by Example 16/114 AptechVietnam Line1: int a=5,b,c=10; //Khai báo 3 biến kiểu int //, khởi tạo a và c Line2: byte num=20; // Khai báo 1 biến num có kiểu //byte và khởi tạo giá trị là 20 Line3: char c=‟c‟; //Khai báo c là biến có kiểu //char, khởi tạo giá trị là c Line4: int num1=num2=10; //Giá trị 10 được lưu trữ //trong num1 và num2 Line0 và Line1 là các ví dụ về khai báo danh sách các biến được cách nhau bởi dấu phẩy và Line4 là ví dụ về gán một giá trị cho một hoặc nhiều biến lúc khai báo biến. Đoạn mã 2 là một ví dụ về gán các giá trị hệ bát phân (8) và hệ thập lục phân (16) cho các biến. Đoạn mã 2: Line1: int decVal = 10;//giá trị 10 trong hệ // thập phân (hệ 10) Line2: int octVal = 012;//giá trị 10 trong hệ // bát phân (hệ 8) Line3: int hexVal = 0xa;//giá trị 10 trong hệ // thập lục phân (hệ 16) Đoạn mã 2 hiển thị cú pháp đúng để chứa các giá trị trong hệ bát phân và hệ thập lục phân. Line2 biểu diễn một định dạng trong hệ bát phân với tiếp đầu ngữ 0. Hệ thống số bác phân có 8 ký tự số từ 0 đến 7 để mô tả các số. Line3 biểu diễn định dạng trong hệ thập lục phân với tiếp đầu ngữ 0x. Hệ thống số thập lục phân có 16 ký tự số để mô tả các số, từ 0 đến 9 và từ ký tự A đến F. Từ A đến F tương ứng từ 10 đến 15. Ví dụ, giá trị 26 trong hệ 16 là: int hexVal = 0x1a; Hệ thống thập phân được mô tả trong Line1, là cách dùng thông dụng trong lập trình.
  • 17. Chương 2 Biến và toán tử 17/114 2.1.2 Khai báo hằng (literals) Hằng là một giá trị không đổi và được mô tả trực tiếp trong đoạn mã mà không cần đến tính toán. Ví dụ, Đoạn mã 3: Line1: int val = 50; Line2: float num = 35.7F; Line3: char x = „x‟; Một hằng được sử dụng ở bất kỳ nơi nào cho phép kiểu giá trị của nó. Tuy nhiên, có nhiều kiểu hằng khác nhau. Một vài trong số chúng là:  Hằng nguyên (Integer literals) Hằng nguyên được dùng để biểu diễn một giá trị nguyên (int), trong Java là một giá trị số nguyên 32 bit. Trong một chương trình, số nguyên là kiểu thường được sử dụng nhất. Bất kỳ một giá trị số nguyên nào đều là một hằng số nguyên. Các số nguyên có thể biểu diễn như:  Các giá trị thập phân được biểu diễn trong hệ cơ số 10  Các giá trị bát phân được biểu diễn trong hệ cơ số 8  Các giá trị thập lục phân được biểu diễn trong hệ cơ số 16 Mỗi một loại trên có hằng tương ứng. Một hằng số nguyên có thể được gán đến một kiểu số nguyên khác như byte hoặc long. Khi một giá trị hằng được gán đến một biến kiểu byte hoặc short, sẽ không có lỗi nếu giá trị hằng nằm trong phạm vi của kiểu đích. Các số nguyên có thể được biểu diễn với một ký tự hoa („L‟)hoặc thường („l‟) ở cuối, để biểu diễn một số nguyên dài 64 bit.  Hằng dấu chấm động (floating-point literals) Các hằng số thực biểu diễn các giá trị thập phân với phần lẻ. Các hằng số thực có các thành phần sau:  Thành phần số, ví dụ 0, 1, 2, …, 9  Dấu thập phân, ví dụ 4.90, 3.141  Số mũ được biểu diễn bởi E hoặc e đi theo sau một số thập phân có thể dương hoặc âm. Ví dụ: e+208, 7.436E6, 23763E-05, …  Kiểu hậu tố D, d, F hoặc f
  • 18. Learn Java by Example 18/114 AptechVietnam Trong Java, các hằng số thực, ngầm định, có độ chính xác double. Một hằng float được biểu diễn bởi F hoặc f, theo sau là giá trị, và một hằng số thực double được biểu diễn bởi D hoặc d.  Hằng Boolean (boolean literals) Các hằng boolean đơn giản và chỉ có hai giá trị logic là true và false. Các giá trị này không thể chuyển đổi đến bất kỳ hệ thống số nào. Trong Java, true không bằng 1 và false không bằng 0. Nó chỉ có thể gán đến các biến được khi báo là boolean hoặc dùng trong các biểu thức với các toán tử boolean.  Hằng ký tự (character literals) Các hằng ký tự được đặt trong cặp dấu ngoặc đơn. Tất cả các ký tự ASCII hợp lệ có thể đặt trực tiếp trong cặp dấu ngoặc đơn, như „g‟, „$‟ và „z‟.  Hằng Null (null literals) Khi một đối tượng được tạo, lượng bộ nhớ xác định được cấp phát cho đối tượng. Địa chỉ bắt đầu của bộ nhớ được lưu trong đối tượng, đó là, một biến tham chiếu. Tuy nhiên đôi khi, biến tham chiếu không tham chiếu đến đối tượng. Trong hợp này, biến tham chiếu được gán một hằng null như ví dụ bên dưới: obj = null ;  Hằng chuỗi (String literals) Hằng chuỗi chứa chuỗi các ký tự trong cập dấu ngoặc kép. Các ký tự có thể là ký tự thường, có thể đọc được trên màn hình, hoặc ký tự điều khiển, không nhìn thấy được trên màn hình. Các dấu vạch chéo ngược, dấu nháy kép và các ký tự điều khiển khác có thể được biểu diễn bằng dấu chéo ngược () đi kèm với mã điều khiển, các ký tự này còn gọi là escape sequences. Ví dụ sau là một xâu thường, không có ký tự điều khiển: “Welcome to Java” 2.2 Kiểu dữ liệu (Data type)
  • 19. Chương 2 Biến và toán tử 19/114 Các ứng dụng xử lý dữ liệu đầu vào và xuất dữ liệu kết quả. Đầu vào, đầu ra, và kết quả của các quá trình tính toán đều liên quan đến dữ liệu. Trong môi trường tính toán, dữ liệu được phân lớp theo các tiêu chí khác nhau phụ thuộc vào bản chất của nó. Ở mỗi tiêu chí, dữ liệu có một tính chất xác định và có một kiểu thể hiện riêng biệt. Java cung cấp một vài kiểu dữ liệu mà chúng được hỗ trợ trên tất cả các nền tảng. Ví dụ, dữ liệu loại int (integer) của Java được thể hiện bằng 4 bytes trong bộ nhớ của tất cả các loại máy bất luận ở đâu chạy chương trình Java. Bởi vậy các chương trình Java không cần phải thay đổi khi chạy trên các nền khác nhau. Trong Java kiểu dữ liệu được chia thành hai loại:  Các kiểu dữ liệu nguyên thủy (primitive)  Các kiểu dữ liệu tham chiếu (reference) 2.2.1 Các kiểu dữ liệu nguyên thuỷ (Primitive Data Type) Java hỗ trợ tám kiểu dữ liệu nguyên thuỷ được chia ra thành 4 nhóm:  Kiểu số nguyên (Integer) Trong nhóm này có các kiểu dữ liệu: byte, short, int và long và, hầu hết, biểu diễn các giá trị số nguyên có dấu.  Kiểu dấu chấm động (Floating-point) Trong nhóm này có các kiểu dữ liệu: float và double và biểu diễn các số có phần thập phân.  Kiểu ký tự (Character) Nhóm này có kiểu dữ liệu char, biểu diễn các ký hiệu trong tập hợp các ký tự như ký tự chữ cái và ký tự số.  Kiểu Boolean Kiểu dữ liệu boolean thuộc nhóm này và biểu diễn cho hai giá trị true (Đúng) hoặc false (Sai).
  • 20. Learn Java by Example 20/114 AptechVietnam Kiểu dữ liệu số nguyên gồm 4 loại:  Kiểu byte Dùng để lưu trữ lượng dữ liệu nhỏ. Đây là kiểu dữ liệu có độ dài 8 bit, phạm vi lưu trữ từ -128 đến 127. Nó thường được dùng khi làm việc với luồng dữ liệu từ mạng hoặc từ file. Kiểu dữ liệu này thường dùng khi làm việc với dữ liệu nhị phân chuẩn và có thể không tương thích với các kiểu dữ liệu khác của Java. Từ khoá byte được dùng trong khai báo một biến kiểu này. Ví dụ: byte val;  Kiểu short Đây là kiểu dữ liệu ít dùng nhất. Có độ dài 16 bit và phạm vi lưu trữ từ - 32.768 đến 32.767. Kiểu dữ liệu này thường dùng cho các ứng dụng trên các máy tính 16 bit. Kiểu dữ liệu này cũng được dùng để lưu trữ dữ liệu số nhỏ. Từ khoá short dùng để khai báo biến kiểu này.  Kiểu int Đây là kiểu dữ liệu thường dùng nhất. Nó có độ dài 32 bit, với phạm vi lưu trữ từ -2.147.483.648 đến 2.147.483.647. Kiểu int là kiểu linh hoạt và hiệu quả nhất. Ví dụ: Tổng số lương phải trả cho tất cả nhân viên trong công ty.  Kiểu long long là kiểu dữ liệu 64 bit có dấu, với phạm vi lưu trữ từ -9.223.372.036.854.775.808 đến +9.223.372.036.854.775.807. Nó được dùng khi kiểu int không đủ để lưu một số lớn hơn phạm vi của nó. Ví dụ, dân số của một nước. 2.2.2 Các kiểu dữ liệu tham chiếu Trong Java, các đối tượng và các mảng là các biến tham chiếu. Khi một đối tượng hoặc một mảng được tạo, một vùng nhớ nhất định được gán cho nó và địa chỉ của vùng nhớ này được lưu trữ trong biến tham chiếu. Nói cách khác, kiểu dữ liệu tham chiếu là địa chỉ của một đối tượng hoặc một mảng được tạo ra trong bộ nhớ.
  • 21. Chương 2 Biến và toán tử 21/114 2.3 Định dạng nhập và xuất Bất cứ khi nào kết quả hiển thị trên màn hình, thì cần phải được định dạng. Java cung cấp các ký tự điều khiển định dạng (escape sequence) để thực hiện định dạng các dữ liệu nhập và xuất 2.3.1 Định dạng xuất Có thể định dạng theo 2 cách:  print() và println()  format() Các phương thức này hoạt động tương tự nhau. Phương thức format()dùng lớp Java.util.Formatter để thực hiện nhiều định dạng phức tạp hơn.  Các phương thức print() và println() Các phương thức này chuyển dữ liệu dùng phương thức toString thích hợp và trả lại một giá trị chuỗi. Hãy xem xét đoạn mã 4. Đoạn mã 4: int num1 = 5; int num2 = 10; int sum = num1 + num2; System.out.print(“The sum of”); System.out.print(num1); System.out.print(“ and ”); System.out.print(num2); System.out.print(“ is “); System.out.print(sum); System.out.println(“.”);
  • 22. Learn Java by Example 22/114 AptechVietnam int num3 = 2; sum = num1 + num2 + num3; System.out.println(“The sum of ” + num1 + “, ” + num2 + “ and ” + num3 + “ is ” + sum + “.”); Kết quả của đoạn mã trên là: The sum of 5 and 10 is 15. The sum of 5, 10, and 2 is 17. Biến sum được định dạng hai lần: lần đầu trong lệnh print; lần thứ hai bằng mã chuyển được tự động tạo ra bởi trình biên dịch Java và sử dụng phương thức toString. Trong trường hợp này, bất kỳ giá trị nào cũng có thể được định dạng.  Phương thức format() Phương thức này định dạng nhiều đối số dựa trên một chuỗi định dạng. Chuỗi định dạng chứa cả phần định dạng lẫn hằng chuỗi bình thường nhưng nó không kết hợp với bất kỳ một đối số nào. Các chuỗi định dạng hỗ trợ nhiều đặc tính. Thành phần định dạng bắt đầu bằng dấu %. Ví dụ, System.out.println(“%d”, + sum); Câu lệnh này hiển thị giá trị nguyên của biến sum. Cú pháp của một chuỗi định dạng như sau: Cú pháp: %[arg_index$][flags][width][.precision]conversion character Trong đó, arg_index – Là một số nguyên theo sau là $. Số nguyên cho biết đối số sẽ được in tại vị trí được đề cập. flags – Có nhiều biến cờ khác nhau trong Java như bảng 2.1 Flag (Cờ) Mô tả “-“ Đối số được canh thẳng theo bên trái “+” Chèn một dấu + hoặc - với đối số này
  • 23. Chương 2 Biến và toán tử 23/114 “0” Dẫn đầu đối số này với các số 0 “,” Dùng dấu ngăn cách nhóm “(“ Số âm được bao quanh bằng dấu ngoặc đơn Bảng 2.1: Kiểu của các flag width - Xác định số tối thiểu các ký tự sẽ được in precision – xác định số ký tự số sẽ được in sau dấu thập phân. Dùng với các số dấu chấm động. conversion character - Kiểu của đối số được định dạng. Ví dụ, b là boolean, c là char, d là số nguyên, …. Các giá trị đặt trong cặp dấu “[]” là tùy chọn. Chỉ các thành phần yêu cầu xác định định dạng là dấu % và ký tự chuyển đổi. Đoạn mã 5 minh họa cách sử dụng phương thức format() int val = 5; double sq = 2.236068; System.out.format("The square root of %d is %f.%n",val,sq); Kết quả của đoạn mã trên như sau: The square root of 5 is 2.236068. 2.3.2 Ký tự điều khiển (escape sequences) Ký tự điều khiển được dùng để biểu diễn các ký tự đặc biệt. Các ký tự điều khiển có thể dùng cho hằng ký tự hoặc hằng chuỗi. Bảng 2.2 giới thiệu một vài ký tự đặc biệt trong Java
  • 24. Learn Java by Example 24/114 AptechVietnam Ký tự đặc biệt Giá trị ký tự f Cuộn trang giấy vào máy in (Form feed) r Xuống hàng (Carriage return) xxx Ký tự tương ứng với giá trị bát phân xxx, xxx nằm trong khoảng 000 đến 0377. uxxxx Ký tự unicode với mã hoá xxxx, trong đó xxxx là một số thập lục phân gồm 4 ký số. Bảng 2.2: Ký tự điều khiển (Escape sequence) Để biểu diễn một ký tự unicode , ký tự điều khiển unicode u có thể được dùng trong chương trình Java. Một ký tự unicode có thể được biểu diễn bằng một chuỗi thập lục phân hoặc bát phân. Đoạn mã 6 minh hoạ vấn đề này. Đoạn mã 6: // In „Hello‟ sử dụng chuỗi thập lục phân System.out.println("u0048u0065u006Cu006Cu006F" + "!n"); //In „Blake‟ sử dụng chuỗi bát phân cho ký tự „a‟ System.out.println("Bl141ke"2007""); Chú ý: Các ký tự điều khiển thập lục phân bắt đầu với u, theo sau là 4 ký số hệ thập lục phân. Các ký tự điều khiển bát phân gồm 3 ký số sau dấu . Ví dụ: xyy Trong đó, x có thể bất kỳ ký số nào từ 0 đến 3, y từ 0 đến 7. Kết quả đoạn mã 6 là: Hello! Blake”2007” Hai kiểu ký tự điều khiển có thể có nghĩa khác nhau bởi vì ký tự đặc biệt u được xử lý trước các ký tự đặc biệt khác.
  • 25. Chương 2 Biến và toán tử 25/114 2.4 Các toán tử Các toán tử kết hợp với các biến đơn hoặc các biểu thức thành các biểu thức mới phức tạp hơn mà nó trả lại các giá trị. 2.4.1 Loại toán tử Java cung cấp các loại toán tử khác nhau như sau:  Toán tử số học Các toán tử số học được dùng trong các biểu thức toán học. Các toán hạng của các toán tử số học phải ở dạng số. Các toán hạng kiểu boolean không sử dụng được, song các toán hạng ký tự cho phép sử dụng với loại toán tử này.  Toán tử quan hệ Các toán tử quan hệ kiểm tra mối quan hệ giữa hai toán hạng. Kết quả của một biểu thức có dùng các toán tử quan hệ là những giá trị boolean, true (đúng) hoặc false (sai).  Toán tử logic Các toán tử logic làm việc với các toán hạng boolean.  Toán tử gán Toán tử gán là một dấu bằng, =, dùng để gán giá trị cho một biến. Có thể gán giá trị cho một hoặc nhiều biến kế tiếp nhau. Nghĩa là, có thể sử dụng một dãy các phép gán.  Toán tử thao tác bit (bitwise) Một toán tử bitwise cho phép ta thao tác trên từng bit riêng biệt trong các kiểu dữ liệu nguyên thuỷ. Toán tử bitwise dựa trên cơ sở đại số boolean. Nó thực hiện
  • 26. Learn Java by Example 26/114 AptechVietnam phép tính trên hai bit có vị trí tương ứng trên hai toán hạng để tạo ra một kết quả mới. Khi các toán hạng là các số, toán tử „&‟ thực thi hàm AND giữa hai bit, và toán tử „|‟ thực thi hàm OR giữa hai bit. Bảng 2.3 mô tả vấn đề này. Condition1 (Điều kiện 1) Condition2 (Điều kiện 2) Condition1 & Condition2 Condition1 | Condition2 True True True True True False False True False False False False False False False False Bảng 2.3: AND và OR Toán tử dịch bit sang phải không dấu Mỗi lần một dịch bit xảy ra, toán tử >>> tự động điền bit có thứ tự ưu tiên cao với nội dung trước đó của nó nhưng vẫn giữ dấu của giá trị. Tuy nhiên, thỉnh thoảng dịch chuyển này không thích hợp với những giá trị không phải là số. Trường hợp này thường xảy ra khi làm việc với dữ liệu là đồ họa và các giá trị dựa trên pixel. Trong tình huống đó, một giá trị 0 được dịch chuyển đến bit có thứ tự ưu tiên cao không quan tâm tới giá trị ban đầu của nó. Điều này gọi là dịch chuyển bit không dấu. Vì vậy, một toán tử dịch bit sang phải không dấu, >>>, luôn luôn dịch chuyển 0 đến các bit có thứ tự ưu tiên cao hơn. Đoạn mã 7: int val = -3; val = val >>> 20; Trong đó, val được gán bằng -3. Giá trị này sau đó được dịch chuyển sang phải 20 bits, điền 0 vào 20 bits đó và lờ đi bit dấu. Giá trị sau khi dịch bit là 4095.  Toán tử instanceof
  • 27. Chương 2 Biến và toán tử 27/114 Toán tử này chỉ được dùng cho các biến tham chiếu đối tượng để kiểm tra một đối tượng có thuộc một kiểu xác định hay không. Dạng tổng quát của toán tử instanceof là: object instanceof type Ở đây, đối tượng là thể hiện của một lớp, và có kiểu là kiểu của lớp. Nếu đối tượng thuộc về một kiểu xác định hoặc có thể ép kiểu thành kiểu xác định, thì toán tử instanceof trả lại giá trị true, ngược lại thì false. Đoạn mã 8 minh hoạ cách dùng toán tử này. Đoạn mã 8: Scanner input = new Scanner(System.in); Boolean val = input instanceof Scanner; System.out.println(val); Giá trị được in ra trong đoạn mã trên là true  Toán điều kiện Toán tử điều kiện là một loại toán tử đặc biệt vì nó gồm ba thành phần cấu thành biểu thức điều kiện. Toán tử này có thể thay thế câu lệnh if-then-else. Cú pháp : expression1 ? expression2 : expression3; Trong đó, expression1: là biểu thức logic bất kỳ trả về giá trị true hoặc false. expression2: là biểu thức sẽ được ước lượng khi giá trị của expression 1 là true. expression3: là biểu thức sẽ được ước lượng khi giá trị của expression 1 là false Các toán tử điều kiện có thể lồng nhau và được minh họa trong đoạn mã 9: Đoạn mã 9: int num1 = 5;
  • 28. Learn Java by Example 28/114 AptechVietnam int num2 = 10; char op = '*'; System.out.println( (op == '-') ? (num1 - num2) : (op == '+') ? (num1 + num2) : (op == '*') ? (num1 * num2) : "Invalid operator"); Trong đoạn mã 9, điều kiện cuối cùng là true nên kết quả là 50. 2.4.2 Thứ tự ưu tiên của các toán tử và sự kết hợp Khi một biểu thức chứa nhiều toán tử, chúng sẽ được thực hiện theo một thứ tự xác định bởi thứ tự ưu tiên của nó. Thứ tự ưu tiên của các toán tử toán học tuân theo các nguyên tắc số học. Nếu không chắc chắn, ta dùng dấu ngoặc đơn để thay đổi thứ tự ưu tiên. Xét biểu thức 5+3*2, nó được tính 5+(3*2) bằng 11, chứ không tính (5+3)*2 bằng 16. Toán tử (*) có độ ưu tiên cao hơn toán tử (+), do vậy phép nhân được thực hiện trước. Xét biểu thức 8-3-2, nó được tính (8-3)-5 bằng 3, chứ không tính 8-(3-2) bằng 7. Vì vậy , khi biểu thức có nhiều toán tử - thì độ ưu tiên (sự kết hợp) được thực hiện từ trái sang phải. Hai toán tử + và – có cùng độ ưu tiên. Nên cũng được thực hiện từ trái sang phải. Xét biểu thức: x + 3 – y +5 (x + 3) – y +5 ((x + 3) – y) +5 ((x + 3) – y +5) Các toán tử =, += và -= có cùng độ ưu tiên nhưng được thực hiện từ phải sang trái trong cùng biểu thức. Xét biểu thức: x = y += z -= 4 x = y += (z -= 4) x = (y += (z -= 4))
  • 29. Chương 2 Biến và toán tử 29/114 (x = y += (z -= 4)) Dùng dấu ngoặc đơn để thay đổi thứ tự ưu tiên của các toán tử. Nếu không dùng nó thì độ ưu tiên và sự kết hợp sẽ được dùng để xác định thứ tự các toán tử sẽ thực thi. Khoảng trắng không có tác dụng. Thứ tự ưu tiên được thực hiện như sau:  Trong một biểu thức các toán tử được thực hiện theo thứ tự ưu tiên từ cao xuống thấp (tightest binding)  Nếu có nhiều hơn 1 toán tử ưu tiên như nhau trong biểu thức thì thực hiện từ trái sang phải  Hãy đặt các biểu thức ưu tiên nhất trong dấu ngoặc tròn để chúng được thực hiện trước nhất.  Tiếp tục với biểu thức con thứ hai và các biểu thức tiếp theo  Tiếp đến các toán tử có độ ưu tiên cao nhất còn lại theo cùng qui trình trên. Rất dễ bị sai nếu quên đi thứ tự ưu tiên. Hãy xem biểu thức sau: x = a+b/5.0-c**d+1*e là tương đương với x = ((a+(b/5.0))-(c**d))+ (1*e) Tuân theo qui trình sau để đóng ngoặc các biểu thức  Toán tử ưu tiên cao nhất là **. Nghĩa là c**d được thực hiện trước tiên, ta đóng nó trong ngoặc tròn.  Dấu / và dấu * là toán tử ưu tiên cao nhất thứ hai, sẽ được thực hiện kế tiếp, do vậy đặt b/5.0 và 1*e vào ngoặc tròn.  Dấu + và – có độ ưu tiên cao nhất kế tiếp. Do chúng có cùng độ ưu tiên với nhau nên thực hiện từ trái sang phải.  Cuối cùng phép gán được thực hiện. 2.4.3 Ép kiểu Ép kiểu hay chuyển đổi kiểu hàm ý nói đến việc thay đổi kiểu dữ liệu của một biến sang kiểu khác. Thực hiện điều này ta thu được một số tinh năng ưu việt
  • 30. Learn Java by Example 30/114 AptechVietnam của thang bậc các dữ liệu. Chẳng hạn, các giá trị giới hạn của một tập các số nguyên integer có thể chứa trong một khuôn dạng cô đọng hơn. Có thể chuyển đổi kiểu sang dạng khác phù hợp với việc tính toán hơn vì không thể tính toán với kiểu dữ liệu trước đó, chẳng hạn như là chia các số với độ chính xác cao hơn. Trong ngôn ngữ lập trình hướng đối tượng, chuyển đổi kiểu cho phép chương trình xem đối tượng của một kiểu như là kiểu tiền bối của chúng để làm đơn giản việc tương tác với chúng. Có 2 loại chuyển kiểu: mặc định và tường minh. Thuật ngữ chuyển kiếu mặc định có nghĩa là nâng kiểu. Hầu hết các dạng chuyển kiểu tường minh được hiểu là ép kiểu. Chuyển kiểu tường minh cũng có thể thu được từ các thường trình chuyển kiểu được viết riêng như là nạp chồng hàm dựng của đối tượng.  Chuyển kiểu ngầm định Chuyển kiểu ngầm định, cũng còn gọi là nâng kiểu (coercion), là tự động chuyển kiểu bởi trình biên dịch. Một số ngôn ngữ cho phép, thậm chí đòi hỏi bộ biên dịch phải hỗ trợ chuyển kiểu. Trong một biểu thức phức hợp, chương trình sẽ chạy đúng nếu dữ liệu của kiểu dưới có thể chuyển lên kiểu trên. Đoạn lệnh 10 mô tả chuyển kiểu mặc định. short a=2000; int b; b=a; Ở đây giá trị ‟a‟ được nâng cấp từ short lên int và không cần toán tử ép kiểu nào cả. Điều này được hiểu là chuyển kiểu thông thường. Chuyển kiểu thông thường tác động trên các kiểu dữ liệu cơ bản, cho phép chuyển đổi các dữ liệu số (short lên int, int lên float, float lên double...) và một số chuyển đổi con trỏ. Một số chuyển đổi có thể gây ra mất độ chính xác, lúc ấy trình biên dịch có thể cảnh báo. Điều này có thể không cần đến chuyển kiểu tường minh.  Chuyển kiểu tường minh Nhiều loại chuyển kiểu, đặc biệt là hạ thấp kiểu gây mất dữ liệu, đòi hỏi chuyển kiểu tường minh. Đoạn lệnh 11 mô tả chuyển kiểu tường minh short a=2000; int b; b= (int)a; // cú pháp ép kiểu
  • 31. Chương 2 Biến và toán tử 31/114 b= int (a); // cú pháp kiểu hàm Có nhiều loại ép kiểu tường minh, đó là:  Có kiểm tra Trước khi chuyển kiểu được thực hiện, một kiểm tra trong lúc chạy chương trình được thực hiện để xem kiểu đích đến có chứa được giá trị nguồn hay không. Nếu không, một lỗi bị sinh ra.  Không kiểm tra Không có kiểm tra nào được thực hiện. Nếu kiểu đích không chứa được giá trị gốc, kết quả không được ghi nhận.  Mẫu bit Dữ liệu không được xem xét gì tất, các bít thô được sao chép nguyên bản.
  • 32. Learn Java by Example 32/114 AptechVietnam Tóm tắt bài học  Biến là một tên được dùng để tham chiếu đến các giá trị chỉ định trong chương trình.  Hằng là giá trị không đổi được viết thẳng trong mã lệnh không đòi hỏi sự tính toán nào cả.  Java có các loại dữ liệu có sẵn, gọi là dữ liệu nguyên thủy.  Định dạng dữ liệu để xuất ra người ta dùng lớp Formatter hoặc sử dụng các phương thức format() và printf() của lớp PrintStream.  Một số các ký tự đặc biệt được biểu diễn kết hợp với dấu  Java cung cấp nhiều loại toán tử, đó là  Toán tử số học  Toán tử bit  Toán tử quan hệ  Toán tử logic  Toán tử điều kiện  Toán tử gán
  • 33. AptechVietnam 33/114 Chương 3: Lệnh rẽ nhánh và vòng lặp Mục đích Cuối chương này, học viên có thể nắm được:  Các cấu trúc rẽ nhánh if  Cấu trúc switch-case  Cấu trúc vòng lặp while, do while, for và vòng lặp lồng nhau  Câu lệnh break, continue 3.1 Câu lệnh rẽ nhánh Câu lệnh rẽ nhánh hay câu lệnh điều khiển được sử dụng để điều khiển luồng thực thi trong ngôn ngữ lập trình. Java hỗ trợ hai loại lệnh rẽ nhánh đó là: cấu trúc if và cấu trúc switch. Các câu lệnh này cho phép chương trình thực thi các đoạn mã lệnh khác nhau dựa trên kết quả của biểu thức điều kiện hoặc giá trị của biến. 3.1.1 Lệnh if lồng nhau Câu lệnh if-else kiểm tra kết quả của biểu thức hoặc biến điều kiện rồi dựa trên kết quả trả về để thực hiện các lệnh tương ứng. Câu lệnh if có thể được sử dụng lồng trong một cấu trúc if khác, loại if này được gọi là nested-if. Như vậy, nested- if là cấu trúc if được lồng trong cấu trúc if hoặc else khác. Các điểm quan trọng cần lưu ý khi sử dụng lệnh if lồng nhau: Câu lệnh else luôn luôn được kết hợp lệnh if gần nhất. Nó nằm trong cùng khối với else và không kết hợp với else nào cả.
  • 34. Learn Java by Example 34/114 AptechVietnam Cú pháp: if (Điều_kiện) { if (Điều_kiện) { //câu lệnh/khối lệnh này được thực hiện nếu điều kiện đúng } else { //câu lệnh/khối lệnh này được thực hiện nếu điều kiện sai } } else { //câu lệnh/khối lệnh này được thực hiện nếu điều kiện sai } Đoạn mã dưới đây minh họa cách sử dụng cấu trúc nested-if Đoạn mã 1: Scanner input = new Scanner(System.in); System.out.println(“Nhập một số: ”); num = input.nextInt(); //Kiểm tra xem num có chia hết cho 3 không? //câu lệnh if ngoài if(num % 3 == 0) { //kiểm tra xem num có chia hết cho 5 không? if(num % 5 == 0) { //in ra thông báo num chia hết cho 3 và 5 System.out.println(“The number is divisible by both 3 and 5.”); } else { //Số chia hết cho 3 nhưng không chia hết cho 5 System.out.println(“The number is divisible by 3 but not by 5.”); } } else { //Số không chia hết cho 3 và 5 System.out.println(“The number is not divisible by 3 and 5.”); }
  • 35. Chương 3 Rẽ nhánh và vòng lặp 35/114 Giải thích đoạn mã lệnh Đoạn mã trên khái báo một biến num và chứa số nguyên nhập vào từ người dùng. Chương trình sử dụng cấu trúc if lồng nhau, đầu tiên chương trình kiểm tra số nguyên người dùng nhập vào (biến num) có chia hết cho 3 và 5 hay chỉ chia hết cho 3 và in ra các thông báo tương ứng. Ở đây, câu lệnh else cuối cùng được kết hợp với if (num % 3 ==0). Câu lệnh else bên trong được kết hợp với if (num % 5 == 0) bởi vì nó được kết hợp với if gần nhất trong cùng khối lệnh. 3.1.2 Lệnh Switch-case lồng nhau Cấu trúc switch-case có thể được sử dụng thay thế cho cấu trúc if-else-if khi có nhiều if-else lồng nhau. Sử dụng switch-case khiến khả năng thực thi của chương trình tốt hơn. Tương tự như if-else, switch-case có thể sử dụng lồng trong một switch-case khác. Do switch-case định nghĩa các khối lệnh riêng, nên không có sự xung đột giữa các hằng giá trị case của lệnh switch-case trong và lệnh switch-case ngoài. Đoạn mã dưới đây minh họa cách sử dụng các lệnh switch-case: Đoạn mã 2: ...... switch (day) { case 0: switch(target) { case 1: System.out.println(“Target is 1 to 7.”); break; } break; case 1: System.out.println(“Sunday”); break; case 2: System.out.println(“Monday”); break; case 3: System.out.println(“Tuesday”); break; case 4: System.out.println(“Wednesday”); break; ...... }
  • 36. Learn Java by Example 36/114 AptechVietnam Trong đoạn mã trên, khối lệnh case 1 của switch-case trong không xung đột/nhầm lẫn với khối lệnh case 1 của switch-case ngoài. Biến day được sử dụng để so sánh với danh sách các khối case của switch-case ngoài, nếu giá trị của biến day bằng 0 thì biến target mới được so sánh với danh sách các khối case của switch-case bên trong. Có ba điểm quan trọng cần lưu ý khi sử dụng cấu trúc switch-case;  Cấu trúc switch khác với cấu trúc if. switch chỉ có thể kiểm tra bằng, trong khi đó if có thể kiểm tra bất kỳ giá trị của biểu thức logic nào.  Không cho phép 2 giá trị case giống nhau trong cùng một switch-case. Nếu switch-case lồng nhau, giá trị của các hằng case của switch-case trong và ngoài có thể giống nhau.  Cấu trúc lệnh switch-case hiệu quả hơn sử dụng nhiều câu lệnh if-else lồng nhau. 3.2 Vòng lặp Vòng lặp được sử dụng rất phổ biến trong lập trình, nó được sử dụng để thực hiện các câu lệnh lặp lại nhiều lần. Các loại vòng lặp được hỗ trợ trong Java gồm: - Vòng lặp while - Vòng lặp do while - Vòng lặp for Vòng lặp thực hiện một lệnh (hoặc khối lệnh) chừng nào thõa mãn một điều kiện hoặc thõa mãn số lần lặp xác định. 3.2.1 Vòng lặp while Vòng lặp while dùng để thực hiện một lệnh hoặc khối lệnh chừng nào điều kiện còn true (đúng). Tại một vị trí nào đó trong vòng lặp làm cho biểu thức điều kiện thành false (sai), nếu không vòng lặp sẽ thực hiện vô tận.
  • 37. Chương 3 Rẽ nhánh và vòng lặp 37/114 Cú pháp: ... while(điều_kiện) { Các câu lệnh; ... } ... Thân của vòng lặp là rỗng nếu nó không chứa câu lệnh nào cả, về mặt cú pháp, nó vẫn đúng trong Java. Đoạn mã dưới đây minh họa cách sử dụng thân vòng lặp rỗng: Đoạn mã 3: ...... int num1 = 1; int num2 = 30; while (++num1 < --num2); System.out.println(“The midpoint is: ” + num1); ...... Trong đoạn mã trên, giá trị của biến num1 được tăng 1 và giá trị của biến num2 được giảm 1, sau đó đem so sánh. Vòng lặp được thực hiện chừng nào giá trị của num1 lớn hoặc bằng num2. Do vậy, biến num1 có giá trị giữa num1 và num2, kết quả in ra: The midpoint is: 16
  • 38. Learn Java by Example 38/114 AptechVietnam Biểu thức điều kiện của vòng lặp có thể phức tạp, biến điều khiển có thể được thay đổi giá trị trong thân vòng lặp. Tuy nhiên biểu thức điều kiện phải false (sai hoặc không thõa) nếu không vòng lặp sẽ thực hiện vô tận. Đoạn mã dưới đây minh họa vòng lặp vô tận: Đoạn mã 4: ...... int count = 0; while (count < 100) { System.out.println(“This goes on forever, HELP!!!”); count = count + 10; //Tăng count lên 10 đơn vị System.out.println(“Count = ” + count); count = count - 10; //giảm count 10 đơn vị System.out.println(“Count = ” + count); } ...... Trong đoạn mã trên, giá trị của count luôn bằng 0 và nhỏ hơn 100. Vì vậy, biểu thức điều kiện luôn luôn true (đúng), vòng lặp không bao giờ kết thúc. Một lệnh break có thể được dùng để ngắt vòng lặp trong chương trình trên. Nếu có dòng này ở cuối vòng lặp, vòng lặp chỉ thực hiện 1 lần và kết thúc, kết quả hiển thị: This goes on forever, HELP!!! Count = 10 Count = 0 Tuy nhiên, đây chỉ là minh họa cách sử dụng, trong thực tế chúng ta không dùng như vậy.
  • 39. Chương 3 Rẽ nhánh và vòng lặp 39/114 Điểm quan trọng cần lưu ý khi sử dụng vòng lặp while là, các biến điều khiển (biến được sử dụng trong biểu thức điều kiện) phải được khai báo trước khi sử dụng. Xem ví dụ dưới đây là không hợp lệ while (int val = 10) { } //biểu thức điều khiển không hợp lệ 3.2.2 Vòng lặp do-while Vòng lặp do-while thực hiện các câu lệnh chừng nào điều kiện còn true (đúng). Khác với vòng lặp while, vòng lặp do-while thực hiện các câu lệnh ít nhất một lần sau đó biểu thức điều kiện mới được kiểm tra. Nếu điều kiện đúng, vòng lặp tiếp tục thực hiện, nếu điều kiện sai, vòng lặp kết thúc. Đoạn mã dưới đây minh họa cách sử dụng vòng lặp do-while Đoạn mã 5: ...... int number = 5; int guest; Scanner input = new Scanner(System.in); System.out.println(“Guess a number between 1 to 10”); do { System.out.println(“Enter your guess: ”); guess = input.nextInt(); if (guess > number) { System.out.println(“Value too high”); } if (guess < number)
  • 40. Learn Java by Example 40/114 AptechVietnam { System.out.println(“Value too low”); } }while (guess != number); System.out.println(“The answer is %d.”, number); ...... Trong đoạn mã trên, 2 biến number và guess được khai báo. Biến number được gán giá trị 5, biến guess được nhập vào từ người dùng. Nếu giá trị người dùng nhập vào bằng giá trị của biến number thì dòng lệnh println() in ra dòng “The answer is 5.” còn nếu không thì vòng lặp tiếp tục thực hiện. 3.2.3 Vòng lặp for Vòng lặp for được sử dụng khi người dùng biết trước số bước lặp. Khai báo của vòng lặp for gồm 3 phần:  Khai báo và khởi tạo giá trị của các biến  Biểu thức logic  Biểu thức điều khiển lặp Ba phần khai báo này phân cách nhau bằng dấu chấm phẩy (;). Khi vòng lặp bắt đầu, phần khai báo của vòng lặp được thực hiện. Thông thường, đây là biểu thức khởi gán giá trị ban đầu và đóng vai trò là biến đếm điều khiển vòng lặp. Biểu thức khởi tạo chỉ thực hiện duy nhất một lần. Tiếp đến, biểu thức logic được thực hiện để kiểm tra biến điều khiển với giá trị của số lần lặp. Nếu biểu thức logic có giá trị đúng thì vòng lặp tiếp tục thực hiện, ngược lại vòng lặp kết thúc. Sau cùng, biểu thức điều khiển lặp được thực hiện, thông thường biểu thức lặp dùng để tăng hoặc giảm giá trị của biến điều khiển.
  • 41. Chương 3 Rẽ nhánh và vòng lặp 41/114 Trong phần khai báo và biểu thức lặp, chúng ta có thể sử dụng nhiều biến phân cách nhau bởi dấu phẩy và thứ tự thực hiện từ trái qua phải. Thứ tự thực hiện rất quan trọng nếu như giá trị của biểu thức thứ 2 phụ thuộc vào kết quả thực hiện. Đoạn mã dưới đây minh họa cách sử dụng vòng lặp for với phân cách nhiều biến khai báo: Đoạn mã 6: ...... int i,j; int max = 10; System.out.println(“The sum of two variables for a table of 10 is: ”); for(i=0,j=max;i<=max;i++,j--) { System.out.println(“n%d + %d = %d”,i,j,i+j); } ...... Trong đoạn mã trên, 3 biến i, j, max được khai báo. Biến max được gán giá trị bằng 10. Trong phần khởi tạo, biến i được gán bằng 0 và biến j được gán bằng max = 10. Ở đây chúng ta thấy 2 biến được khởi tạo giá trị phân cách bởi dấu phẩy. Biểu thức điều kiện; i<=max đảm bảo rằng vòng lặp thực hiện chừng nào i còn nhỏ hơn hoặc bằng max=10.Vòng lặp sẽ kết thúc khi biểu thức điều kiện trả về false (sai) có nghĩa lúc đó i = 11. Cuối cùng, biểu thức lặp cũng bao gồm 2 phép tính i++, j--. Sau mỗi bước lặp, i được tăng 1 đơn vị và j giảm 1 đơn vị. Tổng của 2 biến này luôn luôn bằng max và bằng 10 được in ra. Kết quả của đoạn mã trên như dưới đây: The sum of two variables for a table of 10 is: 0 + 10 = 10
  • 42. Learn Java by Example 42/114 AptechVietnam 1 + 9 = 10 2 + 8 = 10 3 + 7 = 10 4 + 6 = 10 5 + 5 = 10 6 + 4 = 10 7 + 3 = 10 8 + 2 = 10 9 + 1 = 10 10 + 0 = 10 Như thảo luận trong phần trước, có 3 phần trong khai báo vòng lặp for, tuy nhiên bất kỳ một hoặc tất cả các phần trong khai báo for có thể để trống. Đoạn mã dưới đây minh họa cách sử dụng vòng lặp for không sử dụng phần khai báo: Đoạn mã 7: ...... //Khởi tạo giá trị của biến num int num = 1; for(; num != 40;num++) { System.out.println(“Enter a number: ”); num = input.nextInt(); } ...... Trong đoạn mã trên, biến num được người dùng nhập vào cho đến khi có giá trị bằng 40. Vòng lặp không có phần khởi tạo. Thay vào đó, num được khởi tạo ở ngoài phần khai báo vòng lặp. Biến num được tăng lên 1. Vòng lặp sẽ kết thúc
  • 43. Chương 3 Rẽ nhánh và vòng lặp 43/114 khi num bằng 40. Nếu cả 3 phần để trống, vòng lặp sẽ lặp vô tận. Đoạn mã dưới đây minh họa cách sử dụng đó: Đoạn mã 8: ...... for( ; ; ) { System.out.println(“This will go on and on”); } ...... Trong đoạn mã trên, dòng chữ “This will go on and on” được in cho đến khi vòng lặp kết thúc. Câu lệnh break có thể dùng để kết thúc vòng lặp này. Đoạn mã trên dẫn đến vòng lặp vô hạn, vòng lặp vô hạn khiến chương trình chạy không giới hạn trong khoảng thời gian dài và sử dụng hết tài nguyên của hệ thống, điều này dẫn đến treo hệ thống. Trong thực tế, chúng ta nên tránh sử dụng loại vòng lặp kiểu này trong chương trình của mình. 3.2.4 Vòng lặp lồng nhau Trong Java, chúng ta có thể sử dụng vòng lặp lồng nhau, đó là vòng lặp được đặt trong một vòng lặp khác. Đoạn mã dưới đây minh họa cách sử dụng vòng lặp lồng nhau: Đoạn mã 9: ...... int num = 0; //Lặp từ 0 cho đến 5 (lặp 6 lần) System.out.println(“The factorials of the first five
  • 44. Learn Java by Example 44/114 AptechVietnam numbers are: ”); do { int i = 1; int factorial = 1; System.out.println(“Factorial of “ + num + “ :”); if(num==0) { System.out.println(factorial); }else { while(num>=i) { factorial = factorial * i; i++; } System.out.println(factorial); } num++; }while(num < 6); ...... Trong đoạn mã trên, chương trình in ra giai thừa của các số từ 0 – 5. Câu lệnh if-else được dùng để tính giai thừa của biến num. Lệnh được đặt trong vòng lặp do-while. Kết quả hiển thị như sau: The factorials of the first five numbers are: Factorial of 0 : 1 Factorial of 1 : 1 Factorial of 2 : 2 Factorial of 3 : 6
  • 45. Chương 3 Rẽ nhánh và vòng lặp 45/114 Factorial of 4 : 24 Factorial of 5 : 120 3.3 Câu lệnh nhảy Đôi khi số bước lặp của vòng lặp không được biết trước. Điều kiện để kết thúc vòng lặp được xác định sau, và ngay trong thân vòng lặp. Trong một số tình huống khác, một số câu lệnh trong thân vòng lặp được bỏ qua dựa trên điều kiện nào đó. Đáp ứng những yêu cầu đó, Java cung cấp hai lệnh nhảy đó là break và continue dùng để thay đổi luồng điều khiển của chương trình dựa trên các điều kiện. Do vậy, các câu lệnh nhảy này được sử dụng để chuyển điều khiển đến phần khác của chương trình. 3.3.1 Lệnh break Lệnh break thoát khỏi vòng lặp trong cùng và thực hiện câu lệnh tiếp theo sau khối lệnh của vòng lặp ngoài. Câu lệnh break là câu lệnh độc lập, do vậy cần phải kết thúc lệnh break bằng dấu chấm phẩy. Lệnh break không chỉ được sử dụng trong vòng lặp for mà còn được sử dụng trong cả while và do-while. Các câu lệnh sau break không được thực hiện. Ví dụ dưới đây minh họa cách sử dụng break trong vòng lặp while. Đoạn mã 10: ...... int i = 1; int sum = 0; while (i < 100) { sum = sum + i; System.out.println(“Sum: “ + sum); if(i==10) break; i++; } ......
  • 46. Learn Java by Example 46/114 AptechVietnam Trong đoạn mã trên, vòng lặp while được thiết kế để chạy từ 1 đến 99 và tính tổng của các số từ 1 đến 99. Nhưng câu lệnh break được sử dụng để kết thúc vòng lặp khi i bằng 10. Do vậy kết quả được hiển thị như sau: Sum: 1 Sum: 3 Sum: 6 Sum: 10 Sum: 15 Sum: 21 Sum: 28 Sum: 36 Sum: 45 Sum: 55 3.3.2 Lệnh continue Câu lệnh continue chuyển điều khiển sang bước lặp kế tiếp và bỏ qua các câu lệnh sau continue. Có nghĩa là khi gặp câu lệnh continue, các lệnh sau continue trong thân vòng lặp sẽ không được thực hiện mà điều khiển sẽ được chuyển sang bước lặp kế tiếp. Câu lệnh continue thường được sử dụng với một biểu thức điều kiện trong thân vòng lặp như lệnh break. Lệnh continue sử dụng được trong 3 loại vòng lặp: while, do-while và vòng lặp for. Với vòng lặp while, do-while, lệnh continue chuyển điều khiển đến biểu thức điều khiển của vòng lặp. Trong khi đó, với vòng lặp for, điều khiển nhảy đến phần biểu thức lặp (phần thứ 3 trong khai báo vòng lặp) sau đó thực hiện tiếp biểu thức điều khiển. Đoạn mã dưới đây minh họa cách sử dụng continue trong vòng lặp do-while: Đoạn mã 11: ...... char letter = „A‟; do { if(letter ==‟J‟ || letter == „L‟) {
  • 47. Chương 3 Rẽ nhánh và vòng lặp 47/114 letter++; continue; } System.out.println(“Letter: ” + letter); letter++; }while(letter !=‟N‟) ... Trong đoạn mã trên, các ký tự từ A đến M được in ra màn hình bằng vòng lặp do-while. Lệnh continue bỏ qua 2 ký tự in ra là J và L. 3.4 Nhãn Các câu lệnh trong Java có thể đánh nhãn. Nhãn thường được hay dùng với vòng lặp for, while kết hợp với break hoặc continue. Nhãn được nhận diện bởi tên định danh theo sau là dấu 2 chấm và đặt trước lệnh đánh nhãn. Lệnh đánh nhãn được sử dụng trong trường hợp các vòng lặp lồng nhau. Nó dùng để chỉ định vòng lặp lồng trong thực hiện bước lặp kế tiếp hay ngắt vòng lặp. Đoạn mã dưới đây minh họa cách sử dụng nhãn Đoạn mã 12: int i; outer: for(i=0;i<5;i++) { if(i==2) { System.out.println("Hello"); break outer; }
  • 48. Learn Java by Example 48/114 AptechVietnam System.out.println("This is the outer loop"); } System.out.println("Good bye"); ...... Trong đoạn mã trên, vòng lặp thực hiện 5 lần. Hai lần lặp đầu tiên chương trình in ra dòng chữ “This is the outer loop”. Bước lặp thứ 3 giá trị của i = 2, do vậy sẽ in ra dòng chữ “Hello”. Tiếp đến, lệnh break được thực hiện và chuyển điều khiển đến nhãn outer: . Vòng lặp kết thúc và dòng lệnh cuối được in ra. Kết quả hiển thị như sau: This is the outer loop This is the outer loop Hello Good bye Đoạn mã dưới đây minh họa cách sử dụng lệnh continue Đoạn mã 13: ...... outer: for(i=0;i<5;i++) { if(j=0;j<5;j++) { System.out.println("Hello"); continue outer; } System.out.println("This is the outer loop"); }
  • 49. Chương 3 Rẽ nhánh và vòng lặp 49/114 System.out.println("Good bye"); ...... Trong đoạn mã trên, dòng chữ “Hello” được in ra 5 lần. Sau khi câu lệnh continue được thực hiện, luồng điều khiển của chương trình được chuyển sang bước lặp kế tiếp của vòng lặp có đánh nhãn. Cuối cùng, điều kiện của vòng lặp ngoài (vòng lặp có đánh nhãn) trả về false, vòng lặp kết thúc và chương trình in ra dòng chữ “Good bye”. Kết quả thực hiện như sau: Hello Hello Hello Hello Hello Good bye
  • 50. Learn Java by Example 50/114 AptechVietnam Tóm tắt bài học  Luồng điều khiển chương trình được điều khiển bởi các cấu trúc lệnh rẽ nhánh  Các loại vòng lặp hỗ trợ trong Java gồm: while, do-while, for. Vòng lặp sử dụng để thực hiện các câu lệnh một cách lặp lại  Lệnh break và continue là các câu lệnh nhảy trong Java  Lệnh break kết thúc vòng lặp lồng trong và thực hiện lệnh kế tiếp trong khối lệnh của vòng lặp ngoài.  Lệnh continue bỏ qua các câu lệnh nằm sau nó và thực hiện bước lặp tiếp theo  Lệnh nhãn thường được sử dụng với các vòng lặp như for, while.
  • 51. AptechVietnam 51/114 Chương 4: Giới thiệu về lớp Mục tiêu bài học Kết thúc bài học này, học viên có thể nắm được những vấn đề sau:  Tạo mảng đối tượng  Khái niệm đệ qui trong Java  Mô tả và sử dụng kiểu enum  Thu gom rác (Garbage collection) trong Java và cơ chế hoạt động 4.1 Mảng các tham chiếu đối tượng Trong Java, có thể khai báo mảng chứa các phần có bất kỳ kiểu dữ liệu nào, kể cả kiểu tham chiếu đến đối tượng. Khi một mảng được tạo ra, tham chiếu đến một lớp, ta nói đó là một mảng các đối tượng. Các đối tượng được khởi tạo chỉ khi hàm dựng của đối tượng được gọi khi thực thi chương trình. Sau khi đối tượng được khởi tạo, nó có thể truy nhập thông qua biến đối tượng. Nếu kiểu của mảng khai báo là một lớp thì các tham chiếu đến các đối tượng của kiểu lớp được khai báo được lưu trong mảng. Do vậy, các thành phần của mảng các đối tượng chỉ là các tham chiếu đến các đối tượng chứ không phải là các thể hiện thực sự của các đối tượng. 4.2 Tạo mảng đối tượng
  • 52. Learn Java by Example 52/114 AptechVietnam Tạo mảng đối tượng thực hiện theo 3 bước như sau: 1. Khai báo biến có thể tham chiếu đến mảng đối tượng có kiểu thích hợp. 2. Tạo đối tượng mảng 3. Gán các phần tử mảng với các thể hiện của kiểu tương ứng. Ví dụ dưới đây khai bảo mảng có tên emp_Array chứa 20 đối tượng của lớp Employee; Đoạn mã 1: Employee [] emp_Array = new Employee[20]; Khởi tạo mảng bằng vòng lặp for Đoạn mã 2: for (int m=0;m<emp_Array.length;m++) { //khởi tạo mảng đối tượng emp_Array[m] = new Employee(); } Giá trị ngầm định của mỗi phần tử mảng đối tượng là null trừ khi các đối tượng thực sự được tạo và tham chiếu của chúng được gán cho mỗi phần tử mảng. Đoạn mã dưới đây minh họa cách khởi tạo các đối tượng Đoạn mã 3:
  • 53. Chương 4 Giới Thiệu về Lớp 53/114 emp_Array[0] = new Employee(“Derek”,121); emp_Array[1] = new Employee(“Clark”,55); Hoặc khởi tạo bằng cách khác như sau: Đoạn mã 4: Employee [2] emp_Array = {new Employee(“Derek”,121),new Employee(“Clark”,55)}; 4.3 Đệ qui trong Java Trong lập trình, đệ qui là cách thức gọi lại chính nó (gọi lại chính hàm đó). Trong thực tế, rất nhiều bài toán được biểu diễn và giải quyết bằng thuật toán đệ qui. Ví dụ trong Java, tính giai thừa dùng đệ qui được biểu diễn như sau: Đoạn mã 5: public static int calculateFactorial(int n) { if(n==0) return 1; else return n * calculateFactorial(n–1); //lời gọi đệ qui } Đệ qui là phương thức gọi lại chính nó. Ở ví dụ trên, phương thức calculateFactorial() gọi lại chính nó. Một điều lưu ý là làm sao để đảm bảo rằng đến lúc nào đó thì lời gọi đệ qui kết thúc còn không chương trình sẽ chạy vô tận và sử dụng hết tài nguyên của máy tính dẫn đến treo máy. Với minh họa ở trên
  • 54. Learn Java by Example 54/114 AptechVietnam chúng ta thấy đệ qui sẽ kết thúc khi n =0. Tình huống kết thúc đệ qui còn được gọi là tình huống nền (base case) của đệ qui. Tất cả các phương thức dùng thuật giải đệ qui có những đặc tính như sau:  Số lần mà phương thức gọi lại chính nó còn được gọi là độ sâu của đệ qui  Mỗi khi phương thức gọi chính nó, máy tính sẽ lưu các biến trong ngăn xếp (stack). Stack là vùng nhớ hạn chế, do vậy với thuật giải đệ qui có độ sâu lớn sẽ dẫn đến treo máy. Trường hợp như vậy được gọi là Stack Overflow (tràn stack).  Phương thức đệ qui có một điều kiện kết thúc. Trong ví dụ trên, phương thức calculateFactorial() sẽ kết thúc khi n = 0. Nếu điều kiện này không có thì phương thức sẽ gọi lại chính nó vô hạn. Trường hợp này được gọi là đệ qui không điểm dừng.  Tất cả các phương thức đệ qui đều có 2 giai đoạn. Giai đoạn thứ nhất được gọi là Winding, xảy ra khi phương thức gọi lại chính nó và đẩy giá trị vào stack. Giai đoạn thứ 2 được gọi là Unwinding, xảy ra khi phương thức lấy giá trị từ stack ra. Ví dụ dưới đây dùng thuật giải đệ qui để tính lũy thừa hai: Ví dụ 1: package test; import Java.util.Scanner; public class PowerOfTwo { public static void main(String [] args)
  • 55. Chương 4 Giới Thiệu về Lớp 55/114 { Scanner input = new Scanner(System.in); int power, result; System.out.println(“Calculate the power of two”); System.out.println(“Enter an integer power: ”); Power = input.nextInt(); Result = powerOfTwo(power); System.out.println(“Two to power ” + power + “ is “ + result); return; } public static int powerOfTwo(int exponent) { if(exponent ==0) return 1; else return (2 * powerOfTwo(exponent - 1)); } } 4.4 Kiểu dữ liệu liệt kê (enum) Giả sử bạn muốn biểu diễn các mùa trong năm trong chương trình, bạn có thể sử dụng các con số 0, 1, 2, 3 tương ứng với mùa xuân, mùa hè, mùa thu và mùa đông. Dùng theo cách này hệ thống hoạt động được nhưng không trực quan và không rõ ràng. Đây không phải là giải pháp tốt để xây dựng những tình huống như vậy. Chẳng hạn người ta có thể nhập sai các con số khác chứ không phải các con số 0, 1, 2, 3 như mong muốn và không có cách gì để khống chế việc nhập sai. Java hỗ trợ kiểu dữ liệu enum để giải quyết tốt những vấn đề trên. Với kiểu dữ liệu enum, giá trị của nó là các tên tượng trưng. 4.5 Tạo kiểu liệt kê Kiểu enum có thể có thứ tự hoặc không có thứ tự. Kiểu enum không thứ tự là kiểu không có thứ tự logic. Ví dụ: kiểu dữ liệu boolean là một dạng của kiểu
  • 56. Learn Java by Example 56/114 AptechVietnam không thứ tự vì không có lập luận nào xác định true trước hay sau false. Với kiểu enum có thứ tự, các giá trị có thể sắp xếp theo một trật tự logic. 4.5.1 Mục đích của enum Kiểu enum được giới thiệu nhằm giúp liệt kê hiệu quả dãy các giá trị, ví dụ như biểu diễn các ngày trong tuần. Ưu điểm của kiểu enum:  Khắc phục được việc ánh xạ giữa số và chuỗi một cách tẻ nhạt. Kiểu enum được sử dụng bằng các chuỗi thay cho các con số.  Dùng số nguyên dùng để để thay cho kiểu liệt kê không an toàn. Chẳng hạn, biến DaysOfWeek là biến nguyên để liệt kê ngày trong tuần, chúng ta có thể gán giá trị bằng 9, như vậy là không hợp lệ. Rõ ràng, dùng số nguyên thay cho kiểu liệt kê là không an toàn. Để giải quyết các hhược điểm này người ta dùng kiểu liệt kê. Với kiểu liệt kê, chúng ta chỉ có thể gán các giá trị đã được định nghĩa trước. Trong Java, kiểu dữ liệu enum được định nghĩa bằng tứ khóa enum. Vì các giá trị của nó là các hằng số, nên các trường của kiểu enum khai báo bằng chữ hoa. Ví dụ dưới đây khai báo biến Months thuộc kiểu enum: Đoạn mã 6: public enum Months { JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE,
  • 57. Chương 4 Giới Thiệu về Lớp 57/114 JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER } Kiểu enum sử dụng cú pháp khai báo như khai báo lớp, chỉ khác sử dụng từ khóa enum thay cho class và được gọi là lớp đặc biệt. Phần thân của kiểu enum có thể khai báo các phương thức cũng như các trường. Trình biên dịch sẽ bổ sung thêm các phương thức đặc biệt khi enum được tạo ra. Chúng ta có thể định nghĩa kiểu enum trong một tập tin riêng hoặc trong một tập tin định nghĩa các lớp. Nếu định nghĩa kiểu enum public thì phải định nghĩa trong một tập tin riêng biệt có tên trùng với tên enum. Ví dụ dưới đây minh họa việc định nghĩa kiểu enum để biểu diễn lược đồ màu: Đoạn mã 7: enum ColorScheme { Red, Blue, Green, Cyan, Magenta, Yellow, Black } Sau khi định nghĩa kiểu enum, chúng ta có thể khai báo biến thuộc kiểu enum như sau: ColorScheme CMYK; Sau đó gán giá trị cho biến: CMYK = ColorScheme.Magenta; In ra giá trị của biến ColorSchema bằng lệnh như sau: System.out.println(“The color used is: ” + CMYK);
  • 58. Learn Java by Example 58/114 AptechVietnam Kết quả sẽ là: The color used is: Magenta 4.6 Garbage Collection (GC) – Thu gom rác Khi một đối tượng (Object) được tạo ra, nó được cấp phát vùng nhớ trong bộ nhớ. Vùng nhớ này được gọi là Heap. Các đối tượng trong Java được tạo ra bằng toán tử new và vùng nhớ của đối tượng được cấp phát trong Heap lúc thực thi. Khi đối tượng trên Heap không còn được tham chiếu bởi chương trình, chúng trở nên thích hợp cho thành phần thu gom rác (Garbage Collection), và Java Heap được gọi là Garbage Collection Heap. Thuật ngữ “Garbage Collection” (Thu gom rác) hàm ý các đối tượng trong Java khi không còn cần thiết bởi chương trình, gọi là rác và có thể loại bỏ. Điều đó có nghĩa là vùng nhớ cấp phát cho các đối tượng sẽ được tái sử dụng cho đối tượng mới tiếp sau. Java Virtual Machine sẽ xác định những đối tượng nào mà không còn dùng nữa và sẽ thu hồi vùng nhớ bị chiếm dụng. Bên cạnh việc giải phóng vùng nhớ của các đối tượng không được tham chiếu, Garbage Collector (bộ thu gom rác) còn giúp ngăn sự phân mãnh vùng nhớ heap. Sự phân mãnh heap xảy ra trong quá trình chương trình thực thi. Trong quá trình thực thi, các đối tượng được tạo ra và hủy bỏ khi không dùng đến nữa, do đó dẫn đến tình trạng có các block (khối) rỗng nằm giữa các block đang dùng. Khi yêu cầu vùng nhớ để cấp phát cho các đối tượng mới cần phải nới rộng kích thước của heap mặc dù vẫn còn đủ vùng nhớ trong heap để cấp phát. Vấn đề này thường hay xảy ra do không còn đủ vùng nhớ liên tục trong heap để cấp phát.
  • 59. Chương 4 Giới Thiệu về Lớp 59/114 Trong đặc tả JVM, chỉ vùng heap của JVM phải được thu gom rác. Nhưng không định nghĩa cách thức bộ thu gom rác (Garbage Collector) hoạt động, mà mỗi nhà phát triển JVM phải quyết định cách cài đặt. 4.6.1 Ưu điểm của GC (Garbage Collection) GC làm giảm bớt gánh nặng cho lập trình viên trong việc giải phóng vùng nhớ. Đối với lập trình viên, việc quyết định khi nào giải phóng vùng nhớ rất khó khăn và đầy rủi ro, do vậy công việc này được giao cho JVM, điều này có nhiều ưu điểm:  Ưu điểm thứ nhất là tăng hiệu suất cho lập trình viên và cho phép họ tập trung hơn vào việc lập trình.  Thứ hai, GC đảm bảo tính toàn vẹn chương trình. GC là phần quan trọng trong chiến lược bảo mật của Java. Lập trình viên Java không thể tình cờ làm hỏng JVM do việc giải phóng sai vùng nhớ. Nhược điểm tiềm ẩn của GC là làm tăng tài nguyên sử dụng và làm giảm hiệu năng của chương trình. JVM luôn theo dõi những đối tượng nào đang được sử dụng bởi chương trình và giải phóng những đối tượng không còn dùng nữa. Hoạt động này gây tiêu tốn nhiều thời gian của CPU.
  • 60. Learn Java by Example 60/114 AptechVietnam Tóm tắt bài học  Mảng đối tượng là một mảng chứa tham chiếu đến các đối tượng  Đệ qui là hình thức gọi (gọi hàm) lại chính nó  Kiểu enum là một danh sách hằng số và tập hữu hạn các giá trị có thể gán cho biến.  GC (Garbage Collection) là giải pháp quản lý vùng nhớ tự động
  • 61. AptechVietnam 61/114 Chương 5: Arrays – Mảng Mục tiêu của bài Kết thúc bài học này, học viên có thể:  Mô tả mảng trong Java  Mô tả lớp String và những phương thức của nó  Giải nghĩa lớp StringBuilder và những phương thức của nó 5.1 Giới thiệu về mảng (Arrays) Mảng lưu trữ các phần tử cùng kiểu dữ liệu vào những vùng nhớ liên tiếp nhau. Dữ liệu trong mảng có thể là kiểu dữ liệu nguyên thuỷ (primitive data type) hoặc đối tượng. Giống như biến, giá trị trong mảng có thể được gán giá trị ngay lúc tạo mảng. Nếu không có giá trị nào được gán cho mảng, thì Java sẽ gán giá trị mặc định cho tất cả các phần tử trong mảng, tùy thuộc vào kiểu dữ liệu. Ví dụ, những phần tử của mảng có kiểu dữ liệu là int, mặc định, được khởi gán là 0. Mảng có thể là mảng một chiều hay mảng nhiều chiều. Một phần tử xác định trong mảng được truy nhập bằng tên hoặc chỉ số. Phần tử đầu tiên trong mảng có chỉ số là 0, phần tử thứ 2 có chỉ số là 1, và cứ tiếp tục như vậy. Mảng là phương tiện thuận tiện để nhóm thông tin có liên quan với nhau. Mảng có thể được tạo theo ba cách như bảng 5.1 Phương pháp Mô tả Cú pháp Ví dụ Chỉ khai báo Khai báo một mảng datatype[] identifier char[] ch; khai báo một mảng kiểu ký tự tên là ch Khai báo và tạo mảng Khai báo và cấp phát vùng nhớ cho các phần tử trong mảng dùng từ khoá new datatype[] identifier = new datatype[size] char[] ch = new char[10]; khai báo và khởi tạo một mảng ch để lưu 10 ký tự. Khai báo, tạo và khởi gán giá trị cho các phần tử Khai báo mảng, cấp phát vùng nhớ và khởi gán giá trị cho các phần tử datatype[] identifier = {value1, value2,…valueN} char[] ch = {„A‟,‟B‟,‟C‟,‟D‟}; khai báo một mảng ch bốn phần tử với các giá trị được khởi gán Bảng 5.1 : Tạo mảng
  • 62. Learn Java by Example 62/114 AptechVietnam 5.1.1 Mảng ký tự Mảng ký tự có thể được tạo như trong đoạn mã sau. Đoạn mã 1: char[] ch ={„A‟,‟B‟,‟C‟,‟D‟}; System.out.println(ch[3]); Đoạn mã 1 tạo mảng một chiều có tên ch, với các giá trị khởi tạo A, B, C và D. Dòng thứ hai in ra giá trị của phần tử có chỉ số 3, đó là D. Trong Java, mảng nhiều chiều là một mảng có các thành phần một mảng khác, ta cũng nói đó là mảng của các mảng. Mảng nhiều chiều các ký tự có thể được tạo ra như đoạn mã 2. Đoạn mã 2 : Char [][] ch = {{„A‟,‟B‟,‟C‟,‟D‟}, {„E‟,‟F‟,‟G‟,‟H‟}}; System.out.println(ch[1][1]); Đoạn mã 2 khởi tạo một mảng nhiều chiều với hai hàng và bốn cột. Dòng thứ 2 in ra giá trị của phần tử tại vị trí hàng 1, cột 1. Kết quả in ra là „F‟. Đoạn mã 3 mô tả mảng chuỗi 2 chiều. Đoạn mã 3: String [][] names = {{“John”, “Andrews”, “David”, “Scott”},{“- Manager”,” – CEO”}}; System.out.println(names[0][0] + names[0][1]); System.out.println(names[0][2] + names[1][1]); Đoạn mã 3 sẽ được hiển thị kết quả như: John – Manager David – CEO Thuộc tính length có thể dùng để xác định kích thước của mảng hay số các phần tử được lưu trong mảng. System.out.println(ch.length); Câu lệnh trên sẽ in ra kích thước của mảng
  • 63. Chương 5 Mảng 63/114 5.1.2 Sắp xếp mảng Luôn cần thiết để sắp xếp các phần tử trong mảng theo giá trị có thứ tự từ cao đến thấp (thứ tự giảm dẫn - descending order) hoặc ngược lại (thứ tự tăng dần – ascending order). Quá trình sắp xếp mảng cần phải hoán đổi giá trị giữa các phần tử mảng. Có nhiều cách khác nhau để sắp xếp mảng. Các cách sắp xếp giống nhau ở chỗ chúng đều so sách mỗi phần tử trong mảng với phần tử khác và hoán đổi giá trị nếu giá trị đặt sai vị trí. Quá trình sắp xếp hoán đổi thực hiện với các phần tử bắt đầu tập giá trị. Kiểu sắp xếp này so sánh giá trị của phần tử đầu tiên với mỗi phần tử tiếp theo và thực hiện các hoán đổi cần thiết. Tiếp đến phần tử thứ hai sẽ được so sánh với mỗi phần tử tiếp theo còn lại trong mảng và thực hiện các hoán đổi cần thiết. Tương tự với các phần tử còn lại trong mảng đến khi không còn hoán đổi nào xảy ra ở bước cuối cùng. Hình 5.1 mô tả khái niệm của sắp xếp hoán đổi. 65 10 57 98 105 304 Hình 5.1 : Sắp xếp hoán đổi Bảng 5.2 chỉ rõ các phần tử được sắp xếp theo thứ tự tăng dần sau mỗi bước. Mỗi bước bắt đầu từ khi lấy một phần tử và so sánh với các phần tử còn lại tiếp theo trong mảng, nếu cần thiết, thực hiện các hoán đổi giá trị của các phần tử. Các giá trị gốc trong mảng 65 10 57 98 105 304 Sau bước thứ nhất 304 10 57 65 98 105 Sau bước thứ hai 304 105 10 57 65 98 Sau bước thứ ba 304 105 98 10 57 65 Sau bước thứ tư 304 105 98 65 10 57 Sau bước thứ năm 304 105 98 65 57 10 Bảng 5.2: Giá trị của các thành phần sau mỗi bước trong sắp xếp hoán đổi.