Mục lục -
Java Access Modifiers
- 1.1 Công cụ sửa đổi truy cập Java với class member
- 1.2 Công cụ sửa đổi truy cập Java - từ khóa public
- 1.3 Công cụ sửa đổi truy cập Java - từ khóa private
- 1.4 Công cụ sửa đổi truy cập Java - từ khóa protected
- 1.5 Công cụ sửa đổi truy cập Java - truy cập default
Java Access Modifiers với Class
Chúng ta có tất cả bốn access modifiers cho các thành phần của class (member và method). Tuy nhiên, đối với class thì chúng ta chỉ được sử dụng các từ khoá "public" hoặc là "default".
- Nếu một class là "public", thì chúng ta có thể truy cập nó từ bất cứ đâu, tức là từ bất kỳ lớp nào khác nằm trong bất kỳ gói nào khác, v.v.
- Chúng ta chỉ sử dụng khai báo "public" trong source file (tức là code), và mặc dù tên file Java có thể trùng với tên class nhưng ta sẽ không để từ khoá "public" trong tên file.
- Nếu lớp không khai báo từ access modifilers nào đồng nghĩa với việc nó sử dụng default access, và do đó nó chỉ có thể được truy cập từ các class khác trong cùng một package.
Java Access Modifiers với các Class Member
Chúng ta có thể có tất cả bốn công cụ sửa đổi truy cập cho các biến và phương thức thành viên lớp. Tuy nhiên, các quy tắc sửa đổi truy cập thành viên được áp dụng sau các quy tắc truy cập cấp lớp. Ví dụ, nếu một lớp có quyền truy cập mặc định thì nó sẽ không hiển thị trong các gói khác và do đó các phương thức và biến của lớp cũng sẽ không hiển thị.
Chúng ta sẽ xem xét từng cái một cách riêng biệt và sau đó chúng ta sẽ hiển thị việc sử dụng bộ sửa đổi truy cập java với một chương trình đơn giản.
Java Access Modifiers - public keyword
Nếu một thành viên của lớp (bao gồm variable và method) là "public", thì nó có thể được truy cập từ bất cứ đâu. Biến thành viên hoặc phương thức được truy cập trên toàn cầu. Đây là cách đơn giản nhất để cung cấp quyền truy cập cho các thành viên trong lớp. Tuy nhiên, chúng ta nên quan tâm đến việc sử dụng từ khóa này với các biến lớp nếu không muốn ai cũng có thể thay đổi các giá trị. Thông thường, các biến lớp được giữ dưới dạng riêng tư và các phương thức getter-setter được cung cấp để làm việc với chúng.
Java Access Modifiers - private keyword
Nếu một thành viên trong lớp là private, thì chỉ có thể truy cập trong cùng một lớp. Đây là quyền truy cập hạn chế nhất và thành viên lớp sẽ không nhìn thấy được với thế giới bên ngoài. Khi nào các bạn muốn các biến hoặc phương thức chỉ được truy cập từ bên trong class khi khi đó các bạn sử dụng từ khoá private cho khai báo biến và phương thức.
Java Access Modifiers - protected keyword
Nếu thành viên của lớp được khai báo là protected, thì nó chỉ có thể truy cập được với các lớp trong cùng gói và các lớp con . Access modifiers này hạn ít hạn chế hơn so với private nhưng lại hạn chế nhiều hơn so với public. Thông thường, chúng tôi sử dụng từ khóa này để đảm bảo các biến của lớp chỉ có thể truy cập được đối với các lớp con và các lớp khác cùng gói.
Java Access Modifiers - default access
Nếu một thành viên lớp không có bất kỳ access modifier nào được chỉ định, thì nó được xử lý với quyền truy cập mặc định. Các quy tắc truy cập tương tự như các lớp và thành viên lớp có quyền truy cập mặc định sẽ chỉ có thể truy cập được vào các lớp trong cùng một gói. Quyền truy cập này bị hạn chế nhiều hơn public và protected nhưng ít bị hạn chế hơn private.
(Khó truy cập nhất) private < default < protected < public (Dễ truy cập nhất)
Bảng dưới đây tóm tắt các access modifers ở trên đối với các lớp khác nhau trong cùng một gói hoặc các gói và lớp con khác.
Chúng ta hãy viết một số lớp đơn giản trong đó chúng ta sẽ thấy các access modifers hoạt động ra sao.
CodeLeanA.java
package com.codelean.access;
class CodeLeanA {
public void methodPublic(){
methodPrivate();
}
protected void methodProtected(){
methodPrivate();
}
void methodDefault(){
methodPrivate();
}
private void methodPrivate(){}
}
Lưu ý rằng lớp CodeLeanA có quyền truy cập mặc định và các phương thức trong đó có đủ 4 loại access modifiers khác nhau (public, protected, default, priavate).
CodeLeanB.java
package com.codelean.access;
import com.codelean.access.CodeLeanA;
public class CodeLeanB {
public static void main(String args[]) {
new CodeLeanA().methodPublic();
new CodeLeanA().methodProtected();
new CodeLeanA().methodDefault();
}
public void methodPublic() {
}
protected void methodProtected() {
}
void methodDefault() {
}
private void methodPrivate() {
}
}
Lưu ý rằng CodeLeanB nằm trong cùng gói với lớp CodeLeanA và do đó nó có thể truy cập các thành viên của lớp CodeLeanA. Các thành phần private không thể truy cập nhưng tất cả các thành viên khác đều có thể truy cập được vì cùng một gói.
CodeLeanC.java
package com.codelean.access.child;
import com.codelean.access.CodeLeanB;
public class CodeLeanC {
public static void main(String[] args) {
new CodeLeanB().methodPublic();
}
}
CodeLeanC không cùng gói với CodeLeanB và cũng không phải là class con của CodeLeanC, do đó nó chỉ có thể truy cập đến các phương thức là public.
Bạn hãy thử cố gắng truy đến phương thức khác (ko phải là public) ==> bạn sẽ thấy thông báo lỗi ;)
CodeLeanE.java
package com.codelean.util;
import com.codelean.access.CodeLeanB;
public class CodeLeanE extends CodeLeanB {
public static void main(String[] args) {
new CodeLeanB().methodPublic();
new CodeLeanB().methodProtected();
new CodeLeanE().methodProtected();
}
}
Vì lớp CodeLeanE là một lớp con của CodeLeanB, nên chúng ta có thể truy cập các thành viên protected của CodeLeanB thông qua lớp con CodeLeanE. Nếu chúng ta cố gắng truy cập trực tiếp vào phương thức được bảo vệ bởi từ khoá protected của lớp cha, chúng ta sẽ gặp lỗi khi biên dịch.
Đó là tất cả nững gì chúng ta cần nhớ về java access modifiers, thật đơn giản để hiểu. Lưu ý đừng nhầm lẫn với quyền truy cập mặc định default access với quyền được bảo vệ protected.
Một cách dễ nhớ là default access bị hạn chế nhiều hơn protected và protected có thể truy cập được trong các lớp con.
Thần chú: để giúp các bạn dễ nhớ ý nghĩa của từ khóa ... tôi thường nói câu-thần-chú ;) sau :D (hy vọng nó có thể giúp được bạn :D)
- public: đâu cũng được
- private: chỉ trong class
- default: chỉ trong package
- protected: mở rộng ra subclass
إرسال تعليق