これは、static
キーワードのよくある誤解です。
static
変数を使用すると、このクラスのすべてのオブジェクトに対してこれらのうちの 1 つだけが存在するか、またはそのようなものになることを意味します。
static Object thereWillBeOnlyOne = new Object();
ただし、内部クラスのコンテキストでは、まったく別のことを意味します。内部static
クラスは、それを取り囲むクラスのオブジェクトと接続していませんが、非静的内部クラスは接続しています。
内部static
クラス:
public class TrieMap<K extends CharSequence, V> extends AbstractMap<K, V> implements Map<K, V> {
private static class Entry<K extends CharSequence, V> implements Map.Entry<K, V> {
私のMap.Entry
クラスで使用されるTrieMap
クラスは、それを作成したオブジェクトを参照する必要がないstatic
ため、不要な参照を保存するように作成できます。
非static
内部クラス:
public final class StringWalker implements Iterable<Character> {
// The iteree
private final String s;
// Where to get the first character from.
private final int start;
// What to add to i (usually +/- 1).
private final int step;
// What should i be when we stop.
private final int stop;
// The Character iterator.
private final class CharacterIterator implements Iterator<Character> {
// Where I am.
private int i;
// The next character.
private Character next = null;
CharacterIterator() {
// Start at the start.
i = start;
}
public boolean hasNext() {
if (next == null) {
if (step > 0 ? i < stop : i > stop) {
next = s.charAt(i);
i += step;
}
}
return next != null;
}
オブジェクトのCharacterIterator
内部は、オブジェクト内に一度だけ存在する、StringWalker
反復される文字列を指します。したがって、a の反復子を多数作成でき、それらはすべて同じ文字列を処理します。s
StringWalker
StringWalker
なぜこの奇妙さ?
static
この一見非論理的な二重性は、キーワード inの使用に由来しC
ます。
ではC
、次のことができます(または、少なくとも以前はできていました):
void doSomething () {
static int x = 1;
if ( x < 3 ) {
} else {
}
x += 1;
}
そして、関数を呼び出すたびに、x
最後に残したままになります-この場合はインクリメントされます。
概念は、変数がその囲みブロックによってスコープ的に囲まれているが、親ブロックによって意味的static
に囲まれていることをキーワードが示すというものでした。つまり、上記のコードは次とほぼ同等でした。
int x = 1;
void doSomething () {
if ( x < 3 ) {
} else {
}
x += 1;
}
ただし、関数内x
でのみ参照が許可されていました。
そのコンセプトを前進させるJava
と、物事はもう少し理にかなっています. static
内部クラスは、クラスの外部で宣言されたのとまったく同じように動作しますが、非内部クラスは、static
それを囲むインスタンスにより緊密に結合します。実際、インスタンスを直接参照できます。
また:
class Thing {
static Object thereWillBeOnlyOne = new Object();
のように振る舞う
Object thereWillBeOnlyOne = new Object();
class Thing {
合法だったら。
ここでレッスンを終了します。