0

オブジェクトを定義し、静的変数を宣言しましたi。メソッドで、get()インスタンス変数とクラス変数を出力しようとすると、両方とも同じ値が出力されます。

this.iインスタンス変数ではありませんか?50 ではなく 0 を出力する必要がありますか?

public class test {
    static int i = 50;
    void get(){
        System.out.println("Value of i = " + this.i);
        System.out.println("Value of static i = " + test.i);
    }

    public static void main(String[] args){
        new test().get();
    }

}
4

4 に答える 4

8

いいえ、変数は 1 つだけです。インスタンス変数を宣言していません。

残念ながら、Java では、関連する型の参照を介してアクセスしているかのように、静的メンバーにアクセスできます。これは IMO の設計上の欠陥であり、一部の IDE (Eclipse など) では警告またはエラーとしてフラグを立てることができますが、これは言語の一部です。あなたのコードは効果的です:

System.out.println("Value of i = " + test.i);
System.out.println("Value of static i = " + test.i);

関連するタイプの式を経由する場合、値をチェックすることさえありません-たとえば:

test ignored = null;
System.out.println(ignored.i); // Still works! No exception

ただし、副作用は引き続き評価されます。例えば:

// This will still call the constructor, even though the result is ignored.
System.out.println(new test().i);
于 2013-09-26T18:31:41.573 に答える
2

フィールドiは として宣言されていstaticます。またはstaticでフィールドにアクセスできます。だからどちらもYourClass.StaticFieldinstance.StaticField

this.i
test.i

クラスのインスタンス メソッドのコンテキストで同じ値を参照していますtest

またはを使用してstaticフィールドにアクセスすることは、悪い習慣と見なされます。this.iinstance.i

于 2013-09-26T18:32:06.277 に答える
0

ここではインスタンス変数を宣言しませんでした。静的変数は 1 つだけです。値を割り当てずにインスタンス変数を宣言すると、「this」キーワードを使用してそのインスタンス変数の値を出力しようとすると、デフォルト値を 0 として取得できます。

于 2013-09-26T21:18:33.610 に答える
0

static はクラス レベル変数であり、非 static はインスタンス変数 (オブジェクト レベル変数) です。したがって、ここでは静的変数のみを宣言し、それらを異なる方法で呼び出しますが、意味は同じです。

this.i
test.i

どちらもクラス レベル変数または静的変数として扱われます。

于 2013-09-26T18:44:32.577 に答える