「それでは、トピック 2 は静的ネストされたクラスです。非静的ネストされたクラスは内部クラスと呼ばれることを思い出してください。
「ネストされたクラス宣言のコンテキストで静的という言葉が何を意味するのかを理解しましょう。どう思いますか?」
「変数が静的として宣言されている場合、その変数のコピーは 1 つだけ存在します。つまり、ネストされたクラスが静的である場合、そのクラスのオブジェクトは 1 つしか作成できないということですか?」
「ここで静的という言葉に混乱しないでください。確かに、変数が静的として宣言されている場合、その変数のコピーは 1 つだけです。しかし、この点では、静的に入れ子になったクラスは静的メソッドに似ています。クラス宣言の前にある static という単語は、そのクラスがその外部クラスのオブジェクトへの参照を保存しないことを示します。」
「ああ。通常のメソッドは暗黙的にオブジェクト参照を保存しますが、静的メソッドはそうではありません。静的クラスも同じです、そうですか、エリー?」
「その通りです。あなたの素早い理解は称賛に値します。静的に入れ子になったクラスには、外側のクラスのオブジェクトへの隠された参照がありません。」
class Zoo
{
private static int count = 7;
private int mouseCount = 1;
public static int getAnimalCount()
{
return count;
}
public int getMouseCount()
{
return mouseCount;
}
public static class Mouse
{
public Mouse()
{
}
public int getTotalCount()
{
return count + mouseCount; // Compilation error.
}
}
}
「この例を注意深く見てみましょう。」
「静的な getAnimalCount メソッドはどの変数にアクセスできますか?」
「静的なものだけです。静的なメソッドなので。」
「getMouseCount メソッドはどの変数にアクセスできますか?」
「静的と非静的の両方です。Zoo オブジェクトへの隠された参照 (this) があります。」
「そうです。つまり、静的にネストされた Mouse クラスは、静的メソッドと同様に、Zoo クラスの静的変数にアクセスできますが、非静的変数にはアクセスできません。」
「Zoo オブジェクトが 1 つも作成されていない場合でも、Mouse オブジェクトを安全に作成できます。その方法は次のとおりです。」
class Home
{
public static void main(String[] args)
{
Zoo.Mouse mouse = new Zoo.Mouse();
}
}
「Mouse クラスは、実際には非常に普通のクラスです。Zoo クラス内で宣言されているという事実により、このクラスには 2 つの特別な機能が与えられます。」
1) 外部クラスの外部でネストされたクラス (Mouse クラスなど) のオブジェクトを作成する場合は、ドット演算子を使用して外部クラスの名前も指定する必要があります。
「たとえば、Zoo.Mouse のように。」
2) Zoo.Mouse クラスとそのオブジェクトは、Zoo クラスのプライベート静的変数とメソッドにアクセスできます (Mouse クラスも Zoo クラス内で宣言されているため)。
「今日はここまでです。」
「では、名前を追加するだけで終わりですか?」
"はい。"
「それは最初に思ったよりもさらに簡単です。」
GO TO FULL VERSION