静的領域についてもうちょっと理解を深めるため、インスタンスと比較してみましょう。
静的領域とインスタンス
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
}
}
/**
* 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;
}
/** * staticフィールドと普通のフィールドを持つクラス。 */ class HasStaticAndNormalField { // int型変数のstaticフィールドdataStaticを定義します。 static int dataStatic; // int型変数のフィールドdataNormalを定義します。 int dataNormal; }
2つのフィールドを持っていますが、それぞれ別の領域に作られることに注意してください。
staticフィールドのdataStaticフィールドは静的領域に作られます。
普通のフィールドのdataNormalフィールドはインスタンスに作られます。
つまり、
// staticフィールドに数値を入れます。
HasStaticAndNormalField.dataStatic = 1;
HasStaticAndNormalField.dataStatic = 1;
// staticフィールドに数値を入れます。 HasStaticAndNormalField.dataStatic = 1;
と、
// インスタンスを2つ作ります。
HasStaticAndNormalField ref1 = new HasStaticAndNormalField();
HasStaticAndNormalField ref2 = new HasStaticAndNormalField();
HasStaticAndNormalField ref1 = new HasStaticAndNormalField();
HasStaticAndNormalField ref2 = new HasStaticAndNormalField();
// インスタンスを2つ作ります。 HasStaticAndNormalField ref1 = new HasStaticAndNormalField(); HasStaticAndNormalField ref2 = new HasStaticAndNormalField();
はわけて作られる、ということです。
staticフィールドと普通のフィールドは、プログラム上での違いは「staticが付いているかいないか」だけですが、実際には大きく異なります。
この異なる点、つまり「staticフィールドは静的領域に作られる」「普通のフィールドはインスタンスに作られる」という違いをプログラムからイメージできるようにしましょう。
もしかしたら、静的領域はインスタンスに似ていると感じるかもしれません。
実際、静的領域はインスタンスとほぼ同じです。
違うのは、静的領域は「newで作らなくても自動的に作られる」「一度できたら増えることもなくなることもない」という点だけです。この点を押さえれば、静的領域をイメージしやすくなるでしょう。