可視性周りの覚え書き

Java言語仕様はまとまってなくて情報が点在している気がする。

ということでメモ。

トップレベル型宣言

  • クラス型の宣言は書いたとおり
  • 列挙型の宣言は書いたとおり
    • ただし、クラス本体を有さない列挙定数が一つも存在しない場合、暗黙にfinal
      • 明記するとエラー
    • (abstractかどうかは仕様に明記されていない)
  • インターフェース型、注釈型の宣言は暗黙に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でないメンバクラス型以外を含められない