Access Modifier Trong Java

Access Modifier Trong Java

Có hai loại Modifier trong Java, đó là: Access Modifier và Non-access Modifier. Access Modifer trong Java xác định phạm vi có thể truy cập của thành viên dữ liệu, phương thức, constructor hoặc lớp. Có 4 loại Access Modifier là: Private, default, protected, và public.

Default: Truy cập trong nội bộ package

Private: Truy cập trong nội bộ lớp

Public: Thành phần công khai, truy cập tự do từ bên ngoài

Protected: Thành phần được bảo vệ, bị hạn chế truy nhập từ bên ngoài

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

I. Access Modifier Java Là Gì

Access Modifier là những từ dùng trước những khai báo class, biến, method để thể hiện khả năng truy cập những thể hiện của class, biến và method đó ở những class khác.

Với class ta có 2 loại access modifier là public và default nhưng với biến và phương thức thì ta có 4 access modifier (public, protected, default, Private)

Khi nói đến khả năng truy cập (access) ta cần phân biệt 2 trường hợp:

– Trường hợp 1: khi một method của một class có thể truy cập biến hoặc method của class khác.

– Trường hợp 2: khi một class con có thể thừa kế những biến/method của class cha.

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ả những class khác trong hay ngoài package và nội bộ class đều có thể truy cập đến những biến, những 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 những 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 những biến, những 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 những biến, phương thức public của class này.

Ngoài ra còn có nhiều Non-access Modifier như static, abstract, synchronized, native, volatile, transient, … Chương này mọi người sẽ tìm hiểu về Access Modifier.

Các bạn cùng theo dõi bảng sau để có cái nhìn sơ lược về những loại Access Modifier trong Java:

Access Modifier Bên trong lớp Bên trong package Bên ngoài package chỉ bởi lớp con Bên ngoài package
Private C K K K
default C C K K
protected C C C K
public C C C C

1. Phạm Vi Truy Cập Private

Các phương thức, biến và constructor mà được khai báo Private chỉ có thể được truy cập trong chính lớp được khai báo đấy.

Private Access Modifier là chế độ truy cập mang tính hạn chế nhất. Lớp và interface không thể là Private.

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

Dùng Private Access Modifier trong Java là cách chủ yếu để một đối tượng bao đóng chính nó và ẩn dữ liệu với bên ngoài.

Trong ví dụ dưới đây, chúng ta tạo 2 lớp A và Simple. Lớp A chứa thành viên dữ liệu Private và phương thức Private. Chúng ta đang truy cập các thành viên Private này từ bên ngoài lớp, và điều này dẫn đến 1 Compile time error:

class A {
  Private int data = 40;
  Private void msg() {
    System.out.println("Hello java");
  }
}

public class Simple {
  public static void main(String args[]) {
    A obj = new A();
    System.out.println(obj.data); //Compile Time Error  
    obj.msg(); //Compile Time Error  
  }
}

Vai trò của Private Constructor

Nếu bạn tạo bất kỳ constructor là Private trong lớp, bạn sẽ không thể tạo instance của class bên ngoài nó. Ví dụ:

class A {
    Private A() {
    }//Private constructor
 
    public void msg() {
        System.out.println("Hello java");
    }
}
 
public class Simple {
    public static void main(String args[]) {
        A obj = new A();//Compile Time Error
    }
}

2. Phạm Vi Truy Cập Default

1 thuộc tính hoặc phương thức của 1 lớp mà không được khai báo với với bất kỳ phạm vi truy cập nào thì nó sẽ có phạm vi truy cập là mặc định. Lúc đấy các thuộc tính và phương thức đó có thể truy cập được từ trong lớp khai báo và các lớp cùng gói với lớp khai báo.

package default_accessmodifier;
 
// khai báo 1 lớp có tên là MyClass
// và có phạm vi truy cập là mặc định
class MyClass {
    private String nameOfClass = "DQN12";
     
    void hienThiTenLop() {
        System.out.println(nameOfClass);
    }
     
    public static void main(String[] args) {
        MyClass myClass = new MyClass();
        myClass.hienThiTenLop();
    }
}

Ngoài ra, chúng ta cũng có thể truy cập đến phương thức hienThiTenLop() thông qua 1 lớp nằm cùng package với lớp MyClass như sau:

package default_accessmodifier;
 
public class TestMyClass {
 
    public static void main(String[] args) {
        MyClass myClass = new MyClass();
        myClass.hienThiTenLop();
    }
 
}

Kết quả sau khi biên dịch 2 đoạn chương trình trên như sau:

3. Phạm Vi Truy Cập Protected

Protected Access Modifier là có thể truy cập bên trong package và bên ngoài package nhưng chỉ thông qua tính kế thừa. Protected Access Modifier có thể được sử dụng trên thành viên dữ liệu. Nó không thể được sử dụng trên lớp. Các biến, phương thức và constructor, mà được khai báo protected trong 1 lớp cha (superclass), chỉ được truy cập bởi các lớp cha trong package khác hoặc bất kỳ lớp nào bên trong package đó của lớp được protected.

Protected Access Modifier không thể được áp dụng cho lớp và interface. Các phương thức và trường có thể được khai báo protected, tuy vậy các phương thức và trường trong 1 interface không thể được khai báo là protected.

Chế độ protected cung cấp cho lớp phụ cơ hội để sử dụng phương thức hoặc biến helper, trong khi ngăn cản một lớp không liên quan từ việc cố gắng sử dụng nó.

Ví dụ

Trong ví dụ này, chúng ta tạo hai package là pack và mypack. Một lớp A của pack package là public, vì thế có thể được truy cập từ bên ngoài package. Nhưng phương thức msg của package này được khai báo là protected, vì thế nó có thể được truy cập từ bên ngoài lớp nhưng chỉ thông qua tính kế thừa.

/*Luu duoi dang A.java*/ 
package pack;

public class A {
    protected void msg() {
        System.out.println("Hello");
    }
}
/*Luu duoi dang B.java*/ 
package mypack;
        import pack.*;

class B extends A {
    public static void main(String args[]) {
        B obj = new B();
        obj.msg();
    }
}

4. Phạm Vi Truy Cập Public

Public Access Modifier là có thể truy cập ở bất cứ đâu. Nó có phạm vi rộng nhất trong tất cả Modifier. 1 lớp, phương thức, constructor, interface, … được khai báo public có thể được truy cập từ bất cứ lớp nào khác. Do đó, các trường, phương thức và khối được khai báo bên trong 1 lớp public có thể được truy cập từ bất kỳ lớp nào trong thế giới Java.

Nhưng, nếu lớp public chúng ta đang cố gắng truy cập là trong 1t package khác, thì lớp public này vẫn cần để được import. Bởi vì tính kế thừa lớp, hầu hết phương thức và biến của 1 lớp được kế thừa bởi các lớp phụ của nó.

Ví dụ: 

//Luu duoi dang A.java  

package pack;  
public class A{  
public void msg(){System.out.println("Hello");}  
}  

-------------------------------------------------

//Luu duoi dang B.java  

package mypack;  
import pack.*;  

class B{  
  public static void main(String args[]){  
   A obj = new A();  
   obj.msg();  
  }  
}

 

Bài viết liên quan

Leave a Reply

Your email address will not be published. Required fields are marked *

Hotline: 0984.876.750
Chat Facebook
Gọi điện ngay