Access Modifiers trong Java chỉ định khả năng / cấp độ truy cập hoặc phạm vi của một field, method, constructor hoặc class.
Chúng ta có thể thay đổi mức độ truy cập của các field, method, constructor hoặc class bằng cách áp dụng Access Modifiers trên đó.
Có bốn loại Access Modifiers trong Java:
- private: Cấp độ truy cập của private chỉ nằm trong class. Nó không thể được truy cập từ bên ngoài class.
- default: Cấp truy cập của default chỉ nằm trong package. Nó không thể được truy cập từ bên ngoài package. Nếu bạn không chỉ định bất kỳ cấp độ truy cập nào, nó sẽ là cấp độ default
- protected: Mức truy cập của protected nằm trong package và bên ngoài package thông qua class con. Nếu bạn không tạo class con, nó không thể được truy cập từ bên ngoài package
- public: Cấp truy cập của public ở khắp mọi nơi. Nó có thể được truy cập từ bên trong class, bên ngoài class, trong class và bên ngoài package
1. Sử dụng private trong Java
Sử dụng private khiến cho các field, method, constructor hoặc class chỉ có thể truy cập được trong cùng class.
Ví dụ đơn giản về private:
- Trong ví dụ này, chúng tôi đã tạo hai lớp A và Test.
- Một lớp chứa biến private và phương thức private.
- Sau đó, chúng ta thử truy cập các data member từ bên ngoài class để xem kết quả thế nào
class A {
private int x = 18;
private void thongBao() {
System.out.println("x là: " + x);
}
}
public class Test{
public static void main(String args[]) {
A a = new A();
System.out.println(a.x); // Compile Time Error
a.thongBao(); // Compile Time Error
}
}
Còn nếu làm như thế này thì có thể truy cập được private member:
class A {
private int x = 18;
private void thongBao() {
System.out.println("x là: " + x);
}
public static void main(String args[]) {
A a = new A();
System.out.println(a.x); // 18
a.thongBao(); // x là: 18
}
}
Vai trò của private constructor
Nếu bạn đặt bất kỳ phương thức khởi tạo nào ở chế độ private, bạn không thể tạo đối tượng của class đó từ bên ngoài class.
Ví dụ:
class A {
private A() {} // private constructor
void thongBao() {
System.out.println("Học JAVA");
}
}
public class Test {
public static void main(String args[]){
A a = new A(); // Compile Time Error
}
}
Lưu ý: Một class không thể là private hoặc protected ngoại trừ class lồng nhau.
2. Sử dụng default trong Java
Nếu bạn không chỉ định bất kỳ mức độ truy cập nào, nó mặc định sẽ có mức độ truy cập default.
Cấp độ truy cập default chỉ có thể truy cập được trong package. Nó không thể được truy cập từ bên ngoài package.
Nó cung cấp khả năng truy cập lớn hơn là private. Tuy nhiên, nó hạn chế hơn protected và public.
Ví dụ về default:
- Trong ví dụ này, chúng ta đã tạo hai gói pack và mypack.
- Chúng ta truy cập class A từ bên ngoài package của nó,.
- Vì class A không phải là public nên không thể truy cập từ bên ngoài package pack.
// Lưu là file A.java
package pack;
class A{
void thongBao() {
System.out.println("Đang học JAVA");
}
}
// Lưu là file B.java
package mypack;
import pack.*;
class B {
public static void main(String args[]){
A a = new A(); // Compile Time Error
a.thongBao(); // Compile Time Error
}
}
Trong ví dụ trên, phạm vi của lớp A và phương thức thonBao() của nó là default nên không thể truy cập từ bên ngoài package pack.
3. Sử dụng protected trong Java
Sử dụng protected có thể truy cập được trong package và bên ngoài package nhưng chỉ thông qua kế thừa.
Công cụ chỉ định mức độ truy cập protected có thể được áp dụng trên data member, method và constructor. Nó không thể được áp dụng trên class.
Nó cung cấp nhiều khả năng truy cập hơn default.
Ví dụ về protected:
- Trong ví dụ này, chúng ta đã tạo hai gói pack và mypack.
- Class A của package pack là public, vì vậy có thể được truy cập từ bên ngoài package.
- Nhưng phương thức thongBao của package này được khai báo là protected, vì vậy nó chỉ có thể được truy cập từ bên ngoài class thông qua kế thừa.
// Lưu file là A.java trong package pack
package pack;
public class A{
protected void thongBao(){
System.out.println("Đang học JAVA");
}
}
// Lưu file là B.java trong package mypack
package mypack;
import pack.*;
class B extends A {
public static void main(String args[]) {
B b = new B();
b.thongBao();
}
}
Kết quả:
Đang học JAVA
4. Sử dụng public
Mức độ truy cập public có thể truy cập được ở mọi nơi. Nó có phạm vi rộng nhất trong số tất cả các mức độ truy cập.
Ví dụ về public:
// Lưu file là A.java trong package pack
package pack;
public class A {
public void thongBao() {
System.out.println("Đang học JAVA");
}
}
// Lưu file là B.java trong package mypack
package mypack;
import pack.*;
class B {
public static void main(String args[]) {
A a = new A();
a.thongBao();
}
}
Kết quả:
Đang học JAVA
Nếu bạn đang ghi đè (Overriding) bất kỳ phương thức nào, thì phương thức ghi đè (tức là được khai báo trong lớp con) không được có phạm vi nhỏ hơn.
Ví dụ:
class A{
protected void thongBao(){
System.out.println("Đang học JAVA");
}
}
public class Test extends A{
// Ghi đè phương thức
void thongBao(){
System.out.println("Học JAV"); // Lỗi
}
public static void main(String args[]){
Test test = new Test();
test.thongBao();
}
}
Bởi vì phạm vi của default nhỏ hơn protected nên đó là lý do tại sao chương trình trên bị dính lỗi biên dịch.
Các mức độ truy cập (Access Modifiers) trong Java như private, default, protected và public cung cấp cho chúng ta khả năng tạo ra các chương trình Java linh hoạt, chặt chẽ hơn, bảo mật hơn.
Bạn có thể thử tạo chương trình và thử truy cập để thành thục sử dụng Access Modifiers này bạn nhé.
Tham khảo ngay KHÓA HỌC JAVA WEB để có thể sử dụng ngôn ngữ này tạo ra các trang web thú vị, có thể đi làm sớm hơn lấy nhiều kinh nghiệm hơn.