1. Từ khóa abstract (Trừu tượng)
Từ khóa abstract được sử dụng để định nghĩa các lớp và phương thức trừu tượng, đóng vai trò làm khuôn mẫu cho các lớp con kế thừa.
Lớp trừu tượng (Abstract Class)
- Cú pháp:
abstract class TenLop {} - Đặc điểm: Không thể khởi tạo đối tượng trực tiếp từ lớp trừu tượng (không dùng
new). - Lớp này vẫn có thể chứa các thuộc tính, phương thức thông thường và hàm khởi tạo (constructor).
Phương thức trừu tượng (Abstract Method)
- Cú pháp:
public abstract void tenPhuongThuc(); - Đặc điểm: Chỉ có phần khai báo, không có thân hàm (không có dấu
{}). - Ràng buộc: Phương thức trừu tượng bắt buộc phải nằm trong một lớp trừu tượng.
Quan hệ kế thừa
Lớp con kế thừa từ lớp trừu tượng phải thực hiện (override) tất cả các phương thức trừu tượng của lớp cha, trừ khi bản thân lớp con đó cũng được khai báo là abstract.
// Định nghĩa lớp trừu tượng
abstract class DongVat {
String ten;
public DongVat() {
System.out.println("Khởi tạo lớp DongVat");
}
public void thongTin() {
System.out.println("Đây là một loài động vật.");
}
// Phương thức trừu tượng
public abstract void phatAmThanh();
}
// Lớp con kế thừa
class ConMeo extends DongVat {
@Override
public void phatAmThanh() {
System.out.println("Meo meo...");
}
}
public class MainAbstract {
public static void main(String[] args) {
DongVat dv = new ConMeo();
dv.thongTin();
dv.phatAmThanh();
}
}
2. Từ khóa static (Tĩnh)
static được dùng để quản lý bộ nhớ hiệu quả hơn bằng cách gắn các thành phần trực tiếp vào lớp thay vì vào từng đối tượng cụ thể.
Biến tĩnh (Static Variables)
- Biến
static(biến lớp) được dùng chung bởi tất cả các instance của lớp đó. - Truy cập trực tiếp thông qua
TenLop.tenBien.
Phương thức tĩnh (Static Methods)
- Có thể gọi mà không cần tạo đối tượng.
- Lưu ý: Phương thức
statickhông thể truy cập trực tiếp các biến instance hoặc phương thức không tĩnh (non-static) và không thể sử dụng từ khóathishoặcsuper.
Khối lệnh tĩnh (Static Block)
- Được sử dụng để khởi tạo các biến tĩnh. Khối này chạy duy nhất một lần khi lớp được nạp vào bộ nhớ (class loading).
class BoDem {
int idInstance = 0; // Biến instance
static int demHeThong = 0; // Biến static
static {
System.out.println("Khối static: Khởi tạo hệ thống bộ đếm");
demHeThong = 100;
}
public BoDem() {
idInstance++;
demHeThong++;
}
public static void hienThiTongSo() {
System.out.println("Tổng số đếm hiện tại: " + demHeThong);
}
}
public class MainStatic {
public static void main(String[] args) {
BoDem b1 = new BoDem();
BoDem b2 = new BoDem();
BoDem.hienThiTongSo(); // Gọi qua tên lớp
}
}
3. Từ khóa final (Cuối cùng/Bất biến)
Từ khóa final mang ý nghĩa ngăn chặn sự thay đổi hoặc kế thừa.
Biến final
- Khi gán
finalcho một biến, giá trị của nó không thể thay đổi sau khi đã được khởi tạo (trở thành hằng số). - Đối với biến tham chiếu đối tượng, bạn không thể thay đổi đối tượng mà nó trỏ tới, nhưng có thể thay đổi thuộc tính bên trong đối tượng đó.
Phương thức final
- Ngăn chặn các lớp con ghi đè (override) phương thức này.
Lớp final
- Ngăn chặn việc kế thừa. Không một lớp nào có thể
extendstừ một lớpfinal.
final class CauHinhHeThong {
public void hienThi() {
System.out.println("Cấu hình bảo mật.");
}
}
class TaiKhoan {
final int MA_SO_DINH_DANH = 101;
public final void baoMat() {
System.out.println("Phương thức bảo mật không thể bị ghi đè.");
}
}
public class MainFinal {
public static void main(String[] args) {
final TaiKhoan tk = new TaiKhoan();
// tk = new TaiKhoan(); // Lỗi: không thể gán lại đối tượng mới cho biến final
System.out.println("Mã số: " + tk.MA_SO_DINH_DANH);
}
}