JDK, JRE và JVM
- JDK (Java Development Kit): Bộ công cụ phát triển ứng dụng Java.
- JRE (Java Runtime Environment): Môi trường cần thiết để chạy ứng dụng Java.
- JVM (Java Virtual Machine): Máy ảo thực thi bytecode Java, đảm bảo tính "viết một lần, chạy mọi nơi".
Cài đặt JDK
Phiên bản JDK 8 vẫn được sử dụng phổ biến.
Cài đặt và cấu hình
- Tải JDK từ trang chủ Oracle (chấp nhận điều khoản giấy phép).
- Ghi nhớ đường dẫn cài đặt để thiết lập biến môi trường.
- Cấu hình biến môi trường:
- Mở
sysdm.cpl→ Advanced system settings → Environment Variables. - Thêm biến hệ thống:
JAVA_HOMEtrỏ tới thư mục cài JDK. - Thêm
%JAVA_HOME%\binvào biếnPath. - Kiểm tra bằng lệnh:
java -version.
- Mở
Cấu trúc thư mục JDK
bin: Chứa các công cụ nhưjavac,java.include: Header file cho JNI (giao tiếp với C/C++).jre: Thư viện runtime (một số phiên bản JDK mới không có thư mục này riêng biệt).lib: Thư viện hỗ trợ.src.zip: Mã nguồn các lớp chuẩn của Java.
Ví dụ đầu tiên: Hello World
- Tạo thư mục dự án (ví dụ:
HelloWorld). - Tạo tập tin
Hello.java(đảm bảo phần mở rộng hiển thị rõ ràng). - Viết mã nguồn:
public class Hello { public static void main(String[] args) { System.out.println("Hello, World!"); } }Lưu ý: Tên file phải trùng với tên lớp khai báo sau
public class, phân biệt hoa thường. - Biên dịch:
javac Hello.java(thực hiện trong thư mục chứa file). - Chạy chương trình:
java Hello(không kèm phần mở rộng.class).
Cơ chế thực thi Java
Java kết hợp cả biên dịch và thông dịch:
- Mã nguồn (
.java) được biên dịch thành bytecode (.class) bởijavac. - Bytecode được nạp vào JVM qua Class Loader.
- Bytecode được xác minh tính hợp lệ.
- JVM dùng Interpreter hoặc JIT Compiler để thực thi bytecode.
Cú pháp cơ bản
Chú thích
// Chú thích một dòng
/*
* Chú thích nhiều dòng
*/
/**
* Chú thích tài liệu (Javadoc)
* @author DevTeam
*/
Từ khóa và định danh
Quy tắc đặt tên định danh:
- Bắt đầu bằng chữ cái (A–Z, a–z), dấu gạch dưới (
_) hoặc ký tự đô la ($). - Các ký tự tiếp theo có thể là chữ, số,
_hoặc$. - Không được trùng với từ khóa.
- Phân biệt chữ hoa/thường.
- Cho phép sử dụng ký tự Unicode (kể cả tiếng Việt hoặc tiếng Trung).
Ví dụ hợp lệ: age, $price, _count, 姓名
Ví dụ không hợp lệ: 123var, -value, #tag
Kiểu dữ liệu
Java là ngôn ngữ kiểu mạnh — mọi biến phải được khai báo kiểu trước khi dùng.
Hai loại kiểu dữ liệu
- Kiểu nguyên thủy (primitive):
- Số nguyên:
byte(1 byte),short(2),int(4),long(8). - Số thực:
float(4 byte),double(8 byte). - Ký tự:
char(2 byte, mã Unicode). - Luận lý:
boolean(chỉtrue/false).
- Số nguyên:
- Kiểu tham chiếu (reference): lớp, mảng, interface.
Biểu diễn hệ cơ số
int decimal = 10;
int binary = 0b1010; // hệ nhị phân
int octal = 012; // hệ bát phân
int hex = 0xA; // hệ thập lục phân
Lưu ý về số thực
Không nên dùng float/double cho tính toán chính xác (như tiền tệ). Thay vào đó, dùng BigDecimal.
float f = 0.1f;
double d = 1.0 / 10;
System.out.println(f == d); // false — do lỗi làm tròn
Ký tự và mã Unicode
char c = 'A';
System.out.println((int) c); // 65
char unicodeChar = '\u0041'; // tương đương 'A'
Ép kiểu dữ liệu
- Không thể ép kiểu
booleansang kiểu khác. - Ép kiểu thu hẹp (từ lớn sang nhỏ) cần cast tường minh và có thể mất dữ liệu.
int large = 200;
byte small = (byte) large; // kết quả: -56 (do tràn byte)
Từ JDK 7+, có thể dùng dấu gạch dưới để phân tách số: int million = 1_000_000;
Biến và phạm vi
- Biến lớp (static): Dùng chung cho tất cả đối tượng, khai báo với
static. - Biến instance: Thuộc về từng đối tượng, có giá trị mặc định nếu chưa khởi tạo.
- Biến cục bộ: Chỉ tồn tại trong phương thức/khối lệnh, phải khởi tạo trước khi dùng.
public class ScopeDemo {
static double baseSalary = 10000; // biến lớp
String employeeName; // biến instance (mặc định null)
public static void main(String[] args) {
int counter = 0; // biến cục bộ
ScopeDemo obj = new ScopeDemo();
System.out.println(obj.employeeName); // null
System.out.println(counter); // 0
}
}
Quy ước đặt tên
- Lớp: Viết hoa chữ đầu mỗi từ (PascalCase) —
UserManager. - Phương thức & biến: Chữ đầu viết thường, các từ sau viết hoa (camelCase) —
calculateTotal(),userName. - Hằng số: Viết hoa toàn bộ, dùng gạch dưới —
MAX_RETRY_COUNT.
Hằng số
Khai báo bằng từ khóa final:
final double PI = 3.14159;
Toán tử
Toán tử số học
+ - * / %
Toán tử gán
= += -= *= /=
Toán tử quan hệ
> < >= <= == != instanceof
Toán tử logic
&& (AND), || (OR), ! (NOT)
Toán tử bit
& | ^ ~ << >> >>>
Toán tử điều kiện (ba ngôi)
condition ? valueIfTrue : valueIfFalse
Ví dụ minh họa
// Toán tử một ngôi
int x = 5;
int y = x++; // y = 5, x = 6
int z = ++x; // x = 7, z = 7
// Nối chuỗi
System.out.println("" + 2 + 3); // "23"
System.out.println(2 + 3 + ""); // "5"
// So sánh logic
boolean result = (5 > 3) && (2 < 4); // true