staticフィールド
日本語 | 静的フィールド |
英語 | static field |
ふりがな | すたてぃっくふぃーるど |
フリガナ | スタティックフィールド |
staticで修飾されたフィールド。
「static 型 フィールド名;」のように、フィールドの宣言の先頭にstaticが付けられたフィールド。
staticフィールドは、インスタンスを作らなくても存在する。感覚としては「クラス内に存在するフィールド」と言える。
ただし、クラスは「インスタンスではない」ため、「クラスという苗字(ネームスペース)」を持つ「グローバルな変数」と考えた方がいいだろう。
staticフィールドはインスタンスに関係なく存在するため、「複数のインスタンスから勝手に変えられる」可能性があり、使用することは非常に危険である。
publicなstaticフィールドは論外。あらゆるクラスからアクセスされ、いつ値が変化するのか把握することが非常に困難である。
privateなstaticフィールドも、同クラスの複数のインスタンスからにアクセスできてしまうことを考えると作るべきではない。
唯一の使用機会はpublic static finalフィールドとして「定数値」フィールドを宣言する方法である。
この場合、フィールドの値は変更されないため、複数のインスタンスからアクセスされても問題ない。staticフィールドはこのためにあると考えてもいいだろう。
「static 型 フィールド名;」のように、フィールドの宣言の先頭にstaticが付けられたフィールド。
staticフィールドは、インスタンスを作らなくても存在する。感覚としては「クラス内に存在するフィールド」と言える。
ただし、クラスは「インスタンスではない」ため、「クラスという苗字(ネームスペース)」を持つ「グローバルな変数」と考えた方がいいだろう。
staticフィールドはインスタンスに関係なく存在するため、「複数のインスタンスから勝手に変えられる」可能性があり、使用することは非常に危険である。
publicなstaticフィールドは論外。あらゆるクラスからアクセスされ、いつ値が変化するのか把握することが非常に困難である。
privateなstaticフィールドも、同クラスの複数のインスタンスからにアクセスできてしまうことを考えると作るべきではない。
唯一の使用機会はpublic static finalフィールドとして「定数値」フィールドを宣言する方法である。
この場合、フィールドの値は変更されないため、複数のインスタンスからアクセスされても問題ない。staticフィールドはこのためにあると考えてもいいだろう。
参考サイト
- (参考サイトはありません)
// Sample.java
public class Sample
{
/**
* staticフィールド。
*/
static int staticField;
/**
* 非staticフィールド。
*/
int nonStaticField;
/**
* public static finalフィールド。
*/
public static final int CONSTANT_DATA = 100;
// staticメソッド。
public static void main( String[] args )
{
// staticメソッドからstaticフィールドにアクセスします。
staticField = 100;
System.out.println( staticField );
// 100
// staticメソッドから非staticフィールドにはアクセスできません。
// nonStaticField = 100;
// コンパイルエラー:
// static 参照は非 static フィールド nonStaticField ではできません。
// 非staticメソッドから呼び出してみます。
Sample sample = new Sample();
sample.callingNonStaticMethod();
// 外からアクセスする際には、クラス名を使ってアクセスします。
Sample.staticField = 100;
// このように、インスタンスを作らなくてもアクセスできるのが
// staticフィールドです。
// ちなみにインスタンスを通してstaticフィールドにアクセスすると
// エラーにはなりませんが警告にはなります。
sample.staticField = 100;
// 警告:
// The static field Sample.staticField should be accessed in a static way
// staticフィールドは、public static finalフィールドとして
// のみ使用しましょう。
System.out.println( CONSTANT_DATA );
// 100
}
/**
* 非staticメソッド(呼び出す方)。
*/
private void callingNonStaticMethod()
{
// staticメソッドからstaticフィールドにアクセスします。
staticField = 100;
System.out.println( staticField );
// 100
// staticメソッドから非staticフィールドにアクセスします。
nonStaticField = 200;
System.out.println( nonStaticField );
// 200
}
}
public class Sample
{
/**
* staticフィールド。
*/
static int staticField;
/**
* 非staticフィールド。
*/
int nonStaticField;
/**
* public static finalフィールド。
*/
public static final int CONSTANT_DATA = 100;
// staticメソッド。
public static void main( String[] args )
{
// staticメソッドからstaticフィールドにアクセスします。
staticField = 100;
System.out.println( staticField );
// 100
// staticメソッドから非staticフィールドにはアクセスできません。
// nonStaticField = 100;
// コンパイルエラー:
// static 参照は非 static フィールド nonStaticField ではできません。
// 非staticメソッドから呼び出してみます。
Sample sample = new Sample();
sample.callingNonStaticMethod();
// 外からアクセスする際には、クラス名を使ってアクセスします。
Sample.staticField = 100;
// このように、インスタンスを作らなくてもアクセスできるのが
// staticフィールドです。
// ちなみにインスタンスを通してstaticフィールドにアクセスすると
// エラーにはなりませんが警告にはなります。
sample.staticField = 100;
// 警告:
// The static field Sample.staticField should be accessed in a static way
// staticフィールドは、public static finalフィールドとして
// のみ使用しましょう。
System.out.println( CONSTANT_DATA );
// 100
}
/**
* 非staticメソッド(呼び出す方)。
*/
private void callingNonStaticMethod()
{
// staticメソッドからstaticフィールドにアクセスします。
staticField = 100;
System.out.println( staticField );
// 100
// staticメソッドから非staticフィールドにアクセスします。
nonStaticField = 200;
System.out.println( nonStaticField );
// 200
}
}
// Sample.java public class Sample { /** * staticフィールド。 */ static int staticField; /** * 非staticフィールド。 */ int nonStaticField; /** * public static finalフィールド。 */ public static final int CONSTANT_DATA = 100; // staticメソッド。 public static void main( String[] args ) { // staticメソッドからstaticフィールドにアクセスします。 staticField = 100; System.out.println( staticField ); // 100 // staticメソッドから非staticフィールドにはアクセスできません。 // nonStaticField = 100; // コンパイルエラー: // static 参照は非 static フィールド nonStaticField ではできません。 // 非staticメソッドから呼び出してみます。 Sample sample = new Sample(); sample.callingNonStaticMethod(); // 外からアクセスする際には、クラス名を使ってアクセスします。 Sample.staticField = 100; // このように、インスタンスを作らなくてもアクセスできるのが // staticフィールドです。 // ちなみにインスタンスを通してstaticフィールドにアクセスすると // エラーにはなりませんが警告にはなります。 sample.staticField = 100; // 警告: // The static field Sample.staticField should be accessed in a static way // staticフィールドは、public static finalフィールドとして // のみ使用しましょう。 System.out.println( CONSTANT_DATA ); // 100 } /** * 非staticメソッド(呼び出す方)。 */ private void callingNonStaticMethod() { // staticメソッドからstaticフィールドにアクセスします。 staticField = 100; System.out.println( staticField ); // 100 // staticメソッドから非staticフィールドにアクセスします。 nonStaticField = 200; System.out.println( nonStaticField ); // 200 } }