7

私は何度もこの問題に遭遇してきましたが、なぜそれが起こっているのか、そして「静的」が実際に何を意味するのかを学ぼうとはしませんでした。Eclipse が提案した変更を適用して先に進みました。

public class Member {

 // Global Variables
 int iNumVertices;
 int iNumEdges;

 public static void main(String[] args) {

  // do stuff

  iNumVertices = 0; // Cannot make a static reference to the non-static field iNumVertices

  // do more stuff

 } // main end 
}

だから日食は私にそうするように言いますstatic int iNumVertices;、そして私はその理由がわかりません。では、「静的」とは正確には何ですか、どのように使用され、「静的」を使用する目的は何ですか、なぜこの問題が発生するのですか?

4

8 に答える 8

9

これがあなたの例です:

public class Member {

    // Global Variables
    int iNumVertices;
    int iNumEdges;

    public static void main(String[] args) {

        // do stuff

        iNumVertices = 0; // Cannot make a static reference to the non-static field iNumVertices

    }
}

メソッドmainは、クラスに関連付けられた静的メソッドです。のインスタンスに関連付けられていMemberないため、 のインスタンスに関連付けられている変数にはアクセスできませんMember。これに対する解決策は、これらのフィールドを静的にしないことです。代わりに、キーワードをMember使用してインスタンスを作成する必要があります。new

変更されたバージョンは次のとおりです。

public class Member {
    // Fields
    private int iNumVertices;
    private int iNumEdges;

    public Member(){
        // init the class
    }

    public static void main(String[] args) {
        Member member = new Member();
        member.iNumVertices = 0;
        // do more stuff
    }
}

グローバル スタティックを作成していることに気付いた場合は、何かを設計する方法について慎重に検討する必要があることを示しています。常に間違っているわけではありませんが、自分がしていることについて考えるように伝えるべきです。

于 2010-08-05T14:42:46.997 に答える
4
learn what "static" actually means

静的とは、実際には、クラス変数がその特定のクラスのすべてのインスタンスで同じであることを意味しますが、静的変数の使用を避けたい場合は(静的変数はメモリに保持されているため、これは良い考えです)、コンストラクターを介して変数値を渡すことができますこれにより、静的修飾子の使用を回避し、同じ効果を実現します(つまり、クラスのインスタンス化時に同じ値を渡す場合)。

コード例は次のとおりです。

public class Car{

    private int speed;

    public Car(int speed){
        this.speed = speed;
    }

}

したがって、新しいインスタンスを作成するときにこれを行うことができます。

Car car = new Car(100);

また、Carインスタンスを作成するたびに、速度が100になるため、静的な宣言が回避されます。private static int speed = 100;

于 2010-08-05T15:24:08.807 に答える
4

静的変数は、クラスのすべてのオブジェクトで共有される変数です。ここで作成したMemberのすべてのオブジェクトの例では、独自のiNumVertices値を持つオブジェクトを取得します。変数でstaticを使用する場合、 Memberのすべてのオブジェクトで共有される変数は 1 つだけです。静的メソッドは同じように機能します。それらはすべてのオブジェクトで共有されます。

静的変数/メソッドはすべてのオブジェクトに共通であるため、これらの変数/メソッドにアクセスするためにクラスのオブジェクトを作成する必要はありません。

iNumVerticesのような非静的変数は、クラスのオブジェクトに属します。オブジェクトを作成しないとアクセスできません。したがって、静的コンテキスト (ここではメインメソッド)から非静的変数にアクセスすると、Java はアクセスしようとしているオブジェクトのiNumVerticesを認識できません。したがって、エラー。

iNumVertices を静的にするか、 Memberのオブジェクトを作成して参照します

Member m = new Member();
m.iNumVertices = 0;
于 2010-08-05T14:50:05.947 に答える
2

静的変数はクラス変数です。クラスのすべてのインスタンスで利用可能なその変数の単一のコピーがあり、それらはその変数を共有します。静的メンバーは、クラスの特定のインスタンスを参照せずに使用することもできます。

詳細はこちら:

http://download.oracle.com/javase/tutorial/java/javaOO/classvars.html

于 2010-08-05T14:37:43.353 に答える
1

静的メソッドは、静的変数のみにアクセスできます。クラスには 2 種類の変数があります。1 つは静的変数 (クラス変数も) で、もう 1 つはインスタンス変数です。静的変数のコピーは 1 つだけメモリに存在しますが、インスタンス変数はオブジェクトごとにインスタンス化されます。したがって、静的変数の場合、すべてのオブジェクトが同じ変数にアクセスし、1 つのオブジェクトによって行われた変更は他のオブジェクトに反映されます。ここでの問題は、静的変数にアクセスするためにメソッドが静的でなければならない理由です。メソッドを静的にすると、そのクラスのオブジェクトをインスタンス化せずにメソッドにアクセスできます。このメソッドがインスタンス変数にアクセスできる場合、どのオブジェクトの変数を変更する必要があるでしょうか? 別の方法も可能です。つまり、非静的メソッドが静的変数にアクセスできます。

于 2010-08-05T14:48:20.473 に答える
1

静的変数は、アクセスするためにクラスをインスタンス化する必要がないため、静的コンテキストから非静的変数にアクセスしようとすると、初期化/インスタンス化されていないものにアクセスしようとする危険があります。

于 2010-08-05T14:39:30.503 に答える
0

静的変数は、クラスのすべてのインスタンスに共通です。

注: 前述のように、これらはクラス変数、つまりすべてのインスタンスで共有されます。

これらは、クラス レベルの変数として呼び出すこともできます。通常、定数 (定数を定義するには final キーワードも必要です) とグローバル変数を static として定義します。

詳細については、http: //download.oracle.com/javase/tutorial/java/javaOO/classvars.htmlを参照してください。

http://www.roseindia.net/java/beginners/staticvariable.shtml

于 2010-08-05T14:41:03.607 に答える
0

静的メソッドで使用されるすべてのクラス変数 (クラス本体内およびメソッド本体外で宣言された変数) も、静的に宣言する必要があります。

静的クラスの変数とメソッドは、そのクラスのインスタンスを必要とせずに、そのクラスの外部からアクセスできます。

于 2010-08-05T14:41:59.147 に答える