# Java 访问修饰符 - 公共、私有、受保护和默认

> 原文： [https://beginnersbook.com/2013/05/java-access-modifiers/](https://beginnersbook.com/2013/05/java-access-modifiers/)

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

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

## 1.默认访问修饰符

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

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

> 要理解这个例子，你必须具备 java 中[包的知识](https://beginnersbook.com/2013/03/packages-in-java/)。

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

`Addition.java`

```java
package abcpackage;

public class Addition {
   /* Since we didn't mention any access modifier here, it would
    * be considered as default.
    */
   int addTwoNumbers(int a, int b){
	return a+b;
   }
}
```

`Test.java`

```java
package xyzpackage;

/* We are importing the abcpackage
 * but still we will get error because the
 * class we are trying to use has default access
 * modifier.
 */
import abcpackage.*;
public class Test {
   public static void main(String args[]){
	Addition obj = new Addition();
        /* It will throw error because we are trying to access
         * the default method in another package
         */
	obj.addTwoNumbers(10, 21);
   }
}
```

**输出：**

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

## 2.私有访问修饰符

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

1.  私有数据成员和方法只能在类中访问
2.  类和[接口](https://beginnersbook.com/2013/05/java-interface/)不能声明为私有
3.  如果某个类具有[私有构造函数](https://beginnersbook.com/2013/12/java-private-constructor-example/)，那么您无法从该类外部创建该类的对象。

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

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

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

```java
class ABC{  
   private double num = 100;
   private int square(int a){
	return a*a;
   }
}  
public class Example{
   public static void main(String args[]){  
	ABC obj = new ABC();  
	System.out.println(obj.num); 
	System.out.println(obj.square(10));
   }  
}
```

输出：

```java
Compile - time error
```

## 3.受保护的访问修饰符

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

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

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

`Addition.java`

```java
package abcpackage;
public class Addition {

   protected int addTwoNumbers(int a, int b){
	return a+b;
   }
}
```

`Test.java`

```java
package xyzpackage;
import abcpackage.*;
class Test extends Addition{
   public static void main(String args[]){
	Test obj = new Test();
	System.out.println(obj.addTwoNumbers(11, 22));
   }
}
```

输出：

```java
33
```

## 4.公共访问修饰符

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

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

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

`Addition.java`

```java
package abcpackage;

public class Addition {

   public int addTwoNumbers(int a, int b){
	return a+b;
   }
}
```

`Test.java`

```java
package xyzpackage;
import abcpackage.*;
class Test{
   public static void main(String args[]){
      Addition obj = new Addition();
      System.out.println(obj.addTwoNumbers(100, 1));
   }
}
```

输出：

```java
101
```

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

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

```java
------------+-------+---------+--------------+--------------+--------
            | Class | Package | Subclass     | Subclass     |Outside|
            |       |         |(same package)|(diff package)|Class  |
————————————+———————+—————————+——————————----+—————————----—+————————
public      | Yes   |  Yes    |    Yes       |    Yes       |   Yes |    
————————————+———————+—————————+—————————----—+—————————----—+————————
protected   | Yes   |  Yes    |    Yes       |    Yes       |   No  |    
————————————+———————+—————————+————————----——+————————----——+————————
default     | Yes   |  Yes    |    Yes       |    No        |   No  |
————————————+———————+—————————+————————----——+————————----——+————————
private     | Yes   |  No     |    No        |    No        |   No  |
------------+-------+---------+--------------+--------------+--------

```