Javaで「グローバル」変数を宣言する場合、「静的」を正確に何を意味するのでしょうか?
-
26-09-2019 - |
質問
私はこの問題に多くの時間を実行してきたと私は、なぜその出来事学び、どのような「静的」実際の手段を学ぶために気にすることはありません。私は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;
を行うために私に語ったと私は確信理由はありませんよ。まさに「静的」で何ので、それが使用されているか、どのような「静的」を使用しての目的である、そしてなぜそれが私にこの問題を与えている?
解決
ここにあなたの例です。
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
}
}
あなた自身がグローバル静を作成見つけることは、あなたがどのようにしている設計何かについて慎重に考える必要があることをあなたに示しています。これは、の常にの間違っていないのですが、それはあなたがやっていることを考えるようにあなたを教えてくださいます。
他のヒント
の静的の変数は、クラスのすべてのオブジェクト間で共有されるものです。ここでは、のメンバーののすべてのオブジェクトのためのあなたの例では、あなたが作成し、あなたはそれが自分ののiNumVertices の値だ持っているオブジェクトを取得します。あなたが使用する場合の静的の変数で、のメンバーののすべてのオブジェクト間で共有唯一の変数があります。 の静的の方法は、同じように動作します - 彼らはすべてのオブジェクト間で共有されています。
の静的の変数/メソッドは、すべてのオブジェクトに共通しているので、、1つの必要性これらの変数/メソッドにアクセスするためのクラスのオブジェクトを作成しません。
クラスのオブジェクトに属するのiNumVertices のような非静的変数。彼らは、オブジェクトを作成せずにアクセスすることはできません。あなたは、静的コンテキスト(ここではのメインの方法)から非静的変数にアクセスするときに、その後、JavaはあなたがaccesssしようとしているオブジェクトののiNumVertices の知ることはできません。したがって、エラー
のいずれかをメイクのiNumVertices の静的、または
メンバーのオブジェクトを作成することによって、それを参照してください。Member m = new Member();
m.iNumVertices = 0;
learn what "static" actually means
実際には静的変数を使用しないようにしたい場合は(良いアイデアである静的変数がメモリ内に保持されているので、)クラス変数はしかし、その特定のクラスのすべてのインスタンスで同じになることを意味し、あなたが渡すことができますどのような静的変数値トラフことにより、静的な改質剤の使用を避け、コンストラクタ、および(あなたはクラスのインスタンス作成時に同じ値を渡した場合である)と同じ効果を達成します。
以下のコード例である:
public class Car{
private int speed;
public Car(int speed){
this.speed = speed;
}
}
新しいインスタンスを作成するときにこれを行うことができますのでます:
Car car = new Car(100);
あなたは車のインスタンスを作成するたびに、それはこのようにprivate static int speed = 100;
静的変数はクラス変数です。そこクラスのすべてのインスタンスにその変数盛の単一のコピーとなり、彼らはその変数を共有します。静的メンバーは、クラスの特定のインスタンスを参照することなく使用することができる。
もっとここます:
http://download.oracle.com/javase/tutorial /java/javaOO/classvars.htmlする
静的変数は、クラスにアクセスするためにインスタンス化されている必要はありませんます。
静的メソッドは、唯一の静的変数にアクセスすることができます。クラス内の変数の2種類があります。一つは静的変数(また、クラス変数)であり、他方は、インスタンス変数です。静的変数のコピーが1つだけメモリ上に存在しますが、インスタンス変数は、オブジェクトごとにインスタンス化されます。だから、静的変数のために、すべてのオブジェクトが同じ変数にアクセスして、一つのオブジェクトによって行われた変更は、他のオブジェクトに反映されます。 方法は、アクセスの静的変数に静的である必要があるということですなぜここに質問です。あなたはメソッドの静的を作るときは、そのクラスのオブジェクトをインスタンス化せずにメソッドにアクセスすることができます。このメソッドは、オブジェクトの変数に対して、アクセスインスタンス変数にできているのであれば、それは変更をするに作る必要がありますか?他の方法は、すなわち、非静的メソッドは静的変数にアクセスすることができ可能です。
静的メソッドで使用されるすべてのクラス変数(変数は、クラス本体内とメソッド本体の外側に宣言された)あまりにも静的と宣言する必要がある。
静的クラス変数およびメソッドは、そのクラスのインスタンスを必要とすることなく、そのクラスの外側にアクセスすることができます。
静的変数は、クラスのすべてのインスタンスに共通です。
注:ASが、これらは、すなわちすべてのインスタンスによって共有されるクラス変数である以前の前記
。また、これらは、クラスレベル変数として呼び出すことができます。 一般的に、あなたはstaticとして定数(あなたはまた、定数を定義するための最終的なキーワードが必要になります)とグローバル変数を定義します。
詳細については、参照してください。 http://download.oracle.com/javase/tutorial/java/ javaOO / classvars.htmlする
http://www.roseindia.net/java/beginners/staticvariable.shtml の