Access modifier trong Java
Công ty Vĩnh Cửu tuyển dụng lập trình viên Java

1- Modifier trong Java

Có hai loại modifier trong java: access modifiersnon-access modifiers.

Các access modifiers trong java xác định độ truy cập (Phạm vi) vào dữ liệu của của các trường, phương thức, cấu tử hoặc class.

Có 4 kiểu của java access modifiers:

  1. private
  2. (Mặc định)
  3. protected
  4. public

Và có một vài non-access modifiers chẳng hạn static, abstract, synchronized, native, volatile, transient, v.v.. Trong tài liệu này chúng ta sẽ học về access modifier.

2- Tổng quan về access modifier

Bảng minh họa dưới đây cho bạn cái nhìn tổng quan về cách sử dụng các access modifier.
Access Modifier Truy cập bên trong class? Truy cập bên trong package? Truy cập bên ngoài package bởi class con? Truy cập bên ngoài class và không thuộc class con?
private Y N N N
Mặc định Y Y N N
protected Y Y Y N
public Y Y Y Y
Bạn có thể hiểu chi tiết hơn theo các ví dụ dưới đây:

3- private access modifier

private access modifier chỉ cho phép truy cập trong nội bộ một class.
Bạn không thể truy cập vào trường private ở bên ngoài class định nghĩa trường private đó. Java sẽ thông báo lỗi tại thời điểm biên dịch class.

4- private constructor

Nếu bạn tạo một class, và có một cấu tử private, bạn không thể tạo một đối tượng của class này từ cấu tử private đó từ bên ngoài class này. Hãy xem ví dụ minh họa:

5- Access modifier mặc định

Trong trường hợp bạn khai báo một trường, method, hoặc cấu tử, class, .. mà không ghi rõ ràng access modifier, điều đó có nghĩa là nó là access modifier mặc định.
Phạm vi truy cập của access modifier mặc định là trong nội bộ package.
// Một class với access modifier mặc định.
// (Không chỉ định public).
class MyClass   {

 // Một trường private access modifier.
 private int myField;

 // Một trường access modifier mặc định.
 // (Không chỉ định public, protected, private).
 String myField2;

 // Một method với access modifier mặc định.
 // (Không chỉ định public, protected, private).
 void showMe()  {

 }
}
Trong cùng một package bạn có thể truy cập vào các thành viên có access modifier mặc định.
Và không được phép truy cập bên ngoài package, kể cả trong class con.

Chú ý:

Với Interface khi bạn khai báo một trường (Field) hoặc một phương thức (Method) bạn luôn phải khai báo là public hoặc để mặc định, nhưng Java luôn hiểu đó là public.
public interface MyInterface  {

   // Đây là một trường, bạn không thể khai báo private hoặc protected.
  public static int MY_FIELD1 = 100;

  // Đây là một trường, bạn để access modifier mặc định.
  // Tuy nhiên Java coi đây là public.
  static int MY_FIELD2 = 200;

  // Đây là một method, bạn để access modifier mặc định.
  // Tuy nhiên Java coi đây là public
  void showInfo();
}

6- protected access modifier

protected access modifier có thể truy cập bên trong package, hoặc bên ngoài package nhưng phải thông qua tính kế thừa.

 
protected access modifier chỉ áp dụng cho field, method và constructor. Nó không thể áp dụng cho class (class, interface, enum, annotation).

7- public access modifier

public access modifier là mạnh mẽ nhất và có thể truy cập ở mọi nơi. Nó có phạm vi truy cập rộng nhất so với các modifier khác.

8- Ghi đè method

Bạn có thể ghi đè một method của class cha với một method cùng tên cùng tham số tại class con, tuy nhiên bạn không được phép làm hạn chế phạm vi truy cập của method này.
Trên hình minh họa trên.
  1. Class Cat mở rộng từ class Animal và ghi đè method move(), phạm vi truy cập ghi đè từ protected thành public, điều này là hợp lệ.
  2. Class Mouse mở rộng từ class Animal và ghi đè method move(), phạm vi truy cập ghi đè từ protected thành mặc định, làm giảm phạm vi truy cập của method gốc, điều này không được phép.