Chỉ định truy cập (access modifier) của thành viên thuộc lớp trong Java

Đây là bài 28/62 bài của series môn học Ngôn ngữ lập trình Java

1. Chỉ định truy cập (access modifier) là gì?

Trong Java, access modifier được sử dụng để thể hiện khả năng truy cập của lớp, interface, các thành viên (thuộc tính, phương thức) của lớp. Ví dụ:

class Animal {
    public void method1() {...}

   private void method2() {...}
}

Trong ví dụ trên, chúng ta có khai báo 2 phương thức: method1() method2(). method1() khai báo với access modifierpublic, có nghĩa là nó có thể được truy cập bên ngoài lớp Animal. method2() khai báo với access modifierprivate, có nghĩa là nó không thể được truy cập bên ngoài lớp Animal.

Ở bài Lớp (class) và cách xây dựng lớp trong Java, chúng ta đã tìm hiểu access modifier cho lớp (interface tương tự). Trong bài này, chúng ta sẽ tìm hiểu access modifier cho các thành viên của lớp.

Có 4 loại access modifier sử dụng cho các thành viên của một lớp là:

Access modifierMô tả
defaultChỉ truy cập được trong package chứa lớp đó
privateChỉ truy cập được trong lớp đó
protectedTruy cập được trong package chứa lớp đó và tất cả các lớp con của lớp đó
publicTruy cập được ở bất cứ đâu

2. Default Access Modifier

Nếu không chỉ rõ access modifier cho lớp và các thành viên của lớp thì access modifier là mặc định (default). Ví dụ:

package defaultPackage;

class AClass {
    void display(){
        System.out.println("Day la AClass.");
    }
}
package defaultPackage;

public class BClass {
    public static void main(String arg[]) {
        AClass a = new AClass();
        a.display();
    }
}

Lớp AClass nằm trong package defaultPackageaccess modifier là mặc định. AClass có thể được truy cập trong tất cả các lớp thuộc về package defaultPackage (trong ví dụ trên là BClass).

Nhưng khi sử dụng AClass ở một package khác thì chương trình sẽ báo lỗi “java.lang.RuntimeException: Uncompilable source code”.

package anotherPackage;
import defaultPackage.*;
public class Test {
    public static void main(String arg[]) {
        AClass ac = new AClass();//error
        ac.display();
    }
}

3. Private Access Modifier

Private access modifier không áp dụng cho lớpinterface. Khi các thuộc tính và phương thức được khai báo là private, chúng không thể được truy cập bên ngoài lớp chứa chúng. Ví dụ:

class Data {
    // private variable
    private String name;
}

public class Test {
    public static void main(String arg[]) {
        //tạo 1 đối tượng d của lớp Data
        Data d = new Data();
        //truy cập biến private của đối tượng d trong 1 lớp khác
        d.name = "Programiz";
    }
}
Kết quả
java.lang.RuntimeException: Uncompilable source code - name has private access

Trong ví dụ trên, biến name của lớp Data được khai báo private. Do đó, khi truy cập đến biến name trong lớp Test (bên ngoài lớp Data) thì sẽ bị lỗi. Các biến private giúp che giấu dữ liệu của lớp trong lập trình hướng đối tượng. Chúng ta có thể sử dụng phương thức gettersetter để truy cập gián tiếp các biến private này.

class Data {
    private String name;

    // getter method
    public String getName() {
        return this.name;
    }
    // setter method
    public void setName(String name) {
        this.name= name;
    }
}
public class Test {
    public static void main(String[] main){
        Data d = new Data();

        // access the private variable using the getter and setter
        d.setName("Gochocit.com");
        System.out.println(d.getName());
    }
}
Kết quả
Gochocit.com

Chúng ta sử dụng hàm getName()setName() để truy cập vào biến private name. Trong các hàm này chúng ta có sử dụng từ khóa this để tham chiếu đến biến name. Các bạn có thể đọc bài Đối tượng (object) và cách sử dụng đối tượng trong Java để tìm hiểu về từ khóa this.

4. Protected Access Modifier

Protected access modifier không áp dụng cho lớpinterface. Khi các thành viên của một lớp được khai báo là protected, chúng ta có thể truy cập chúng bên trong package chứa lớp đó cũng như trong các lớp con của lớp đó. Ví dụ:

class Animal {
    // protected method
    protected void display() {
        System.out.println("I am an animal");
    }
}

class Dog extends Animal {
    public static void main(String[] args) {

        // create an object of Dog class
        Dog dog = new Dog();
         // access protected method
        dog.display();
    }
}
Kết quả
I am an animal

Trong ví dụ trên, hàm display() được khai báo protected trong lớp Animal. Lớp Dog kế thừa từ lớp Animal. Chúng ta có thể gọi hàm display() của lớp Animal trong lớp con Dog.

5. Public Access Modifier

Khi các lớp, các thành viên của lớp được khai báo với public thì chúng có thể được truy cập ở bất cứ đâu. Ví dụ:

package defaultPackage;

public class AClass {
    public void display(){
        System.out.println("Day la AClass.");
    }
}
package anotherPackage;
import defaultPackage.*;
class Test{
    public static void main(String[] args) {
        AClass a = new AClass();
        a.display();
    }
}

Trong ví dụ trên, lớp AClass thuộc package defaultPackage vẫn được truy cập trong lớp Test thuộc package anotherPackage. Tương tự, hàm display() của lớp AClass cũng được khai báo public nên cũng có thể được truy cập trong lớp Test thuộc package anotherPackage.

5/5 - (1 bình chọn)
Bài trước và bài sau trong môn học<< Tính kế thừa (inheritance) trong JavaGhi đè phương thức (method overriding) khi kế thừa trong Java >>
Chia sẻ trên mạng xã hội:

Trả lời

Lưu ý:

1) Vui lòng bình luận bằng tiếng Việt có dấu.

2) Khuyến khích sử dụng tên thật và địa chỉ email chính xác.

3) Mọi bình luận trái quy định sẽ bị xóa bỏ.