Access modifier trong Java xác định quyền truy cập trên các biến, các phương thức của class này từ các class khác trong cùng package hoặc ở hai package khác nhau.
Có bốn loại access modifier trong Java đó là: public, protected, default và private. Tổng quan mỗi loại access modifier có ý nghĩa như sau:
- public: tất cả các class khác trong hay ngoài package và nội bộ class đều có thể truy cập đến các biến, các phương thức public của class này.
- protected: chỉ những class ở cùng package hoặc những class extends từ class này và nội bộ class mới có thể truy cập đến các biến, phương thức public của class này.
- default: chỉ những class ở cùng package với class này và nội bộ class thì mới có thể truy cập đến các biến, các phương thức public của class này.
- private: chỉ những class nằm bên trong class này mới có quyền truy cập đến các biến, phương thức public của class này.
Để các bạn có thể hiểu rõ hơn, chúng ta hãy đi qua từng access modifier nhé các bạn!
Public access modifier
Đây là access modifier ít giới hạn quyền truy cập nhất, các public class hoặc interface có thể được truy cập từ tất cả các package, bao gồm nội bộ class hoặc inteface cho đến các class nằm trong các package khác nhau.
Ví dụ, mình có class Student được định nghĩa là public class nằm trong package com.huongdanjava và nó có một biến public là name và một phương thức public là goToSchool() như sau:
1 2 3 4 5 6 7 8 9 |
package com.huongdanjava; public class Student { public String name = "Khanh"; public void goToSchool() { } } |
Và mình có một class khác tên là Example nằm trong default package, class này có thể truy cập đến các biến, các phương thức của class Student như sau:
Protected access modifier
Các biến, các phương thức được định nghĩa với protected access modifier chỉ có truy cập từ các class nằm trong cùng package và các class con extends từ class này.
Trở lại ví dụ trong phần public access modifier, nếu bây giờ mình sửa lại access modifier của biến name và phương thức goToSchool thành protected như sau:
1 2 3 4 5 6 7 8 9 |
package com.huongdanjava; public class Student { protected String name = "Khanh"; protected void goToSchool() { } } |
Thì lúc này trong class Example, lỗi compile sẽ xuất hiện:
Bạn chỉ có thể truy cập các biến, phương thức này trong class Example khi để nó extends từ class Student và không tạo mới đối tượng Student như sau;
Default access modifier
Các biến, các phương thức được định nghĩa mà không sử dụng một access modifier nào thì nó sẽ có access modifier mặc định. Những biến, phương thức này chỉ có thể truy cập từ các class nằm trong cùng package.
Tiếp theo ví dụ trên, bây giờ mình xóa các access modifier định nghĩa cho biến name và phương thức goToSchool() của class Student như sau:
1 2 3 4 5 6 7 8 9 |
package com.huongdanjava; public class Student { String name = "Khanh"; void goToSchool() { } } |
Trở lại class Example, các bạn sẽ bị lỗi compile ngay:
Để giải quyết lỗi này, chúng ta chỉ có cách di chuyển class Example nằm cùng package với class Student như sau:
Lúc này, lỗi compile sẽ tự động biến mất.
Private access modifier
Đây là access modifer giới hạn quyền truy cập nhiều nhất, với access modifier này các biến, các phương thức của chúng ta chỉ có thể truy cập ở bên trong class.
Ví dụ, bây giờ mình sẽ thêm private vào các biến, phương thức của class Student,
1 2 3 4 5 6 7 8 9 |
package com.huongdanjava; public class Student { private String name = "Khanh"; private void goToSchool() { } } |
ngay lúc này class Example sẽ bị lỗi compile ngay.
Nếu mình tạo một class khác bên trong class Student với nội dung gần giống như class Example thì sẽ không bị lỗi compile như trên
Access modifier với phương thức ghi đè trong class con
Nếu một class con ghi đè một phương thức của class cha, thì phương thức ghi đè này không được giảm quyền truy cập của phương thức đó, ví dụ nếu access modifier của phương thức ở class cha là default access modifier thì trong class con, chúng ta không được định nghĩa access modifier cho phương thức ghi đè này là private.
Ví dụ cụ thể hơn, mình có class Student như sau:
1 2 3 4 5 6 7 8 9 |
package com.huongdanjava; public class Student { public String name = "Khanh"; void goToSchool() { } } |
và class Example extends từ class Student. Giờ nếu mình muốn ghi đè phương thức goToSchool() trong class Example thì mình phải định nghĩa access modifier của phương thức ghi đè là protected hoặc public.
hoặc
Bạn không thể định nghĩa nó là private được.