package pac1;
public class Parent {
protected class Inner { } // protected 內部類
}
package pac2;
import pac1.Parent;
public class Child extends Parent {
public static void main(String[] args) {
Inner i = new Parent().new Inner(); // 編譯錯誤
}
}
錯誤訊息:Inner() has protected access in pac1.Parent.Inner
protected 修飾的是 建構子(預設與類別同權限)Child 雖繼承 Parent,但 Child 與 Inner 不同包且無繼承關係protected 成員僅對同包或子類可見,且子類存取必須透過子類實例Parent 提供 public Inner createInner() { return new Inner(); } 工廠方法Inner 移至獨立 public 類別| 修飾符 | 同類 | 同包 | 子類(異包) | 非子類(異包) |
|---|---|---|---|---|
| private | ✓ | ✗ | ✗ | ✗ |
| default | ✓ | ✓ | ✗ | ✗ |
| protected | ✓ | ✓ | ✓(僅透過子類實例) | ✗ |
| public | ✓ | ✓ | ✓ | ✓ |
「protected 不等於『子類隨便用』,而是『子類透過繼承鏈用』」