> For the complete documentation index, see [llms.txt](https://yubin551.gitbook.io/java-note/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://yubin551.gitbook.io/java-note/basic_java_programming/accessmodifier.md).

# 存取修飾子

> 介紹Java的存取修飾子 public、private、protected，以及四種權限範圍

## 為什麼需要存取修飾子？ Why Access Modifier?

上一章的package有談過，一個專案或系統通常都是團隊分工完成的，也就是說每個人負責自己的部份，透過一定的配合來完成專案的目標。 在寫程式的過程中，難免會有些自己特有的技術不想公開給別人知道。或是開放特定的方法讓別人存取，但不想讓別人知道類別中細部的設定(或許被隨意設定那個方法就失效了)。

物件導向有一個重要特性，**封裝(Encapsulation)**，封裝的概念是把內部的資料、實作細節隱藏起來，只開放要給別人存取的方法給別人存取。這個方法是該類別擁有者期望你去使用的方法，利用此方法來達到某個特定功能。

利用存取修飾子來控制什麼可以讓別人看到、什麼不要讓別人看到。藉此保護程式的安全、完整性。

在 Java定義的關鍵字中，有3個存取修飾子：

1. public     &#x20;
2. protected
3.
4. private

嗯，這當然不是我多列一項XD 而是雖然有3個修飾子，但有4種權限範圍。

存取修飾子主要是控制類別間能不能互相存取的要素。

因此我們會特別討論4種情況； 1. 同一類別 (class) 2. 同一套件 (package) 3. 子類別 (subclass) 4. 不同套件 (world)

可以存取的意思就是，用於變數方法上，可以透過點運算子直接存取、呼叫。 用在類別上，就是可以利用該類別來建立物件。

可以把存取修飾子想像成能不能被別人看到。

### public 公開

```java
public int value = 10;
```

就像字面上的意思，任何人都可以進行存取。 也就是最輕鬆簡單，大家都存取的到，所以上面4種情況都有，是權限範圍最大的。

### protected 保護

```java
protected int value = 10;
```

保護的意思是，不同套件的類別中，僅限該類別的**子類別**可以存取。 是這4種權限中開放範圍第二大的。

### (no modifier，預設)

```java
int value = 10;
```

如果沒有寫任何修飾子，就是這種權限，有些人會稱這種權限為 package。 因為在同一個package內的類別都可以存取，不同套件存取不到。

### private 私有

```java
private int value = 10;
```

private權限範圍是最小的，只有自己類別的成員可以存取，要做資料方法的隱藏性很常使用此修飾子。

## 修飾子比較表：

| 修飾子           | 同一類別 | 同一套件 | 不同套件的子類別 | 不同套件且非子類別 |   |
| ------------- | ---- | ---- | -------- | --------- | - |
| public        | ●    | ●    | ●        | ●         |   |
| protected     | ●    | ●    | ●        |           |   |
| (no modifier) | ●    | ●    |          |           |   |
| private       | ●    |      |          |           |   |
