Tìm Hiểu về Access Modifiers trong Java

25-05-2024


Trong lập trình hướng đối tượng (OOP), việc kiểm soát quyền truy cập đến các thành phần của lớp là một phần quan trọng để bảo vệ tính toàn vẹn và bảo mật của dữ liệu. Java cung cấp một số công cụ để kiểm soát phạm vi truy cập này thông qua các "Access Modifiers" (các bộ điều khiển truy cập)

Có bốn loại Access Modifiers chính trong Java: public, protected, default (không có từ khóa), và private. Mỗi loại Access Modifier sẽ xác định phạm vi truy cập khác nhau đối với các thành viên của lớp (biến, phương thức, hay lớp con).

Ngoài ra, còn có nhiều Non-access Modifier như: static, abstract, synchronized, native, volatile, transient,... Nhưng trong bài này chúng ta sẽ chỉ tìm hiểu về các Access Modifier.

  • Private: Chỉ có thể truy cập từ bên trong lớp.
  • Default: Chỉ có thể truy cập nội bộ bên trong package. Nếu bạn không định nghĩa cụ thể phạm vi truy cập sẽ mặc đinh là default.
  • Protected: được truy cập bên trong package và bên ngoài package nhưng phải kế thừa. Nếu không phải là class con kế thừa thì sẽ không thể truy cập từ bên ngoài package
  • Public: Được truy cập ở mọi nơi. Nó có thể truy cập ở bên trong class, bên ngoài class, bên trong package, bên ngoài package.

1. Private

Private Modifier có phạm vi truy cập mang tính hạn chế nhất.

Access Modifier private giới hạn quyền truy cập vào các thành phần chỉ trong nội bộ lớp nơi chúng được khai báo. Điều này có nghĩa là các thành viên của lớp (biến và phương thức) được khai báo là private không thể được truy cập từ bên ngoài lớp đó, kể cả từ các lớp con hoặc các lớp trong cùng một gói.

Trong ví dụ trên, privateVariable được khai báo là private, nghĩa là nó chỉ có thể được truy cập từ bên trong lớp ExampleClass. Hàm getPrivateVariable() sẽ không sinh ra lỗi nhưng nếu bạn cố gằng truy cập biến privateVariable từ bên ngoài class ExampleClass thì bạn sẽ nhận được 1 lỗi.

Bạn không thể truy cập vào biến privateVariable từ class Simple mặc dù cả class simpleExampleClass đều nằm trong cùng 1 package A

Các biến được khai báo private có thể được truy cập bên ngoài lớp nếu như có tạo phương thức public getter cho biến đó tại lớp đó.

Khi đó muốn truy cập vào biến privateVariable ta làm như sau

Ví dụ về khai báo phương thức private:

Ở đây, privateMethod chỉ có thể được gọi từ bên trong lớp ExampleClass. Phương thức publicMethod có thể gọi privateMethod, nhưng các lớp bên ngoài không thể gọi trực tiếp privateMethod.

2. Default

Default Access Modifier (hay còn gọi là package-private) được áp dụng khi bạn không chỉ định rõ ràng một Access Modifier cho các thành viên của lớp (biến hoặc phương thức). Các thành phần được khai báo với Default Access Modifier chỉ có thể được truy cập bởi các lớp trong cùng một gói. Điều này có nghĩa là chúng không thể được truy cập từ các lớp nằm ngoài gói hiện tại, ngay cả khi các lớp này kế thừa từ lớp chứa các thành phần đó.

Cách sử dụng:

Ví dụ khi truy cập trong cùng package:

File: example/Person.java

File: example/TestPerson.java

Trong ví dụ này, lớp PersonTestPerson nằm trong cùng gói example, do đó TestPerson có thể truy cập các thành viên name, age và phương thức display của Person.

Ví dụ truy cập từ package khác:

File: example/Person.java

File: anotherExample/TestPerson.java

Trong ví dụ này, lớp Person nằm trong gói example và lớp TestPerson nằm trong gói anotherExample. Các thành viên và phương thức của Person không thể được truy cập từ TestPerson do Default Access Modifier chỉ cho phép truy cập trong cùng một gói.

3. Protected

Khi bạn khai báo một thành viên là protected, nó có thể được truy cập từ các lớp trong cùng gói và từ các lớp con dù chúng ở gói khác.

Ví dụ về truy cập trong cùng gói:

File: example/Person.java

File: example/SamePackageClass.java

Trong ví dụ này, SamePackageClass nằm trong cùng gói example và có thể truy cập các thành viên protected của Person.

Ví dụ truy cập từ gói khác thông qua kế thừa:

File: example/Person.java

File: anotherExample/Employee.java

File: anotherExample/TestEmployee.java

Trong ví dụ này, Employee kế thừa từ Person và nằm trong gói anotherExample. Employee có thể truy cập các thành viên protected của Person mặc dù nó nằm trong gói khác.

4. Public

Các thành viên (biến và phương thức) được khai báo với public access modifier có thể được truy cập từ bất kỳ đâu trong chương trình, không phụ thuộc vào vị trí của lớp truy cập.

Ví dụ về truy cập trong cùng gói:

File: example/Person.java

File: example/TestPerson.java

Trong ví dụ này, TestPerson nằm trong cùng gói example và có thể truy cập các thành viên public của Person.

Ví dụ truy cập từ gói khác:

File: example/Person.java

File: anotherExample/TestPerson.java

Trong ví dụ này, TestPerson nằm trong gói anotherExample và có thể truy cập các thành viên public của Person mặc dù nó nằm trong gói khác.

Bằng cách nắm vững các Access Modifiers, bạn sẽ có khả năng viết mã nguồn rõ ràng, bảo mật và dễ dàng bảo trì hơn. Hy vọng bài viết này đã cung cấp cho bạn những kiến thức cơ bản cần thiết để bắt đầu áp dụng Access Modifiers trong các dự án Java của mình.