これまで紹介してきたフィールドやメソッドは、インスタンスの中に作られました。
ところが、これから紹介するstaticフィールドやstaticメソッドは、ちょっと違います。
staticフィールド
フィールドを作るときに「static」を付けると、そのフィールドはインスタンスを作らなくても最初からある、という特殊なフィールドになります。
/**
* staticフィールド1つだけ持つクラス。
*/
class HasStaticField
{
// int型変数のstatic フィールドdataを定義します。
static int data;
}
/**
* 実行用クラス。このクラスを実行してください。
*/
class HasStaticFieldRunner
{
public static void main( String[] args )
{
// staticフィールドに数値を入れます。
HasStaticField.data = 100;
// staticフィールドから値を取り出して出力します。
System.out.println( HasStaticField.data );
// 出力結果:
// 100
}
}
// HasStaticFieldRunner.java /** * staticフィールド1つだけ持つクラス。 */ class HasStaticField { // int型変数のstatic フィールドdataを定義します。 static int data; } /** * 実行用クラス。このクラスを実行してください。 */ class HasStaticFieldRunner { public static void main( String[] args ) { // staticフィールドに数値を入れます。 HasStaticField.data = 100; // staticフィールドから値を取り出して出力します。 System.out.println( HasStaticField.data ); // 出力結果: // 100 } }
HasStaticFieldクラスはフィールドを1つ持っているクラスです。
でも、そのフィールドの前には「static」(スタティック)が付いています。
* staticフィールド1つだけ持つクラス。
*/
class HasStaticField
{
// int型変数のstatic フィールドdataを定義します。
static int data;
}
/** * staticフィールド1つだけ持つクラス。 */ class HasStaticField { // int型変数のstatic フィールドdataを定義します。 static int data; }
staticを付けたフィールドは、初めからフィールドが作られています。
つまりインスタンスを作らなくても使えます。
インスタンスを作らなくても使えるため、使う時には「クラス.フィールド」という形で使用します。
HasStaticField.data = 100;
// staticフィールドから値を取り出して出力します。
System.out.println( HasStaticField.data );
// staticフィールドに数値を入れます。 HasStaticField.data = 100; // staticフィールドから値を取り出して出力します。 System.out.println( HasStaticField.data );
普通のフィールドはインスタンスの中にあったので、そのインスタンスを指定するの参照が必要でした。
でもstaticフィールドはインスタンスの中にはないので、その指定が必要ありません。なので参照や参照型変数を使わず、クラス名を使って指定するわけです。
静的領域
staticフィールドはインスタンスの中に作られません。
じゃあどこに作られるの? というと、「静的領域」というものが作られ、その中にstaticなフィールドが作られます。
静的領域は、初めは存在していないのですが、最初にクラスを使う時――たとえばstaticフィールドを使おうとした時や、インスタンスを作ろうとしたとき――に、自動的に作られます。
一度作られたら、もう静的領域はそのままです。増えることも、なくなることもありません。なので、その中にあるstaticフィールドもずっと使えます。
staticフィールドを使うと、インスタンスの数に関係ないデータを保存することができます。たとえばインスタンスの数を保存する時には、staticフィールドが役立つでしょう。