1. Cấu trúc switch
Trong Java, switch dùng để so sánh giá trị biểu thức với các trường hợp cụ thể. Khi khớp, khối lệnh tương ứng được thực thi đến khi gặp break. Nếu không có case khớp, default được thực thi. Giá trị case phải là hằng số, không được trùng lặp. default có thể bỏ qua hoặc đặt bất kỳ vị trí nào. Thiếu break sẽ gây hiện tượng "fall-through" - thực thi liên tiếp các case tiếp theo.
int option = 3;
switch (option) {
case 1:
System.out.println("Lựa chọn 1");
break;
case 2:
System.out.println("Lựa chọn 2");
break;
default:
System.out.println("Giá trị không hợp lệ");
}
2. Xử lý số ngẫu nhiên
Lớp Random trong java.util tạo số ngẫu nhiên. Phương thức nextInt(int bound) trả về số nguyên từ 0 đến bound-1.
import java.util.Random;
Random rng = new Random();
int randomValue = rng.nextInt(50); // Số ngẫu nhiên 0-49
3. Mảng
Mảng là cấu trúc lưu trữ nhiều giá trị cùng kiểu dữ liệu. Khởi tạo tĩnh:
int[] scores = {95, 87, 92}; // Khởi tạo với giá trị cụ thể
Khởi tạo động (cấp phát bộ nhớ theo kích thước):
double[] prices = new double[10]; // Các phần tử mặc định là 0.0
Bảng giá trị mặc định:
| Kiểu dữ liệu | Giá trị mặc định |
|---|---|
| int | 0 |
| double | 0.0 |
| char | '\u0000' |
| boolean | false |
| Object | null |
4. Phân vùng bộ nhớ JVM
Từ JDK 8, method area được thay thế bằng metaspace. Các vùng bộ nhớ chính:
- Stack: Lưu trữ biến cục bộ và lời gọi phương thức
- Heap: Chứa đối tượng và mảng được tạo bằng new
- Metaspace: Lưu trữ thông tin lớp (thay thế method area)
- Native method stack: Dùng cho mã native
- Register: Dành cho CPU
5. Phương thức và overloading
Phương thức là đơn vị thực thi nhỏ nhất. Tham số hình thức (trong khai báo) và tham số thực tế (khi gọi). Phương thức void không trả về giá trị.
public void calculate(int a, int b) {
System.out.println(a + b);
}
// Overloading - cùng tên nhưng tham số khác nhau
public void calculate(double a, double b) {
System.out.println(a * b);
}
6. Kiểu dữ liệu cơ bản và tham chiếu
Kiểu cơ bản: Lưu giá trị trực tiếp. Khi gán cho biến khác, giá trị được sao chép.
Kiểu tham chiếu: Lưu địa chỉ bộ nhớ. Khi truyền vào phương thức, thay đổi trên tham số ảnh hưởng đến dữ liệu gốc.
7. Mảng hai chiều
int[][] matrix = new int[3][];
matrix[0] = new int[]{1, 2};
matrix[1] = new int[]{3, 4, 5};
matrix[2] = new int[]{6};
8. Lớp và đối tượng
public class Laptop {
private String brand;
private double weight;
public void powerOn() {
System.out.println("Khởi động máy");
}
}
Cách tạo đối tượng:
Laptop myLaptop = new Laptop();
myLaptop.brand = "Dell";
9. Đóng gói (Encapsulation)
Sử dụng private cho biến thành viên, kết hợp setter/getter:
public class Product {
private String name;
public void setName(String n) {
name = n;
}
public String getName() {
return name;
}
}
10. Từ khóa this
Phân biệt biến cục bộ và thành viên khi trùng tên:
public class Student {
private String name;
public void setName(String name) {
this.name = name; // this.name chỉ biến thành viên
}
}
11. Constructor
Đặc điểm:
- Tên giống class
- Không có kiểu trả về
- Tự động gọi khi tạo đối tượng
public class User {
private int id;
public User(int userId) {
id = userId;
}
}
12. Thiết kế JavaBean chuẩn
- Tên class mô tả rõ ràng
- Biến thành viên private
- Có constructor không tham số và đầy đủ tham số
- Cung cấp setter/getter cho mọi biến
13. Quá trình tạo đối tượng
- Tải class file vào metaspace
- Khai báo biến tham chiếu
- Cấp phát bộ nhớ heap
- Khởi tạo mặc định cho biến thành viên
- Khởi tạo hiển thị (nếu có)
- Thực thi constructor
- Gán địa chỉ heap cho biến tham chiếu
14. Phạm vi truy cập của modifier
| Modifier | Phạm vi truy cập | Mô tả |
|---|---|---|
| public | Mọi nơi | Truy cập từ bất kỳ lớp nào |
| protected | Cùng package và subclass | Trong package hoặc subclass |
| default | Cùng package | Chỉ trong cùng package |
| private | Trong class | Chỉ trong class hiện tại |