Có bao nhiêu loại quyền truy cập trong java?

Công cụ sửa đổi quyền truy cập Java cho phép chúng tôi thiết lập khả năng hiển thị or quyền truy cập cho các biến, phương thức, lớp và hàm tạo. Nói chung, có 2 loại khác nhau truy cập các công cụ sửa đổi trong Java.

  • Công cụ sửa đổi quyền truy cập - kiểm soát mức độ truy cập
  • Bổ ngữ không truy cập - không kiểm soát mức độ truy cập nhưng cung cấp các chức năng khác.

Trong hướng dẫn này, chúng ta sẽ thảo luận về các loại bổ trợ truy cập java khác nhau.

Các loại công cụ sửa đổi quyền truy cập Java

Có 4 loại bổ trợ truy cập java khác nhau.

  • Mặc định: Nó không yêu cầu bất kỳ từ khóa nào và được coi là mặc định. Phạm vi nằm trong gói.
  • Riêng: Phạm vi chỉ trong phạm vi lớp học.
  • bảo vệ: Nó có thể truy cập được trong gói. Để truy cập bên ngoài gói, chúng ta chỉ có thể thực hiện thông qua kế thừa.
  • Công khai: Nó có thể truy cập được ở mọi nơi

Bây giờ chúng ta hãy hiểu chi tiết từng loại công cụ sửa đổi quyền truy cập java.

Công cụ sửa đổi quyền truy cập mặc định

Khi chúng tôi không chỉ định bất kỳ công cụ sửa đổi nào cho một lớp, biến, phương thức hoặc hàm tạo, chúng tôi coi nó là một công cụ sửa đổi truy cập mặc định. Phạm vi của loại công cụ sửa đổi quyền truy cập java này chỉ nằm trong gói và chúng tôi không thể truy cập chúng từ các lớp khác bên ngoài gói. Nhưng nếu một lớp khác nằm trong cùng một gói, thì chúng ta có thể truy cập chúng.

Trong ví dụ dưới đây, chúng tôi đã tạo 2 gói com.Modifiercom.AccessModifier lớp học ở đâu SimpleClass không có bất kỳ công cụ sửa đổi quyền truy cập nào do đó nó là một công cụ sửa đổi mặc định. Điều này có nghĩa là chúng ta không thể truy cập bất kỳ phương thức hoặc biến nào của lớp này từ các gói khác. Đây là lý do tại sao chúng tôi gặp lỗi biên dịch khi chúng tôi cố gắng tạo một phiên bản lớp của SimpleClass và trong khi truy cập phương thức.

package com.AccessModifiers; class SimpleClass { void display[] { System.out.println["This is a simple class"]; } }

 

