修飾子

Revised: Dec./12th/2003: Since: Dec./27th/2001

クラス、メンバ変数、コンストラクタ、メソッドには修飾子を付ける事があります。ここでは、パッケージ、クラス、インタフェース、フィールド、メソッドについて修飾子を網羅します。

メンバー

Java プログラムは、パッケージ、クラス、インタフェース、メンバー、メソッドという5つの構造から構成され、最上位はパッケージになります。これらの要素が他の要素を内包するとき、内包される要素は包含するもののメンバーであるといわれます。

パッケージは、他のパッケージの下位パッケージとして他のパッケージのメンバーになります。クラスとインタフェースはパッケージのメンバーであり、他のクラスやインタフェースのメンバーにもなれます。フィールドとメソッドはクラスやインタフェースのメンバーです。

パッケージ
 |
 +--パッケージ
 |
 +--クラス/インタフェース
      |
      +--クラス/インタフェース
      |
      +--フィールド(メンバー変数)
      |
      +--メソッド

コンストラクタは、クラスにインスタンス化と呼ばれる処理を施してオブジェクトを生成するために使われ、クラス内部に記述しますが、Java の言語仕様の用語の中では、クラスのメンバーとは呼ばれません。

修飾子の分類

各々のメンバーには修飾子を指定することができます。何も指定しない場合にも、デフォルトの修飾子を選択したことになります。修飾子は、大きく分けて二つに分類されます。

アクセス修飾子
アクセス制御を実現する修飾子。パッケージやクラスを単位として、プログラムのコードの他の部分からのアクセス可能性を記述する。メンバーの種類と階層に応じて指定可能なものが変わる。定義されているものは次の四つ:
それ以外
アクセス修飾子以外の修飾子。メンバーの種類に応じて指定可能なものが変わる。定義されているものは次の六つ:

これらの修飾子は、同じものを複数指定することはできません。異なるものでも、同時に指定できるものと排他的なものが存在します。

例えば、同じものを同時に指定するとコンパイルエラーとなります。

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 を指定できます。詳細は後続の章で説明します。

ここでは、クラス、インタフェース、コンストラクタ、メンバ変数、メソッドの修飾子を列挙しました。実際にクラスやメソッドを開発するときに参照してください。



Copyright © 2001-2003 SUGAI, Manabu. All Rights Reserved.