#pragma twice

KAB-studio > プログラミング > Javaのオブジェクト指向入門 > 4. staticはどこにある? > 4.2 静的領域とインスタンス
 
前のページへつぎ

4.2 静的領域とインスタンス

del.icio.us 登録する はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数 livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数 Yahoo!ブックマーク 詳細を表示 users RSSに登録
更新日: 2008/03/31
動作確認環境:Windows XP Professional SP2, Java SE 5

 静的領域についてもうちょっと理解を深めるため、インスタンスと比較してみましょう。

静的領域とインスタンス

 staticフィールドと普通のフィールドを持つクラスを作ってみましょう。

// HasStaticAndNormalFieldRunner.java

/**
 * staticフィールドと普通のフィールドを持つクラス。
 */
class HasStaticAndNormalField
{
    // int型変数のstaticフィールドdataStaticを定義します。
    static int dataStatic;

    // int型変数のフィールドdataNormalを定義します。
    int dataNormal;
}

/**
 * 実行用クラス。このクラスを実行してください。
 */
class HasStaticAndNormalFieldRunner
{
    public static void main( String[] args )
    {
        // staticフィールドに数値を入れます。
        HasStaticAndNormalField.dataStatic = 1;

        // インスタンスを2つ作ります。
        HasStaticAndNormalField ref1 = new HasStaticAndNormalField();
        HasStaticAndNormalField ref2 = new HasStaticAndNormalField();
        // それぞれに数値を入れます。
        ref1.dataNormal = 100;
        ref2.dataNormal = 200;

        // staticフィールドから値を取り出して出力します。
        System.out.println( HasStaticAndNormalField.dataStatic );
        // 出力結果:
        // 1

        // 普通のフィールドから値を取り出して出力します。
        System.out.println( ref1.dataNormal );
        System.out.println( ref2.dataNormal );
        // 出力結果:
        // 100
        // 200
    }
}
// HasStaticAndNormalFieldRunner.java
/**
 * staticフィールドと普通のフィールドを持つクラス。
 */
class HasStaticAndNormalField
{
	// int型変数のstaticフィールドdataStaticを定義します。
	static int dataStatic;
	// int型変数のフィールドdataNormalを定義します。
	int dataNormal;
}
/**
 * 実行用クラス。このクラスを実行してください。
 */
class HasStaticAndNormalFieldRunner
{
	public static void main( String[] args )
	{
		// staticフィールドに数値を入れます。
		HasStaticAndNormalField.dataStatic = 1;
		// インスタンスを2つ作ります。
		HasStaticAndNormalField ref1 = new HasStaticAndNormalField();
		HasStaticAndNormalField ref2 = new HasStaticAndNormalField();
		// それぞれに数値を入れます。
		ref1.dataNormal = 100;
		ref2.dataNormal = 200;
		// staticフィールドから値を取り出して出力します。
		System.out.println( HasStaticAndNormalField.dataStatic );
		// 出力結果:
		// 1
		// 普通のフィールドから値を取り出して出力します。
		System.out.println( ref1.dataNormal );
		System.out.println( ref2.dataNormal );
		// 出力結果:
		// 100
		// 200
	}
}

 HasStaticAndNormalFieldクラスは、staticフィールド1つ、普通のフィールド1つを持っています。

/**
 * staticフィールドと普通のフィールドを持つクラス。
 */
class HasStaticAndNormalField
{
    // int型変数のstaticフィールドdataStaticを定義します。
    static int dataStatic;

    // int型変数のフィールドdataNormalを定義します。
    int dataNormal;
}
/**
 * staticフィールドと普通のフィールドを持つクラス。
 */
class HasStaticAndNormalField
{
	// int型変数のstaticフィールドdataStaticを定義します。
	static int dataStatic;
	// int型変数のフィールドdataNormalを定義します。
	int dataNormal;
}

 2つのフィールドを持っていますが、それぞれ別の領域に作られることに注意してください。
 staticフィールドのdataStaticフィールドは静的領域に作られます
 普通のフィールドのdataNormalフィールドはインスタンスに作られます
 つまり、

        // staticフィールドに数値を入れます。
        HasStaticAndNormalField.dataStatic = 1;
		// staticフィールドに数値を入れます。
		HasStaticAndNormalField.dataStatic = 1;

 と、

        // インスタンスを2つ作ります。
        HasStaticAndNormalField ref1 = new HasStaticAndNormalField();
        HasStaticAndNormalField ref2 = new HasStaticAndNormalField();
		// インスタンスを2つ作ります。
		HasStaticAndNormalField ref1 = new HasStaticAndNormalField();
		HasStaticAndNormalField ref2 = new HasStaticAndNormalField();

 はわけて作られる、ということです。

 staticフィールドと普通のフィールドは、プログラム上での違いは「staticが付いているかいないか」だけですが、実際には大きく異なります。
 この異なる点、つまり「staticフィールドは静的領域に作られる」「普通のフィールドはインスタンスに作られる」という違いをプログラムからイメージできるようにしましょう。

 もしかしたら、静的領域はインスタンスに似ていると感じるかもしれません。
 実際、静的領域はインスタンスとほぼ同じです。
 違うのは、静的領域は「newで作らなくても自動的に作られる」「一度できたら増えることもなくなることもない」という点だけです。この点を押さえれば、静的領域をイメージしやすくなるでしょう。

4.2 静的領域とインスタンス
このページは、Java言語を用いたオブジェクト指向プログラミングのチュートリアル解説を行う「Javaのオブジェクト指向入門」の一ページです。
詳しい説明は「Javaのオブジェクト指向入門」目次をご覧ください。