2

静的なキーワード (Java)を理解できないようです。そのため、Google で検索してこの Web サイトのスレッドを表示しましたが、答えは決定的で明確であると確信しています。 2つの理由でそれを理解する; 私はネイティブの英語話者ではなく、言語は私にとって少しあいまいで、クラス、クラスのインスタンス、インターフェイス (可能な場合)、インターフェイスと変数のインスタンス、リストと配列などでの使用例が不足していました。私は本当に助けていただければ幸いです。英語はできるだけ簡単にしてください;) Aditsanに感謝します

編集者からの注意: 元の投稿者は例を求めているだけであり、回答を提供する際に英語を母国語とする人ではないことに注意してください。コメントから、OP はまだ意味をなさない部分について質問するのに十分なほど概念を理解していないように見えるので、例は素晴らしいでしょう! 最適な回答の組み合わせを見つけるには、追加の詳細と複数の異なる説明が必要になる場合があります。

4

2 に答える 2

4

非静的な意味、つまりキーワードなしで宣言されたfield / methods/...を理解するのに役立つと思いますstatic

キーワードstaticなしで宣言されたすべてのフィールドは、オブジェクトの一部として存在します。2つのオブジェクトがある場合、これら2つのオブジェクトのそれぞれに、内容が異なる可能性のあるフィールドがあります。

class X {
 int f;
}

X x1 = new X();
X x2 = new X();
x1.f = 5;
x2.f = 10;
// x1.f still is 5

ただし、静的フィールドはオブジェクトごとではなく、クラスごとに存在します。gしたがって、次の例では、クラスのオブジェクトがいくつ(ある場合)でも、フィールドは1つだけYです。

class Y {
  static int g;
}

Y y1 = new Y();
Y y2 = new Y();
y1.g = 5;
y2.g = 10;
// y1.g is 10, because y1.g and y2.g mean the exact same thing

個人的には、静的フィールドへのアクセスは、Y.gオブジェクトインスタンス()に言及するのではなく、クラス()を使用して行う必要があると思いますy1.g。これにより、オブジェクトインスタンスがない場合の存在がより明確になります。

メソッドの違いは、非静的メソッドがオブジェクトインスタンスに関連付けられていることです。オブジェクトインスタンスはthis、メソッド内を使用してアクセスできます。で宣言されたメソッドを呼び出すと、void m()呼び出されたオブジェクトの非静的(および静的)フィールドにアクセスできます(したがって、x1.m()上記の例から、5を含むx2.m()フィールドにアクセスできます。10を含むフィールドにアクセスできます。

ただし、静的メソッドは、(対応する?)オブジェクトがなくても呼び出すことができます。宣言がstatic void n()クラス内にある場合は、またはYを使用してこのメ​​ソッドを呼び出すことができます(上記のようにinstanceofの場合)。ここでも、私はそれを書き留める最初の方法を好みます。静的メソッドでは、オブジェクトインスタンス(非静的メソッドで名前が付けられている)への参照がないため、静的メソッド内から特定の非静的フィールドにアクセスすることはできません-単に特定のオブジェクトへの明確な関連付けがないためです。Y.n()y1.n()y1Ythis

staticクラス定義について:これはかなり高度です。別のクラス内でクラスを宣言できます。内部クラスが静的でない場合、内部クラスのすべてのオブジェクトインスタンスには、外部クラスのインスタンスへの参照もあります(つまり、外部クラスのインスタンスがある場合にのみ、内部クラスのインスタンスを作成できます)。 )。これは必ずしもあなたが望むものではありません。内部クラスを宣言することにより、staticそれは存在し、それ自体のファイルで定義されたクラスのように、多かれ少なかれ使用することができます。

于 2013-01-30T22:12:20.267 に答える
0

基本的に、 static は次の 2 つのことを意味/提供します。

1) システム全体 (JVM) に存在する「アイテム」のインスタンスは 1 つだけです。 2) 静的な「アイテム」もコンテキスト/状態フリーです。

上記 (1) を説明するには: 食事トークンの発行者がいるとします。システム内にユーザー/プロセスがいくつあっても、すべてのトークンは単一の「モノ」によって発行される必要があります。その「もの」を静的なものとして開発します。次に、その「もの」が何であるかを決定します。複雑な操作を実行し、複雑なビジネス ルールを実装するクラスである可能性があります。次に、システム全体に対して「単一の統一された方法」でトークンを発行する単一の静的クラスを作成します。場合によっては、トークンが「静的」であることだけが重要ですが、トークンの発行方法は静的ではない場合があります。次に、単純に「静的」トークン カウンターを実装します。

(2) を説明するには: 上記の (1) について説明すると、静的な「もの」がコンテキストフリーで動作することが重要である理由が簡単にわかります。つまり、誰が何の目的で電話をかけたのかわかりません。それらが呼び出されると、過去から何も借りず、現在の呼び出し元からのすべての入力が必要であり、単に自分の仕事を行い、将来のために何も覚えていません。

于 2013-01-30T21:55:40.220 に答える