Professional Documents
Culture Documents
1. Java là gì?
Java là một ngôn ngữ lập lập trình, được phát triển bởi Sun Microsystem vào năm
1995, là ngôn ngữ kế thừa trực tiếp từ C/C++ và là một ngôn ngữ lập trình hướng đối tượng.
Ngôn ngữ này được đặt tên là Java vì Java là tên một hòn đảo ở Indonesia - hòn đảo nổi
tiếng với loại coffee Peet và cũng là loại nước uống phổ biến của các kỹ sư Sun. Ban đầu
Ngôn ngữ này được đặt tên là "Oak" (có nghĩa là "Cây sồi" - 1991), nhưng các luật sư của
Sun xác định rằng tên đó đã được đăng ký nhãn hiệu nên các nhà phát triển đã phải thay thế
bằng một tên mới nên cái tên Java đã ra đời.
2. Ứng dụng của Java
Ngày nay Java được sử dụng với các mục đích sau:
Phát triển ứng dụng cho các thiết bị điện tử thông minh, các ứng dụng cho doanh nghiệp với
quy mô lớn.
Tạo các trang web có nội dung động (web applet), nâng cao chức năng của server.
Phát triển nhiều loại ứng dụng khác nhau: Cơ sở dữ liệu, mạng, Internet, viễn thông, giải trí,..
----------------------------------------------------------------------------------------------------------------------------
1 package helloworld;
2 public class HelloWorld {
3 public static void main(String[] args) {
4 // In ra dòng chữ "Hello World!"
5 System.out.println("Hello World!");
6 }
7 }
Đầu tiên, ta khai báo Class (lớp) theo cú pháp: public class “tên class”
Tiếp theo, ta sẽ khai báo phương thức main theo cú pháp: public static void main(String[ ]
args). Đây là phương thức sẽ được thực hiện khi thực thi chương trình, phương thức này có
tham số đầu vào (String[ ] args) là một mảng các chuỗi (String).
Trong phương thức main(), câu lệnh cơ bản System.out.println("Hello World!"); dùng để
xuất thông báo "Hello World!" ra màn hình.
Để biên dịch chương trình, ta sẽ nhấp chuột vào tên Project chọn Run As → Java Application
Bài 3: Cú pháp và quy tắc Java cơ bản
1. Cú pháp comment code trong Java.
- Sau dấ u “ // ”: comment một dòng.
- Giữa “ /* ” và “ */ ”: comment nhiề u dòng.
- Giữa “ /** ” và “ */ ”: comment nhiề u dòng đặc biệt dùng để tạo Java code documentation
2. Quy tắc đặt tên trong Java
a. Quy tắc chung.
Nên được hạn chế dùng từ viết tắt.
Không được bắt đầu bằng số, ví dụ: 123sinhVien.
Tên phải được bắt đầu bằng một chữ cái, hoặc các ký tự như $, _, ...
Không được chứa khoảng trắng, các ký tự toán học. Nếu tên bao gồm nhiều từ thì
phân cách nhau bằng dấu _.
Trong Java có phân biệt chữ hoa chữ thường.
b. Đặt tên biến.
Phải tuân theo quy tắc chung ở trên và chữ cái đầu tiên của từ đầu tiên phải viết
thường và chữ cái đầu tiên của các từ tiếp theo phải viết hoa, ví dụ: diemTinh.
Tên biến nên thể hiện rõ kiểu dữ liệu của biến đó. Ví dụ: biến có kiểu là List thì nên đặt
tên là studentList, biến có kiểu là Set thì nên đặt tên là studentSet…
c. Đặt tên phương thức (Method).
Giống quy tắc đặt tên biến nhưng từ đầu tiên phải là động từ. Ví dụ: tinhDiem
d. Đặt tên hằng số (Constant).
Tên hằng số phải tuân theo quy tắc chung ở trên và phải viết hoa (ví dụ: PI).
e. Đặt tên Class và Interface.
Phải tuân theo quy tắc chung ở trên và chữ cái đầu tiên của mỗi từ phải được viết hoa.
Ví dụ: Class SinhVien.
Tên Class nên thêm những từ hậu tố phía sau để thể hiện rõ hơn mục đích của Class
đó, như DivZeroException (ta sẽ tìm hiểu về Exception ở bài sau).
Tên Interface nên có thêm chữ I đằng trước. Ví dụ: IFrame.
Tên lớp dẫn xuất nên có từ Abstract làm tiền tố, ví dụ: Class AbstractStudent (ta sẽ tìm
hiểu về lớp dẫn xuất ở các bài sau).
f. Đặt tên Project.
Phải tuân theo quy tắc chung và chữ cái đầu tiên của mỗi từ phải viết hoa.
g. Đặt tên Package.
Tên Package phải tuân theo quy tắc chung ở trên và phải viết thường.
3. Nhập và xuất ký tự từ bàn phím.
System.out là chuẩn đầu ra.
System.in là chuẩn đầu vào.
System.err dùng để hiển thị thông báo lỗi trong Java.
Ví dụ: Ta có đoạn chương trình sau:
Nhập và xuất ký tự từ bàn phim
1 package nhapxuat;
2 import java.util.Scanner;
3 public class Echo {
4 public static void main(String[] args) {
5 String ten;
6 Scanner scanner = new Scanner(System.in);
7 System.out.println("Mời bạn nhập vào chuỗi: ");
8 ten = scanner.nextLine();
9 // hiển thị chuỗi
10 System.out.println("Chào mừng bạn"+ ten +"đến với Freetuts.net!");
11 }
12 }
\b Xóa lùi 1 ký tự trước \b trong đoạn văn bản. Có bao nhiêu ký tự \b thì sẽ xóa bấy
nhiêu ký tự (chỉ hoạt động khi có chuỗi tồn tại phía trước và phía sau \b).
\' Chèn vào dấu nháy đơn trong đoạn văn bản.
\" Chèn vào dấu nháy kép trong đoạn văn bản.
----------------------------------------------------------------------------------------------------------------------------
float kiểu thực có độ chính xác đơn 32 bit IEEE754 IEEE754 Float
void - - - - Void
8 bit = 1 bytes
Kiểu cơ sở gồm:
- Kiểu luận lý: boolean
- Kiểu ký tự: char
- Kiểu số: + Kiểu nguyên: byte, short, int, long.
+ Kiểu thực: float, double.
a. Kiểu số nguyên trong Java
Kiểu mặc định của các số nguyên là kiểu int và kiểu byte và short rất ít khi được dùng.
Trong java không có kiểu số nguyên không dấu như trong ngôn ngữ C/C++.
Lúc biên dịch đoạn chương trình trên trình dịch sẽ báo lỗi không được phép so sánh biến
kiểu boolean với một giá trị kiểu int.
b. Kiểu số thực trong Java
Đối với kiểu dấu chấm động hay kiểu thực, java hỗ trợ hai kiểu dữ liệu là float và double.
Kiểu float có kích thước 4 byte và giá trị mặc định là 0.0f.
Kiểu double có kích thước 8 byte và giá trị mặc định là 0.0d
Số kiểu dấu chấm động ko có giá trị nhỏ nhất và giá trị lớn nhất. Chúng có thể nhận các giá trị:
Số âm, Số dương
Vô cực âm, Vô cực dương
Nếu có một toán hạng là double thì các toán hạng còn lại sẽ được chuyển thành kiểu double
trước khi thực hiện phép toán.
Biến kiểu float và double có thể ép chuyển sang kiểu dữ liệu khác trừ kiểu boolean.
c. Kiểu ký tự (char) trong Java
Kiểu char trong java có thể biểu diễn tất cả 2^16 = 65536 ký tự khác nhau.
Giá trị mặc định cho một biến kiểu char là null.
Kiểu dữ liệu kí tự: vd: char myLetter = 'D';
a. Kiểu Boolean trong Java
Kiểu boolean chỉ nhận 1 trong 2 giá trị: true hoặc false.
Trong java kiểu boolean không thể chuyển thành kiểu nguyên và ngược lại.
Giá trị mặc định của kiểu boolean là false.
Kiểu dữ liệu Mô tả
Lớp (Class) Là sự cài đặt mô tả về một đối tượng trong bài toán.
Giao diện (Interface) Là 1 thuần trừu tượng được tạo ra cho phép cài đặt đa thừa kế trong Java.
Đặc điểm của các biến kiểu tham chiếu là nó chứa địa chỉ của đối tượng mà nó trỏ đến.
Vùng nhớ của biến tham chiếu được cấp phát ở vùng nhớ stack còn vùng nhớ của đối tượng được
cấp phát ở vùng nhớ heap. Việc truy xất vào vùng nhớ heap chậm hơn truy xất vào vùng nhớ stack tuy
nhiên java có cơ chế cho phép truy cập vào vùng nhớ heap với tốc độ xấp xỉ bằng tốc độ truy cập vào
vùng nhớ stack.
2. Ép kiểu (Type Casting) trong Java.
Ép kiểu là quá trình chuyển đổi kiểu dữ liệu của biến này sang kiểu dữ liệu khác để phục
vụ cho một mục đích nào đó.
Ví dụ: Chúng ta thực hiện phép chia số nguyên 2 cho 4, nếu ta không sử dụng đến ép kiểu
thì kết quả của phép toán này sẽ trả về 0, như vậy thì yêu cầu của bài toán đã không còn
đúng nữa.
Có 2 loại ép kiểu trong Java: Ép kiểu rộng và ép kiểu hẹp.
b. Implicit Casting (Ép kiểu rộng/ Ép kiểu không tường minh).
Chuyển từ kiểu có vùng lưu trữ nhỏ lên kiểu có vùng lưu trữ lớn hoặc về kiểu có cùng kiểu
dữ liệu. Loại này không làm mất mát dữ liệu. Sơ đồ chuyển đổi như sau:
byte → short → int → long → float → double
Lưu ý: nế u muố n tính những cái gì có phân số như diện tích thì phải ép nó về thì sẽ không
dẫ n đế n sai kế t quả.
Ví dụ: Tính thể tích hình cầ u với Thể tích = (4/3) * PI * r3.
Float vol = (float)4/3 * PI * radius * radius * radius;
d. Lưu ý: cách ép rô ̣ng và ép hep̣ không giố ng nhau
Toán tử Mô tả Ví dụ
= Gán giá trị từ các toán hạng bên phải cho toán a = 1 sẽ gán giá trị 1 cho a.
hạng bên trái.
+= Cộng hoặc nối chuỗi toán hạng bên phải vào a += 1 (tương đương với a = a + 1).
toán hạng bên trái và gán lại kết quả cho toán
hạng bên trái.
-= Trừ toán hạng bên phải khỏi toán hạng trái và a -=1 (tương đương với a = a - 1).
gán lại kết quả cho toán hạng bên trái.
*= Nhân toán hạng bên phải với toán hạng bên trái a *= 2 (tương đương với a = a * 2).
và gán lại kết quả cho toán hạng bên trái.
/= Chia toán hạng bên phải cho toán hạng bên trái a /= 2 (tương đương với a = a / 2).
và gán lại kết quả cho toán hạng bên trái.
%= Chia toán hạng bên phải cho toán hạng bên trái a %= 2 (tương đương với a = a % 2).
và lấy phần dư gán cho toán hạng bên trái.
b. Toán tử số học.
Toán tử Mô tả
+ Toán tử cộng.
- Toán tử trừ.
* Toán tử nhân.
/ Toán tử chia.
Toán tử Mô tả
! Phép toán phủ định trên một giá trị luận lý. Nếu một điều kiện đang nhận giá trị là true thì
toán tử này sẽ thay đổi giá trị đó thành false và ngược lại.
- Đối với toán tử ++ và -- thì trong Java có 2 loại là Prefix (tiền tố) và Postfix (hậu tố).
Đối với Prefix thì toán tử ++, -- sẽ đứng đằng trước toán hạng đó. Ví dụ: ++a hoặc --a.
Đối với Postfix thì toán tử ++, -- sẽ nằm đằng sau toán hạng đó. Ví dụ: a++ hoặc a--.
- Sự khác nhau giữa Prefix và Postfix là
Nếu như toán hạng (biến) đó chỉ đứng một mình (ví dụ a++ hoặc a--) thì Postfix hay
Prefix là giống nhau.
Nế u gặp các toán tử tổ ng hợ p trong bài toán phức tạp như firstVariable++ +
++secondVariable - 8; thì ta làm theo các bước như sau:
Bước 3: Gán kết quả vừa có cho toán hạng bên trái. result = 5
Toán tử Mô tả
== (So sánh bằng) So sánh giá trị của toán hạng bên trái và toán hạng bên phải có bằng nhau
hay không. Nếu có thì kết quả trả về true, ngược lại trả về false.
!= (So sánh không bằng) So sánh giá trị của toán hạng bên trái và toán hạng bên phải có không
bằng nhau hay không. Nếu có thì kết quả trả về true, ngược lại trả về false.
> (So sánh lớn hơn). So sánh giá trị của toán hạng bên trái có lớn hơn toán hạng bên phải hay
không. Nếu có thì kết quả trả về true, ngược lại trả về false.
>= (So sánh lớn hơn hoặc bằng) So sánh giá trị của toán hạng bên trái có lớn hơn hoặc bằng toán hạng bên
phải hay không. Nếu có thì kết quả trả về true, ngược lại trả về false.
< (So sánh nhỏ hơn) So sánh giá trị của toán hạng bên trái có nhỏ hơn toán hạng bên phải hay
không. Nếu có thì kết quả trả về true, ngược lại trả về false.
<= (So sánh nhỏ hơn hoặc bằng) So sánh giá trị của toán hạng bên trái có nhỏ hơn hoặc bằng toán hạng bên
phải hay không. Nếu có thì kết quả trả về true, ngược lại trả về false.
Toán tử Mô tả
&& Phép toán luận lý VÀ (AND) trên 2 giá trị, Kết quả trả về true khi cả hai đều đúng.
|| Phép toán luận lý HOẶC (OR) trên 2 giá trị. Kết quả trả về false khi cả hai đều sai.
c. C/ trúc điều khiển if - else if - else. d. Cấ u trúc if - else lồng nhau.
Cấu trúc điều khiển if - else if - else là một Cấu trúc if - else lồng nhau (hay còn gọi là
tập hợp các câu lệnh if, else if bên trong if) là cấu trúc phức tạp nhất của
if và else được dùng để giải quyết những cấu trúc điều khiển if - else. Cú pháp của
yêu cầu phức tạp mà chương trình đề ra. cấu trúc này như sau:
Cú pháp Cú pháp
9 } 6 }
10 // Lệnh kế tiếp 7 } else {
8 //Nếu đk 1 sai thì hđ trong else
9 sẽ được thực hiện
10 }
3. Cấu trúc toán tử điều kiện 3 ngôi.
Toán tử điều kiện 3 ngôi là cấu trúc thay thế của biểu thức điều kiện if - else trong Java.
Cú pháp
Công dụng: Toán tử điều kiện 3 ngôi sẽ kiểm tra giá trị của biểu thức điều kiện, nếu biểu
thức này trả về giá trị đúng thì biểu thức giá trị 1 được tính toán và trở thành giá trị của biểu
thức, nếu biểu thức điều kiện trả về giá trị sai thì biểu thức giá trị 2 được tính toán và trở
thành giá trị của biểu thức.
Ví dụ: Kiể m tra số nhâ ̣p vào là số chẳ n hay lẻ.
String ketQ =(number % 2==0) ? "Số" + number + "là số chẵn" : "Số "+
Cú pháp. Ssssssssssssssssssssssssssssssssssssss
sssssssssssssssssssssssssssssssssssssss
1 switch (biểu_thức) { sssssssssssssssssssssssssssssssssssssss
2 case giá_trị_1: sss
Trong đó:
3 Lệnh 1;
Biểu_thức phải trả về kết quả là một
4 break; số nguyên, chuỗi hoặc một ký tự.
5 case giá_trị_2: Giá_trị_1, giá_trị_2,..., giá_trị_n là
6 Lệnh 2; các biểu thức hằng, nguyên hoặc ký
tự và chúng phải khác nhau.
7 break;
Lệnh 1, Lệnh 2, ..., Lệnh n, Lệnh 0 là
8 ... các câu lệnh như
system.out.println(….); gì đó thôi.
9 case giá_trị_n:
Từ khóa break có thể có hoặc không
10 Lệnh n; có tùy theo từng trường hợp.
11 break;
12 [default: Lệnh 0;]
13 }
Dạng 3: Vòng lặp for vắng mặt cả 3 biểu thức: Khi đó thân của vòng lặp sẽ được
thực hiện liên tục. Lúc đó, trong thân của vòng lặp phải có lệnh để thoát ra ngoài vòng for (chi
tiết về phần này tôi sẽ giới thiệu trong bài sau).
1 for (;;) {
2 // các lệnh
3 // lưu ý: phải có lệnh để thoát ra ngoài vòng lặp
4 }
Output: 80-Java-4040
Lưu ý: Sau chuỗi, tất cả tính toán với toán tử + sẽ được thực hiện là cộng chuỗi.
- Cách 2: Nối chuỗi bằng phương thức concat()
́ Pha
Cu ́p: String tên_chuỗi_3 = tên_chuỗi_1.concat(tên_chuỗi_2);.
́ Pha
1 Cu ́p: char character = tên_chuỗi.charAt(int index);
Chức năng: Hàm trả về ký tự character trong chuỗi có chỉ số là index. Ví dụ:
e. Hàm trả về vị trí xuất hiện đầu tiên của 1 chuỗi trong chuỗi khác.
́ Pha
1 Cu ́p: int result = tên_chuỗi_1.indexOf(tên_chuỗi_2 or 1 giá trị na
̀ o đó);
Chức năng: Hàm trả về vị trí xuất hiện đầu tiên theo chỉ số index của chuỗi string2 hoặc
giá tri ̣ trong string1. Nếu chuỗi string2 or giá tri ̣ không có trong chuỗi string1 thì kết quả trả
về result = -1.
f. Hàm trả về vị trí xuất hiện cuối cùng của 1 chuỗi trong chuỗi khác.
́ Pha
1 Cu ́p: int result = tên_chuỗi_1.lastIndexOf(tên_chuỗi_2 or 1 giá trị);
Chức năng: Hàm trả về vị trí xuất hiện cuối cùng theo chỉ số index của chuỗi string2 hoặc
giá tri ̣ trong string1. Nếu chuỗi string2 or giá tri ̣ ko có trong chuỗi string1 thì kết quả trả
về result = -1.
g. Hàm thay thế một chuỗi con trong chuỗi ký tự bằng chuỗi khác
́ Pha
Cu ́p:
̀ n_thay.replace(char ký_tư
tên_chuỗi_câ ̣_muốn_thay, char ký_tư ̉n_bi
̣_chuâ ̣_thay_vô);
Chức năng: Hàm sẽ tạo một chuỗi con từ vị trí có chỉ số là beginIndex trong chuỗi cha.
Trong cú pháp thứ 2, thì hàm sẽ tạo một chuỗi con bắt đầu từ vị trí có chỉ số là beginIndex và
chỉ số bắt đầu tính từ 0 và chỉ số kết thúc tính từ 1. .
j. Hàm kiể m tra có phải là ký tự thường, hoa hay số không
́ Pha
Cu ́p:
Character.isUpperCase(ký tư ̉m tra có pha
̣): kiê ̉i ký tư
̣ hoa hay k
Character.isLowerCase(ký tư ̉m tra có pha
̣): kiê ̉i ký tư ̀ ng hay k
̣ thươ
Character.isDigit(ký tư ̉m tra có pha
̣): kiê ̣ số hay k
̉i ký tư
3. Ví dụ về chuỗi
a. Ví dụ 1: Viết chương trình nhập từ bàn phím một chuỗi không quá 80 ký tự và
một ký tự bất kỳ. Đếm và in ra màn hình số lần xuất hiện của ký tự đó trong
chuỗi vừa nhập.
Bài giải
Giải thích:
- dùng vòng lặp for, cho biế n i=0 vì ta sẽ xét từ vj trí index=0 trong chuỗi để tìm ký tự cầ n
̀ .
tim
- điề u kiện là số index ta xét phải it́ hơn số index của chuỗi.
- Giá tri ̣ index phải liên tục tăng thì nó mới xét đượ c từng ký tự trong chuỗi.
- Ta dùng hàm if(char kyTu == chuoi.charAt(i)) và count++: để xem thử nế u cái ký tự ta
vừa nhập nó bằ ng với cái hàm chuoi.charAT(i) hay k. nế u nó bằ ng thì tổ ng số lầ n xuấ t hiện
của ký tự là count sẽ tăng lên.
- Ta cho i=0 vì ta sẽ xét từ ký tự đầ u của chuỗi với chỉ số index=0, i ở đây chính là chỉ
số index mà ta bắ t đầ u xét.
- i < chuoi.length(): ta sẽ phải xét giá tri ̣ chỉ số cũng chính là i từ vi ̣ trí đầ u chuỗi là i=0 tới
cuố i chuỗi.
+ phải dùng i<chuoi.length() chỉ số index tính từ 0 còn độ dài của ký tự tính bằ ng 1 nên ta k
đượ c dùng =.
- i++: ta phải tăng chỉ số i lên để tiế p tục xét ký tự tiế p theo.
- Hàm chuoi.charAt(i) nó sẽ trả về ký tự trong chuỗi, trong vòng lặp thứ nhấ t nó sẽ cho
i=0 và hàm sẽ là e==w (lấ y từ ví dụ trên) là sai nên tổ ng count sẽ k tăng, cứ tiế p tục các vòng
lặp tiế p theo cho đế n khi giá tri ̣ của i = tổ ng ký tự của chuỗi -1 thì vòng lặp sẽ kế t thúc và ta
chỉ cầ n xuấ t ra tổ ng số lầ n xuấ t hiện của ký tự cũng chính là biế n count là đượ c.
b. Ví dụ 2: Viết chương trình nhập vào một chuỗi bất kỳ bao gồm cả số, ký tự
thường và ký tự hoa từ bàn phím. Sau đó đếm và in ra số ký tự thường và ký tự
hoa và số có trong chuỗi đó.
Bài giải
36 }