package com.Modifers; import com.AccessModifiers.*; public class DefaultClass { public static void main[String[] args] { SimpleClass s = new SimpleClass[]; //throws error s.display[]; //throws error } } Exception in thread "main" java.lang.Error: Unresolved compilation problems: The type SimpleClass is not visible The type SimpleClass is not visible The type SimpleClass is not visible at com.Modifers.DefaultClass.main[DefaultClass.java:7]

Tuy nhiên, chúng ta có thể truy cập chúng trong các lớp khác nhau của cùng một gói. Ví dụ: chúng tôi tạo một lớp khác Lớp chính trong cùng một gói com.AccessModifiers. Từ lớp này, chúng ta có thể tạo một phiên bản của SimpleClass và truy cập phương pháp trưng bày. Điều này là do cả hai lớp SimpleClass và Lớp chính nằm trong cùng một gói.

package com.AccessModifiers; public class MainClass { public static void main[String[] args] { SimpleClass s = new SimpleClass[]; s.display[]; } } This is a simple class

Công cụ sửa đổi quyền truy cập riêng tư

Khi chúng tôi sử dụng từ khóa riêng trước bất kỳ biến, phương thức hoặc hàm tạo nào, quyền truy cập của nó bị hạn chế trong cùng một lớp. Nếu chúng tôi cố gắng truy cập các thành viên riêng tư này từ một lớp khác, nó sẽ gây ra lỗi biên dịch. Loại công cụ sửa đổi quyền truy cập java này cung cấp nhiều hạn chế và bảo mật hơn. Tuy nhiên, sử dụng kế thừa và thông qua các phương thức getter và setter, chúng ta có thể truy cập các biến private. Bằng cách này, chúng ta không thể thay đổi trực tiếp giá trị của các biến private này.

Dưới đây là một ví dụ về việc truy cập một phương thức private và một biến private bên ngoài lớp. Trong trường hợp như vậy, nó sẽ tạo ra một lỗi biên dịch như hình dưới đây.

package com.AccessModifiers; class PrivateClass { private String value = "Java"; private void display[] { System.out.println["This is a private method"]; } } public class PrivateClassDemo { public static void main[String[] args] { PrivateClassDemo p =new PrivateClassDemo[]; p.display[]; //compilation error System.out.println[p.value]; //compilation error } } Exception in thread "main" java.lang.Error: Unresolved compilation problems: The method display[] is undefined for the type PrivateClassDemo value cannot be resolved or is not a field at com.AccessModifiers.PrivateClassDemo.main[PrivateClassDemo.java:15]

Chúng ta có thể truy cập các thành viên riêng tư này trong cùng một lớp như hình dưới đây.

package com.AccessModifiers; public class PrivateClassDemo { private String value; private void display[String v] { System.out.println[value]; } public static void main[String[] args] { PrivateClassDemo p =new PrivateClassDemo[]; p.value = "Java"; p.display[p.value]; } } Java

Dưới đây là một ví dụ về một constructor. Nếu chúng ta tạo một phương thức khởi tạo riêng, thì chúng ta không thể tạo một thể hiện cho phương thức khởi tạo đó. Ngoài ra, chúng ta không thể đặt một lớp ở chế độ riêng tư trừ khi nó là một lớp lồng nhau.

package com.AccessModifiers; class PrivateClass { private PrivateClass[] { System.out.println["This is a private constructor"]; } } public class PrivateClassDemo { public static void main[String[] args] { PrivateClass p = new PrivateClass[]; } } Exception in thread "main" java.lang.Error: Unresolved compilation problem: The constructor PrivateClass[] is not visible at com.AccessModifiers.PrivateClassDemo.main[PrivateClassDemo.java:18]

Công cụ sửa đổi quyền truy cập được bảo vệ

Khi chúng tôi sử dụng từ khóa bảo vệ trước bất kỳ biến, phương thức hoặc hàm tạo nào, thì phạm vi của các thành viên được bảo vệ này chỉ nằm trong gói. Nếu chúng ta cần truy cập loại công cụ sửa đổi quyền truy cập java này từ một lớp bên ngoài gói, sau đó nó có thể chỉ thông qua kế thừa.

Công cụ sửa đổi quyền truy cập được bảo vệ cung cấp nhiều khả năng truy cập hơn công cụ sửa đổi quyền truy cập mặc định.

Trong ví dụ dưới đây, chúng ta đã tạo 2 gói khác nhau, trong đó, trong 1 gói, chúng ta có một biến được bảo vệ và một phương thức được bảo vệ. Để truy cập điều này từ một lớp khác bên ngoài gói, chúng ta có thể sử dụng kế thừa để đạt được nó. Nếu chúng tôi cố gắng truy cập các thành viên được bảo vệ mà không có tính kế thừa, chúng tôi sẽ gặp lỗi biên dịch.

// Gói: com.AccessModifiers

package com.AccessModifiers; public class ProtectedClass { protected String value; protected void display[] { System.out.println["This is a protected method"]; } }

// Gói: com.Modifier

package com.Modifers; import com.AccessModifiers.*; public class DefaultClass extends ProtectedClass{ public static void main[String[] args] { DefaultClass p = new DefaultClass[]; p.value = "Protected"; System.out.println["String value: " + p.value]; p.display[]; } } String value: Protected This is a protected method

Công cụ sửa đổi quyền truy cập công khai

Bạn có thể quen thuộc với công khai từ khóa như chúng tôi đã sử dụng trong hầu hết các chương trình java ví dụ trong suốt hướng dẫn. Công cụ sửa đổi quyền truy cập công khai cung cấp khả năng truy cập đầy đủ ở mọi nơi trong lớp hoặc gói và không có hạn chế. Đây là loại công cụ sửa đổi quyền truy cập java phổ biến nhất mà chúng tôi thường sử dụng.

Dưới đây là một ví dụ về một lớp, phương thức và biến công khai. Chúng tôi đã tạo 2 gói khác nhau. Vì biến, phương thức và lớp là công khai, chúng ta có thể dễ dàng truy cập chúng từ một lớp khác bên ngoài gói ngay cả khi không mở rộng lớp.

// Gói: com.AccessModifiers

package com.AccessModifiers; public class PublicClass { public String value; public void display[] { System.out.println["This is a public method"]; } }

// Gói: com.Modifier

package com.Modifers; import com.AccessModifiers.*; public class MainClass { public static void main[String[] args] { PublicClass p = new PublicClass[]; p.value = "Public"; System.out.println["String value: " + p.value]; p.display[]; } } String value: Public This is a public method

Truy cập công cụ sửa đổi trong ghi đè phương thức

Khi chúng tôi ghi đè phương pháp bằng cách sử dụng công cụ sửa đổi quyền truy cập java, phương thức trong lớp con không được hạn chế hơn phương thức của lớp cha. Nói cách khác, chúng ta không thể giảm khả năng hiển thị. Trong trường hợp này, nó sẽ dẫn đến lỗi biên dịch. Hãy tham khảo của chúng tôi Đa hình trong java hướng dẫn, để hiểu thêm về ghi đè phương thức.

Trong ví dụ dưới đây, trong PublicClass, chúng tôi đã tạo một phương thức công khai trưng bày.

package com.AccessModifiers; public class PublicClass { public String value; public void display[] { System.out.println["This is a public method"]; } }

Bây giờ, trong MainClass, chúng tôi đã ghi đè phương thức hiển thị bằng một công cụ sửa đổi truy cập mặc định. Vì công cụ sửa đổi mặc định hạn chế hơn công khai, nó sẽ tạo ra một lỗi biên dịch.

package com.Modifers; import com.AccessModifiers.*; public class MainClass extends PublicClass{ void display[] { System.out.println["Default method"]; } public static void main[String[] args] { MainClass m = new MainClass[]; m.display[]; } } Exception in thread "main" java.lang.Error: Unresolved compilation problem: Cannot reduce the visibility of the inherited method from PublicClass at com.Modifers.MainClass.display[MainClass.java:6] at com.Modifers.MainClass.main[MainClass.java:12]

Tài liệu tham khảo

Video liên quan

Chủ Đề