Java では、クラス内でフィールドを静的にするか非静的にするかを選択できます。
フィールドが静的な場合、それを参照するためにそのクラスの「インスタンス」を「インスタンス化」する必要はありません。
あなたの例では、別のクラスの同じパッケージ内から「月」変数にアクセスできます(「アクセス修飾子」がないため、Javaはその変数を「パッケージプライベート」にします-中のものを除くすべてのクラスに隠されています次のようにして、同じディレクトリ (Java 用語ではパッケージ) にコピーします。
public class Example {
void outputMonth() {
System.out.println("This is the month: " + Date.month);
}
}
しかし、静的修飾子が削除された場合、「月」は単純にクラスに関連付けられません。クラスの各「インスタンス」に属します。プログラムの現在のバージョンでは、「月」を Example クラスに移動し、Date に月ではなく Example.month で参照させることができ、まったく同じように機能します。
クラスの「インスタンス」を「インスタンス化」するには、「new」キーワードを使用します。
public class Example {
void instantiateAndDisplay() {
Date newInstance = new Date();
System.out.println("This won't be pretty, but it's a new Date: " + newInstance);
}
}
ここで、static キーワードが「month」から削除されると、各 Date 「インスタンス」には、個別に変更できる月変数の独自のコピーが含まれます。new を 2 回呼び出すと、インスタンスが 2 つ作成され、呼び出しが 3 回、インスタンスが 3 つというようになります。
それがもう少し明確な場合、コンパイラが「これ」について警告する理由は、「これ」が現在のインスタンスのグラブバッグ用語であるためです。そのメソッドを静的にしたため、インスタンスはありません。そのコードはクラスにアタッチされていますが、Example クラスに移動でき、Date は Example.setMonth(month); を呼び出して使用できます。
「this」が定義されている理由は、スコープがあいまいな場合があるためです。setMonth の例では、すべてのメソッドから static 修飾子を削除した場合、ローカル変数の名前を「x」から「month」に変更できますが、これがないと、それ自体から渡されたローカル変数 month をそれ自体は何もしません。「this」は、「month」のスコープを「Date クラスの現在のインスタンス」を意味するように定義します。これにより、次の例に示すように、それを割り当てることができます。
public class Date {
private int month;
public void setMonth(int month) {
this.month = month;
}
public void getMonth() {
return month; // Note - no competing scope, so month comes from the current instance.
}
}
次に、2 つの新しい Date インスタンスを作成し、それらの月を異なる値に割り当てて、それらを個別に使用できます。しかし、修飾子が静的である場合、その値は、そのクラスのすべてのインスタンス、および「アクセス修飾子」によって許可されたすべてのクラスからアクセス可能であり、その範囲はこの議論を超えています。