45
class Sub {
    static int y;
    public static void foo() {
         this.y = 10;
    }
}

thisこれはメソッドを呼び出すオブジェクトを表し、静的メソッドはどのオブジェクトにもバインドされていないことを理解しています。しかし、上記の場合、変数yも静的です。

クラスオブジェクトで静的メソッドを呼び出すことができる場合、静的メソッドがクラスの静的変数を設定できるようにできないのはなぜですか。

この追加の制約の目的は何ですか?

4

9 に答える 9

96

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;
    }
}
于 2012-07-26T07:41:40.087 に答える
6

thisはオブジェクトのこのインスタンスを参照していますSub。メソッドはstaticであるため、 のインスタンスはありませんSub

于 2012-07-26T07:40:54.797 に答える
3

コードを機能させるには、次のように記述します。

class Sub {
    static int y;
    public static void foo() {
         Sub.y = 10;
    }
}

静的メソッドで静的フィールドを設定できますが、オブジェクトの現在のインスタンスを表し、静的メソッドにはインスタンスがないthisため、静的メソッドにはアクセスできません。this

于 2012-07-26T07:39:31.333 に答える
2

これは「この」オブジェクトを意味しますが、1 つもありません。あなたの場合、@tibtof が示唆するようにクラス名を使用できます。

于 2012-07-26T07:40:31.427 に答える
0

キーワード「this」は、操作対象のオブジェクトを指します。あなたの場合、 this は非静的メソッドまたはコンストラクター内にあります (1 つあり、その中で「this」を使用する場合)、「this」はクラス Sub.So の特定のインスタンスを参照します。オブジェクトが作成されます。ただし、クラスの静的コンテキスト内のものはすべて、クラスのロード中に解決されるため、そのオブジェクトを作成することさえせずに使用できます。「これ」は、オブジェクトが作成されたときにのみ解決されます(どのオブジェクトに対して動的に言うことさえできます)。したがって、「これ」は静的なコンテキストでは意味があります。それが役に立てば幸い。神のご加護を。

于 2012-07-26T08:10:31.967 に答える
0

変数を宣言し、メソッドが静的である場合、これは、このキーワードが現在のオブジェクトのみを指しているオブジェクト間で共有されます。クラス foo の 5 つのオブジェクトを作成し、made of (int y) のコピーを 1 つだけ作成して、すべてのオブジェクトで細断処理したとします。したがって、このキーワードを使用して int y にアクセスすると、静的 int y が共有されているため、コンパイラはどのオブジェクトを指す必要があるかを曖昧にします。すべて対象です。クラス名を使用して静的変数にアクセスできます。

于 2018-05-19T17:15:57.090 に答える