class Sub {
static int y;
public static void foo() {
this.y = 10;
}
}
this
はメソッドを呼び出すオブジェクトを表し、静的メソッドはどのオブジェクトにもバインドされないことを理解しています。ただし、上記の場合、変数yも静的です。
クラスオブジェクトで静的メソッドを呼び出すことができる場合、静的メソッドがクラスの静的変数を設定できないようにすることができないのはなぜですか。
この追加の制約の目的は何ですか?
this
はオブジェクトインスタンスを参照するためです。静的メソッドの呼び出しにはオブジェクトインスタンスがありません。ただし、もちろん静的フィールドにアクセスできます(静的フィールドのみ!)。使うだけ
class Sub {
static int y;
public static void foo() {
y = 10;
}
}
静的フィールドy
を取得し、同じ名前のローカル変数を取得しないようにする場合は、クラス名を使用して以下を指定します。
class Sub {
static int y;
public static void foo(int y) {
Sub.y = y;
}
}
this
はオブジェクトSub
のこのインスタンスを参照しています。メソッドはstatic
であるため、Sub
のインスタンスはありません。
静的メソッドのコンテキストで「this」を使用できない主な理由:-
this:-"this"は現在のクラスOBJECTを意味するため、そのクラスのObjectを作成することを意図した場合にのみ "this"が表示されることは明らかです。
静的メソッド:-静的メソッドを使用するためにオブジェクトを作成する必要はありません。 Javaルールに従って、「インスタンス」」または「静的」ではオブジェクトの作成が意味をなさないことを意味します。
したがって、両方を一緒に使用する場合(静的とこれ)は矛盾があります。これが、静的メソッドで「this」を使用できない理由です。
コードを機能させるには、次のように記述します。
class Sub {
static int y;
public static void foo() {
Sub.y = 10;
}
}
静的メソッドで静的フィールドを設定できますが、this
はオブジェクトの現在のインスタンスを表し、静的メソッドではインスタンスがないため、静的メソッドでthis
にアクセスできません。 。
これは「これ」オブジェクトを意味しますが、存在しません。あなたの場合、@ tibtofが示唆するようにクラス名を使用できます。
私は私の前に答えた他のすべての人々に同意します。これに答えるために別の方法で試してみましょう:
インスタンスメソッド/非静的メソッドはクラスのインスタンスに属しているため(遅かれ早かれ、オブジェクト参照にアクセスする必要があるため)、このキーワードはインスタンスブロックまたはメソッド内で意味があります。ただし、クラスのメンバーに対する静的キーワードは、オブジェクトが存在する場合にそのオブジェクトにアクセスできるクラスへの直接のアセットとして解釈されます。そのため、静的コンテキストでは、オブジェクトがどこかに存在するかどうかはわかりません。 Javaで静的領域内でこれを使用することは許可されない理由です。
変数を宣言し、メソッドが静的である場合、これはこのキーワードが現在のオブジェクトのみを指しているオブジェクト間で共有されます。クラスfooの5つのオブジェクトを作成し、すべてのオブジェクトによって(int y)の断片が1つだけ作成されたとします。したがって、このキーワードを使用してint yにアクセスすると、コンパイラは静的int yが共有されるため、すべてのオブジェクトによって。クラス名を使用して静的変数にアクセスします。
キーワード「this」は、操作対象のオブジェクトを指します。あなたの場合、これは非静的メソッドまたはコンストラクター内で(もし、その中に "this"を使用している場合)、 "this"はクラスSub。の特定のインスタンスを参照します。オブジェクトが作成されます。しかし、クラスの静的コンテキスト内のすべてのものは、クラスのロード中に解決されるため、そのためのオブジェクトを作成することなく使用できます。 「これ」は、オブジェクトが作成されたときにのみ解決されます(どのオブジェクトに対して動的に言うこともできます)。したがって、「これ」は静的コンテキストで意味をなします。それが役に立てば幸い。神のご加護を。
「this」キーワードは、オブジェクトのインスタンスが作成される場合にのみ適用可能です。また、静的メソッドではクラス領域に属するため、静的メソッドではインスタンスは作成されません。