Revised: Dec./12th/2003: Since: Dec./27th/2001
クラス、メンバ変数、コンストラクタ、メソッドには修飾子を付ける事があります。ここでは、パッケージ、クラス、インタフェース、フィールド、メソッドについて修飾子を網羅します。
Java プログラムは、パッケージ、クラス、インタフェース、メンバー、メソッドという5つの構造から構成され、最上位はパッケージになります。これらの要素が他の要素を内包するとき、内包される要素は包含するもののメンバーであるといわれます。
パッケージは、他のパッケージの下位パッケージとして他のパッケージのメンバーになります。クラスとインタフェースはパッケージのメンバーであり、他のクラスやインタフェースのメンバーにもなれます。フィールドとメソッドはクラスやインタフェースのメンバーです。
パッケージ | +--パッケージ | +--クラス/インタフェース | +--クラス/インタフェース | +--フィールド(メンバー変数) | +--メソッド
コンストラクタは、クラスにインスタンス化と呼ばれる処理を施してオブジェクトを生成するために使われ、クラス内部に記述しますが、Java の言語仕様の用語の中では、クラスのメンバーとは呼ばれません。
各々のメンバーには修飾子を指定することができます。何も指定しない場合にも、デフォルトの修飾子を選択したことになります。修飾子は、大きく分けて二つに分類されます。
private
...自分自身が含まれるクラス内からしかアクセスできないprotected
...同じパッケージ及び継承するサブクラスからしかアクセスできない。public
...全ての場所からアクセス可能。abstract
...抽象クラス、抽象メソッド。継承されて実装を記述されて初めてインスタンス化可能となる。static
...インスタンス化してもしなくても利用可能なクラス固有のメンバー。final
...継承できずオーバーライドできないメンバー。コア・パッケージのクラスは殆ど final。strictfp
...FP 厳密。不動小数点数が CPU の処理系に依存せずに厳密に同じ演算結果となる。transient
...直列化(シリアライゼーション)不可能。JVM の外部に書き出し不能なメンバー。volatile
...マルチスレッドによるアクセス時に、必ずマスターコピーと同期を取る。これらの修飾子は、同じものを複数指定することはできません。異なるものでも、同時に指定できるものと排他的なものが存在します。
例えば、同じものを同時に指定するとコンパイルエラーとなります。
class BadExample {
// javac エラー
public static static void printMsg() {
System.out.println("Hello, World!");
}
}
アクセス修飾子は複数同時指定することはできません。次の例は誤りであり、コンパイルエラーになります。
class BadExample {
// javac エラー
public private void printMsg() {
System.out.println("Hello, World!");
}
}
abstract と final は同時指定することができません。
class BadExample {
// javac エラー
final abstract void printMsg();
}
これらの意味は、後続の章で自ずから明らかとらるでしょう。ここでは言語仕様で定義されている修飾子をリストすることを目的としておきます。
abstract |
抽象クラス。継承されることを明示する。このクラスはインスタンス化できないクラス。サブクラスで実装してはじめてインスタンス化できる。 |
---|---|
final |
継承されたくないことを明示する。これ以上機能拡張/変更されたくないときに使う。インスタンス化はできる。 |
public |
全てのクラスから参照できる。継承もインスタンス化も制限がない。 |
省略 | 同じパッケージ内からしか参照できない。 |
クラスには、他にも strictfp を指定することができ、クラス内部に定義する内部クラスには、protected, private, static を指定できます。詳細は、後続の章で説明します。
メソッド内で定義される変数のスコープは、当該メソッド内にしか及ばない。メンバ変数の場合は、異なるクラスからもアクセスできるため、そのアクセス制限を修飾子で実現できる。
public |
アクセスに制限がない。 |
---|---|
protected |
同じパッケージ、またはそのサブクラスからしかアクセスできない。 |
省略 | 同じパッケージ内からしかアクセスできない。 |
private |
同じクラスからしかアクセスできない。 |
static |
静的変数。通常の変数は、インスタンスごとに異なる値を保持し、インスタンス変数と呼ばれる。一方、静的変数はインスタンスによらず共通のメモリ領域を占有する。クラスAをインスタンス化したインスタンス1とインスタンス2があるときに、インスタンス1が静的変数を10にセットしたら、インスタンス2から参照しても10になっている。静的変数の利用にはインスタンス化の必要がない。 |
final |
初期化した値以外に変更できない。定数として用いる。 |
transient |
オブジェクトの直列化 (Serialization) のときに、ファイルやデータベースなどの持続的な記憶領域に保存しない。 |
volatile |
スレッドは、変数にアクセスすると、当該スレッド用の作業コピーを作成して作業し、オブジェクトのロックとアンロック時にマスターコピーと一致させる。この修飾子がつけられたフィールドは、アクセスのたびに、作業コピーをマスタコピーに一致させる。 |
private
, protected
, public
の三つの修飾子はアクセス修飾子と呼ばれます。クラス、インタフェース、フィールド、メソッド、コンストラクタに対して同じような作用を持ちます。
public |
何処からでも呼び出せる。 |
---|---|
protected |
同じパッケージかそのサブクラスからしか呼び出せない。 |
省略 | 同じパッケージ内からしか呼び出せない。 |
private |
同じクラスからしか呼び出せない(メッセージが届かない)メソッド。 |
abstract |
抽象メソッド。抽象メソッドを一つでも持つクラスは抽象クラス。メソッド名、引数、戻り値は定義されているが、ブロック内の処理(実装)が行われていない。 |
static |
静的メソッド。当該メソッドが定義されているクラスをインスタンス化しなくても利用できる。インスタンスによらず同じ働きをするメソッドに用いる。 |
final |
オーバーライドできないメソッド。継承によってこのメソッドの機能変更/拡張はできない。 |
synchronized |
マルチスレッド時に同期を取るメソッド。スレッドに呼び出された時点でロックされる為、複数のプロセスによって実行されることがなくなる。 |
native |
C/C++ 言語などのプラットフォーム依存のコードで作成された DLL などを実体とするメソッド。 |
メソッドには他にも strictfp を指定することができます。詳細は後続の章で説明します。
public |
どこからでも呼び出せる。 |
---|---|
protected |
同じパッケージか、そのサブクラスからしか呼び出せない。 |
省略 | 同じパッケージ内からしか呼び出せない。 |
private |
同じクラス内からしか呼び出せない。 |
abstract |
抽象クラス。継承されることを明示する。このクラスはインスタンス化できないクラス。サブクラスで実装してはじめてインスタンス化できる。 |
---|---|
public |
全てのクラスから参照できる。継承もインスタンス化も制限がない。 |
省略 | 同じパッケージ内からしか参照できない。 |
インタフェースには他にも、strictfp を指定できます。また、内部インタフェースには、protected, private, static を指定できます。詳細は後続の章で説明します。
ここでは、クラス、インタフェース、コンストラクタ、メンバ変数、メソッドの修飾子を列挙しました。実際にクラスやメソッドを開発するときに参照してください。