・ 修飾子 static と final

Javaではアクセス制御以外にも フィールド及びメソッドの性質を指定する修飾子が何種類か存在します。 static と final は、それらの中でも最も頻繁に用いられるキーワードです。

static として宣言されたフィールドはオブジェクトごとに生成されません。 そのクラスのオブジェクトすべてに共通して利用されます。 static なフィールドは、 static でないフィールドよりも先に初期化されていることになります。 (このためフィールドの初期化の順番が、プログラムの見かけとは 異なって見える場合があるので注意してください。) クラスの中の staticフィールドしか対象として取り扱わないメソッドは、 staticメソッドとして宣言することができます。 (他のクラスのオブジェクトを生成したり、取り扱ったりすることはかまわない。) staticメソッドの中で、そのクラスの staticでないフィールドや staticでない他のメソッドを利用しようとすると、 コンパイル時にチェックされエラーとなります。
クラス定義の内部には通常のメソッドとは別に、 staticな名前のないメソッドの手続きを記述することができます。 この手続きはオブジェクトが生成される時ではなく、 クラスのバイトコードが VMに読み込まれた時点で実行されます。 主に staticフィールドの初期化などの処理に用います。 その処理は main()メソッドよりも先に実行されます。


/** static修飾子のテストのクラス */
public class StaticTest {

  /** staticなフィールド */
     static int x;

  /** staticな手続き */
     static {
         x = 100; // xの値を初期化
     }   

  /** 処理の開始のメソッド */
     static public void main( String argv[] ) {

           System.out.println("x = " + x );  // x = 100 を表示する
     }   
}

クラス定義、コンストラクタに static修飾子を付けるのは意味がないので、 できません。 ローカル変数に対しても static修飾子を付けることは意味がありません。
staticなフィールドおよびメソッドは、オブジェクトを生成しなくても利用できます。 アクセスするには次のようにクラス名を直接使います。 (オブジェクトを生成した場合は、そのオブジェクト名で指定してもよい。)


  Color.red;  // 赤色を表す staticなデータ

・ final はローカル変数、フィールドに対しては値の変更を許さないこと、 メソッドであれば再定義を許さないこと、 クラスであればサブクラスの定義を許さないことを示します。
ローカル変数、フィールドに対する finalの修飾子は、 C 及び C++ の const 宣言と同じ機能を提供します。 ただし final のフィールドをサブクラスの中で再定義することは許されます。

static と final の概念は互いに独立です。 しかし、クラス固有の定数を定義する目的で static かつ final な フィールドがしばしば用いられます。 これらのフィールドの名前はすべて大文字で記述するのが習慣です。


public static final int BUFSIZE=1024;