Access modifier là từ khoá kiểm soát phạm vi truy cập của class, field, method, hoặc nested class trong Java. Có bốn mức, từ hẹp nhất đến rộng nhất: private, default (không ghi gì), protected, public.
Bảng dưới tóm tắt mức truy cập:
| Modifier | Cùng class | Cùng package | Subclass (khác package) | Mọi nơi |
|---|---|---|---|---|
private | Có | Không | Không | Không |
| default (không có) | Có | Có | Không | Không |
protected | Có | Có | Có | Không |
public | Có | Có | Có | Có |
Cơ chế hoạt động dựa trên hai ranh giới: package và quan hệ kế thừa. private chặn cả hai, default chỉ mở trong package, protected mở thêm cho subclass ở package khác, public bỏ mọi rào cản. Top-level class chỉ dùng được public hoặc default; field/method/nested class dùng được cả bốn.
public class Account {
private final String id; // chỉ class này truy cập
protected BigDecimal balance; // subclass dùng được
String accountType; // default — package-private
public String getId() { return id; }
}Lỗi thường gặp: nghĩ protected là "public trong package + private ngoài package". Thực tế protected còn cho subclass ở package khác truy cập qua kế thừa, nhưng không truy cập qua tham chiếu kiểu cha. Ví dụ sub.protectedMethod() hợp lệ trong subclass, còn parent.protectedMethod() thì không nếu parent không phải kiểu subclass.
Lưu ý: chọn modifier hạn chế nhất đủ dùng; mở rộng sau dễ, thu hẹp sau khó vì code bên ngoài có thể đã phụ thuộc. Java 9+ còn cần module exports package thì public mới visible cross-module.