可視性周りの覚え書き
Java言語仕様はまとまってなくて情報が点在している気がする。
ということでメモ。
トップレベル型宣言
- クラス型の宣言は書いたとおり
- 列挙型の宣言は書いたとおり
- ただし、クラス本体を有さない列挙定数が一つも存在しない場合、暗黙にfinal
- 明記するとエラー
- (abstractかどうかは仕様に明記されていない)
- ただし、クラス本体を有さない列挙定数が一つも存在しない場合、暗黙にfinal
- インターフェース型、注釈型の宣言は暗黙にabstract
- わざわざ書いてもよいが推奨されない
クラス型、列挙型宣言中に出現する型宣言
- 列挙定数は暗黙にpublic, static, final
- 明記するとエラー
- メンバとしてのクラス型の宣言はトップレベル型宣言のルールと同等
- クラス型以外のメンバ型宣言は、トップレベルの列挙型宣言のルール+暗黙にstatic
- わざわざ書いてもよい
- staticでないメンバクラス型中に、staticであるメンバ型を宣言できない*1
- 他は書いたとおり
下記のB, C, D, Eはいずれもエラー(staticであるメンバ型を宣言できない)
class Top { class A { static class B {} interface C {} enum D {} @interface E {} } }
インターフェース型、注釈型宣言中に出現する宣言
- フィールドの宣言はpublic, static, final
- わざわざ書いてもよい
- メソッド(注釈要素含む)の宣言はpublic abstract
- メンバ型の宣言はトップレベル型宣言のルール+暗黙にpublic, static
- インターフェース型(+注釈型)で宣言されたメンバは常にpublicであるという規則
*1:暗黙にstaticとなるものもだめなので、staticでないメンバクラス型にはstaticでないメンバクラス型以外を含められない