これまでアクセス制御としてpublicとprivateを使ってきました。しかしJavaには、この2つ以外のアクセス制御の修飾子があります。
「protected」は、同一クラスに加えて、同一パッケージとサブクラスからアクセス可能な修飾子です。
修飾子「なし」の場合は、同一クラスと同一パッケージはアクセス可能ですが、サブクラスからはアクセスできません。
このアクセス制御を、以下に表にまとめます。
修飾子 | 同一クラス | 同一パッケージ | サブクラス | その他 |
---|---|---|---|---|
public | ○ | ○ | ○ | ○ |
protected | ○ | ○ | ○ | × |
なし | ○ | ○ | × | × |
private | ○ | × | × | × |
クラスを継承して、メソッドをオーバーライドした際は、その可視性(アクセス制御の範囲)を下げることはできません。
これは、スーパークラスのメソッドが、オーバーライドされることによって隠蔽されるからです。
┏SubClass━━━━━━━━━━━┓ Super ┃ Super ┃ ┏Class ━┓ ┃┏Class ━┓ ┃ ┃ ┃public ─────→ ┃┃ ┃public private ┃ ┃ ┠─○b() 可視性が ┃┃ ┠─×b() b()●─┨ ┗━━━━┛ 下がると ┃┗━━━━┛ ┃ 同じ物として ┗━━━━━━━━━━━━━━━┛ 扱えない
対してフィールドは可視性を下げることができます。フィールドはたとえ可視性を下げたとしても、スーパークラスにキャストすることによって、スーパークラスのフィールドにアクセスが可能です。