Public trong Java là gì? Đây là access modifier có phạm vi truy cập rộng nhất, cho phép class, method hoặc biến được truy cập từ bất kỳ đâu trong chương trình. Public là một trong bốn access modifier (từ khóa phạm vi truy cập) cốt lõi trong lý thuyết Java cơ bản mà mọi lập trình viên cần nắm vững để kiểm soát tính đóng gói và bảo mật code.
Access Modifier trong Java hoạt động như thế nào
Access modifier là các từ khóa đặt trước khai báo class, method hoặc biến để xác định phạm vi truy cập của chúng. Java cung cấp bốn mức độ kiểm soát truy cập: public, protected, default và private.
Với class, bạn chỉ có thể sử dụng public hoặc default. Với method và biến, cả bốn modifier đều khả dụng. Sự khác biệt này xuất phát từ cách Java tổ chức code theo package và cơ chế nạp class.
Mỗi modifier phục vụ một mục đích cụ thể trong thiết kế hệ thống:
- Default: Truy cập trong cùng package
- Private: Truy cập chỉ trong class định nghĩa
- Public: Truy cập không hạn chế
- Protected: Truy cập trong package và qua kế thừa
Access Modifier Scope Diagram
Public Access Modifier: Phạm vi và cách sử dụng
Public cho phép truy cập toàn cục. Khi bạn khai báo một class, method, constructor hoặc interface là public, chúng có thể được gọi từ bất kỳ class nào trong toàn bộ ứng dụng, kể cả từ các package khác.
Tuy nhiên, có một điều kiện: nếu class public nằm trong package khác, bạn phải import nó trước khi sử dụng. Đây là cơ chế namespace của Java, giúp tránh xung đột tên và tổ chức code rõ ràng hơn.
Public thường được dùng cho:
- API class mà các module khác cần tương tác
- Entry point như method
main() - Interface định nghĩa hợp đồng giữa các thành phần
⚠️ Lưu ý: Một file
.javachỉ được chứa tối đa một public class, và tên file phải trùng với tên class public đó.
Private Access Modifier: Đóng gói và bảo mật dữ liệu
Private là modifier hạn chế nhất. Method, biến hoặc constructor được khai báo private chỉ có thể truy cập trong chính class định nghĩa chúng. Class và interface không thể là private ở cấp độ top-level.
Đây là công cụ chính để thực hiện encapsulation (đóng gói) – một trong bốn trụ cột của lập trình hướng đối tượng. Bằng cách giấu implementation details, bạn bảo vệ dữ liệu khỏi thay đổi không kiểm soát từ bên ngoài.
Để cho phép truy cập có kiểm soát đến biến private, bạn tạo public getter/setter method. Cách này cho phép bạn thêm validation logic hoặc logging mà không ảnh hưởng đến code sử dụng class.
Private method thường dùng cho:
- Helper function phục vụ logic nội bộ
- Các bước trung gian trong thuật toán phức tạp
- Code cần tái sử dụng trong class nhưng không nên expose ra ngoài
Protected Access Modifier: Cân bằng giữa đóng gói và kế thừa
Protected cho phép truy cập trong cùng package và từ các subclass, kể cả khi subclass nằm ở package khác. Đây là điểm khác biệt quan trọng so với default modifier.
Protected không áp dụng cho class và interface ở cấp độ top-level. Nó chủ yếu dùng cho method và biến mà bạn muốn subclass có thể override hoặc truy cập, nhưng vẫn giấu khỏi các class không liên quan.
Trong thực tế, protected thường xuất hiện trong:
- Base class của framework, nơi subclass cần mở rộng hành vi
- Template method pattern, nơi class cha định nghĩa skeleton và subclass điền chi tiết
- Biến mà subclass cần đọc/ghi trực tiếp để tối ưu performance
⚠️ Lưu ý: Method và biến trong interface không thể là protected. Interface member mặc định là public.
Default Access Modifier: Phạm vi package-private
Khi bạn không khai báo modifier nào, Java áp dụng default access (còn gọi là package-private). Class, method hoặc biến này chỉ truy cập được trong cùng package.
Default modifier hữu ích khi bạn muốn nhóm các class liên quan trong một package và cho phép chúng tương tác tự do, nhưng giấu implementation khỏi code bên ngoài package.
Các trường hợp sử dụng default:
- Helper class chỉ phục vụ các class khác trong package
- Internal API không muốn expose ra ngoài module
- Class đang trong giai đoạn phát triển, chưa sẵn sàng public
Trong interface, biến mặc định là public static final và method mặc định là public, bất kể bạn có khai báo hay không.
Quy tắc Access Modifier khi kế thừa
Java áp đặt các ràng buộc nghiêm ngặt về access modifier trong quan hệ kế thừa để đảm bảo tính nhất quán và ngăn vi phạm encapsulation:
Method public trong class cha phải là public trong subclass. Bạn không thể thu hẹp phạm vi truy cập khi override.
Method protected trong class cha có thể là protected hoặc public trong subclass, nhưng không được là private hoặc default.
Method default (không có modifier) trong class cha có thể là bất kỳ modifier nào trong subclass, kể cả private.
Method private không được kế thừa, do đó không có ràng buộc nào áp dụng. Nếu subclass định nghĩa method cùng tên, đó là method hoàn toàn mới, không phải override.
Các quy tắc này đảm bảo rằng subclass không thể phá vỡ hợp đồng mà superclass đã cam kết với code sử dụng nó. Đây là biểu hiện của Liskov Substitution Principle trong thiết kế hướng đối tượng.
Public trong Java là gì giờ đã rõ ràng: đó là công cụ mạnh mẽ để expose API, nhưng cần sử dụng cùng với các modifier khác để xây dựng kiến trúc code vừa linh hoạt vừa an toàn. Hiểu rõ từng modifier và biết khi nào dùng chúng là kỹ năng cốt lõi giúp bạn viết Java code chuyên nghiệp.
Cập nhật lần cuối 13/03/2026 by Hiếu IT
