修飾子の種類やその挙動についてまとめます。
修飾子は大きく分けて「アクセス修飾子」とそれ以外とに分類されます。次のような種類があります。
説明 | |||
アクセス修飾子 | public | 制限はありません。どこからでもアクセス可能です。 | |
protected | 同一パッケージ内、またはそのサブクラスからのみアクセス可能です。 | ||
private | 同一クラス内でのみアクセス可能です。 | ||
修飾子 | abstract | 抽象メソッドや抽象メソッドをもつクラスに指定します。 インターフェースは元々抽象メソッドしか定義できない為、省略されることが多いです。 | |
final | このクラスを継承することを禁止する(サブクラスを作成させたくない)場合に指定します。 | ||
strictfp | 「float」や「double」の浮動小数点を用いた演算を厳密 (プラットフォームに依存しない(IEEE754に従う))に行いたいクラスに指定します。 | ||
static | クラス固有のものとして、同一クラスからなる全インスタンスに共有させる場合に指定します。 | ||
transient | シリアライズ(バイトストリーム変換)の時に値を保存したくない(一時的に使用する値・初期化したい値)フィールドに指定します。 | ||
volatile | コンパイラによる最適化をさせたくないフィールドに指定します。(マルチスレッド等による参照値の相違をなくします。) | ||
native | プラットフォーム依存のコードで定義します。 (型、メソッド名、引数の型といったインターフェースにみを定義し、中身はC言語などの他の言語を用いて実装します。) | ||
synchronized | マルチスレッド環境において、同期処理(インスタンス単位で排他制御)させる場合に指定します。 |
各修飾子に対して付加することができる対象は次のようになります。
クラス | インタフェース | フィールド | メソッド | コンストラクタ | ブロック | |||
アクセス修飾子 | public | ○ | ○ | ○ | ○ | ○ | × | |
protected | × | × | ○ | ○ | ○ | × | ||
private | × | × | ○ | ○ | ○ | × | ||
修飾子 | abstract | ○ | ○ | × | ○ | × | × | |
final | ○ | × | ○ | ○ | × | × | ||
strictfp | ○ | × | × | × | × | × | ||
static | × | × | ○ | ○ | × | ○ | ||
transient | × | × | ○ | × | × | × | ||
volatile | × | × | ○ | × | × | × | ||
native | × | × | × | ○ | × | × | ||
synchronized | × | × | × | ○ | × | ○ |
アクセス修飾子について具体的なアクセス範囲や制限の強弱を整理すると次のようになります。
・各アクセス修飾子に対するアクセスイメージ
※「class X」が「public」ではない場合は、「package X」外からのアクセスはできません。
制限が弱い← public < protected < デフォルト(省略時) < private →制限が強い