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()
và method2()
. method1()
khai báo với access modifier là public, 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 modifier là private, 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 modifier Mô tả default Chỉ truy cập được trong package chứa lớp đó private Chỉ truy cập được trong lớp đó protected Truy cập được trong package chứa lớp đó và tất cả các lớp con của lớp đó public Truy 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 defaultPackage có access 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ớp và interface. 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 getter và setter để 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()
và 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ớp và interface. 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.