Java Language
staticキーワードの使用
サーチ…
構文
- パブリックstatic int myVariable; //静的変数を宣言する
- public static myMethod(){} //静的メソッドを宣言します。
- パブリックstatic final double MY_CONSTANT; //クラスのすべてのインスタンスで共有される定数変数を宣言する
- public final double MY_CONSTANT; //クラスのこのインスタンスに固有の定数変数を宣言します(インスタンスごとに異なる定数を生成するコンストラクタで最もよく使用されます)
staticを使用して定数を宣言する
static
キーワードは、インスタンス化されたクラスのないフィールドやメソッドにアクセスするために使用されるため、他のクラスで使用する定数を宣言するために使用できます。これらの変数は、クラスのインスタンス化のたびに一定のままです。規約上、 static
変数は常にALL_CAPS
で、ラクダケースではなくアンダースコアを使用します。例:
static E STATIC_VARIABLE_NAME
定数は変更できないので、 static
はfinal
修飾子でも使用できます。
たとえば、piの数学定数を定義するには:
public class MathUtilities {
static final double PI = 3.14159265358
}
任意のクラスで定数として使用できます。たとえば、次のようになります。
public class MathCalculations {
//Calculates the circumference of a circle
public double calculateCircumference(double radius) {
return (2 * radius * MathUtilities.PI);
}
}
これで静的を使う
Staticは、クラスの各インスタンスに割り当てられていないメソッドまたは変数の記憶域を提供します。むしろ、静的変数はすべてのクラスメンバー間で共有されます。ちなみに、静的変数をクラスインスタンスのメンバーのように扱うと、警告が表示されます。
public class Apple {
public static int test;
public int test2;
}
Apple a = new Apple();
a.test = 1; // Warning
Apple.test = 1; // OK
Apple.test2 = 1; // Illegal: test2 is not static
a.test2 = 1; // OK
静的と宣言されたメソッドは、同じように動作しますが、追加の制限があります。
this
キーワードを使用することはできません!
public class Pineapple {
private static int numberOfSpikes;
private int age;
public static getNumberOfSpikes() {
return this.numberOfSpikes; // This doesn't compile
}
public static getNumberOfSpikes() {
return numberOfSpikes; // This compiles
}
}
一般的には、クラスの異なるインスタンス(クローンメソッドなど)に適用されるジェネリックメソッドをstatic
として宣言し、 equals()
などのメソッドequals()
非静的メソッドとしてください。 Javaプログラムのmain
方法は常に静的です。つまり、 this
キーワードをmain()
内で使用することはできません。
静的コンテキストからの非静的メンバーへの参照
静的変数とメソッドはインスタンスの一部ではありません。特定のクラスのオブジェクトをいくつ作成しても、その変数のコピーが常に1つあります。
例えば、定数の不変なリストを持つことができます。静的メソッドの中に一度だけ静的にして初期化するとよいでしょう。これにより、特定のクラスのインスタンスを定期的に作成する場合に、パフォーマンスが大幅に向上します。
さらに、クラス内に静的ブロックを持つこともできます。これを使用して、静的変数にデフォルト値を割り当てることができます。それらは、クラスがメモリにロードされるときに一度だけ実行されます。
提案された名前としてのインスタンス変数は、特定のオブジェクトのインスタンスに依存しており、それらは、その気まぐれに役立ちます。あなたは、オブジェクトの特定のライフサイクルの間にそれらと一緒に遊ぶことができます。
そのクラスの静的メソッド内で使用されるクラスのすべてのフィールドおよびメソッドは、静的またはローカルでなければなりません。インスタンス(非静的)変数またはメソッドを使用しようとすると、コードはコンパイルされません。
public class Week {
static int daysOfTheWeek = 7; // static variable
int dayOfTheWeek; // instance variable
public static int getDaysLeftInWeek(){
return Week.daysOfTheWeek-dayOfTheWeek; // this will cause errors
}
public int getDaysLeftInWeek(){
return Week.daysOfTheWeek-dayOfTheWeek; // this is valid
}
public static int getDaysLeftInTheWeek(int today){
return Week.daysOfTheWeek-today; // this is valid
}
}