原文: https://beginnersbook.com/2013/05/java-access-modifiers/

在练习 java 程序时,您必须已经看过公共,私有和受保护的关键字,这些被称为访问修饰符。访问修饰符限制对另一个类中的类,构造函数,数据成员和方法的访问。在 java 中我们有四个访问修饰符:

  1. 默认
  2. private
  3. protected
  4. public

1.默认访问修饰符

当我们没有提到任何访问修饰符时,它被称为默认访问修饰符。此修饰符的范围仅限于包。这意味着如果我们在包中有一个具有默认访问修饰符的类,则只有此包中的那些类才能访问此类。此程序包之外的其他任何类都无法访问此类。类似地,如果我们在类中有一个默认方法或数据成员,它将在另一个包的类中不可见。让我们看一个例子来理解这个:

Java 中的默认访问修饰符示例

要理解这个例子,你必须具备 java 中包的知识

在这个例子中我们有两个类,Test类试图访问Addition类的默认方法,因为类Test属于不同的包,这个程序会抛出编译错误,因为默认修饰符的范围仅限于同一个包中宣布它。

Addition.java

  1. package abcpackage;
  2. public class Addition {
  3. /* Since we didn't mention any access modifier here, it would
  4. * be considered as default.
  5. */
  6. int addTwoNumbers(int a, int b){
  7. return a+b;
  8. }
  9. }

Test.java

  1. package xyzpackage;
  2. /* We are importing the abcpackage
  3. * but still we will get error because the
  4. * class we are trying to use has default access
  5. * modifier.
  6. */
  7. import abcpackage.*;
  8. public class Test {
  9. public static void main(String args[]){
  10. Addition obj = new Addition();
  11. /* It will throw error because we are trying to access
  12. * the default method in another package
  13. */
  14. obj.addTwoNumbers(10, 21);
  15. }
  16. }

输出:

  1. Exception in thread "main" java.lang.Error: Unresolved compilation problem:
  2. The method addTwoNumbers(int, int) from the type Addition is not visible
  3. at xyzpackage.Test.main(Test.java:12)

2.私有访问修饰符

private修饰符的范围仅限于类。

  1. 私有数据成员和方法只能在类中访问
  2. 类和接口不能声明为私有
  3. 如果某个类具有私有构造函数,那么您无法从该类外部创建该类的对象。

让我们看一个例子来理解这个:

java 中的私有访问修饰符示例

此示例抛出编译错误,因为我们尝试在类Example中访问类ABC的私有数据成员和方法。私有数据成员和方法只能在类中访问。

  1. class ABC{
  2. private double num = 100;
  3. private int square(int a){
  4. return a*a;
  5. }
  6. }
  7. public class Example{
  8. public static void main(String args[]){
  9. ABC obj = new ABC();
  10. System.out.println(obj.num);
  11. System.out.println(obj.square(10));
  12. }
  13. }

输出:

  1. Compile - time error

3.受保护的访问修饰符

受保护的数据成员和方法只能由同一个包的类和任何包中的子类访问。您还可以说受保护的访问修饰符与默认访问修饰符类似,但有一个例外是它在子类中具有可见性。
类不能声明受保护。此访问修饰符通常用于父子关系。

Java 中的受保护访问修饰符示例

在此示例中,另一个包中存在的类Test能够调用addTwoNumbers()方法,该方法被声明为protected。这是因为Test类扩展了类Addition,而protected修饰符允许在子类(在任何包中)访问受保护的成员。

Addition.java

  1. package abcpackage;
  2. public class Addition {
  3. protected int addTwoNumbers(int a, int b){
  4. return a+b;
  5. }
  6. }

Test.java

  1. package xyzpackage;
  2. import abcpackage.*;
  3. class Test extends Addition{
  4. public static void main(String args[]){
  5. Test obj = new Test();
  6. System.out.println(obj.addTwoNumbers(11, 22));
  7. }
  8. }

输出:

  1. 33

4.公共访问修饰符

可以从任何地方访问声明为public的成员,方法和类。此修饰符不对访问权限施加任何限制。

java 中的公共访问修饰符示例

让我们看一下上面看到的相同的例子,但这次方法addTwoNumbers()public修饰符,类Test能够访问这个方法,甚至不需要扩展Addition类。这是因为公共修饰符随处可见。

Addition.java

  1. package abcpackage;
  2. public class Addition {
  3. public int addTwoNumbers(int a, int b){
  4. return a+b;
  5. }
  6. }

Test.java

  1. package xyzpackage;
  2. import abcpackage.*;
  3. class Test{
  4. public static void main(String args[]){
  5. Addition obj = new Addition();
  6. System.out.println(obj.addTwoNumbers(100, 1));
  7. }
  8. }

输出:

  1. 101

让我们以表格形式查看这些访问修饰符的范围:

表格形式的访问修饰符的范围

  1. ------------+-------+---------+--------------+--------------+--------
  2. | Class | Package | Subclass | Subclass |Outside|
  3. | | |(same package)|(diff package)|Class |
  4. ————————————+———————+—————————+——————————----+—————————----—+————————
  5. public | Yes | Yes | Yes | Yes | Yes |
  6. ————————————+———————+—————————+—————————----—+—————————----—+————————
  7. protected | Yes | Yes | Yes | Yes | No |
  8. ————————————+———————+—————————+————————----——+————————----——+————————
  9. default | Yes | Yes | Yes | No | No |
  10. ————————————+———————+—————————+————————----——+————————----——+————————
  11. private | Yes | No | No | No | No |
  12. ------------+-------+---------+--------------+--------------+--------