protected 成員對以下可見:
介於 package-private(無修飾詞)與 public 之間。
public abstract class AbstractParser {
// 子類可覆寫,外部不可直接呼叫
protected abstract void parseHeader(InputStream in);
public final void parse(InputStream in) {
parseHeader(in); // 受保護鉤子
parseBody(in); // 固定流程
parseFooter(in);
}
}
class Node {
protected Node left, right; // 同套件樹演算法可直接操作,外部封裝
protected int value;
}
AbstractApplicationContext 的 protected void refresh()GenericServlet 的 protected void init()| 修飾詞 | 同類 | 同套件 | 子類(異套件) | 外部類 |
|---|---|---|---|---|
| private | ✅ | ❌ | ❌ | ❌ |
| package-private | ✅ | ✅ | ❌ | ❌ |
| protected | ✅ | ✅ | ✅ | ❌ |
| public | ✅ | ✅ | ✅ | ✅ |
「預設用private,需要同套件協作用package-private,需開放給子類擴充才用protected,最後才考慮public。」
濫用 protected 會破壞封裝,導致子類過度耦合父類實作細節。