36

Oracle の Javaチュートリアルから、次のテキストを見つけました。

クラスのメソッドや変数と同様に、ネストされた静的クラスはその外側のクラスに関連付けられます。また、静的クラス メソッドと同様に、入れ子になった静的クラスは、それを囲むクラスで定義されたインスタンス変数またはメソッドを直接参照することはできません。オブジェクト参照を介してのみ使用できます。

注: ネストされた静的クラスは、他のトップレベル クラスと同様に、その外部クラス (および他のクラス) のインスタンス メンバーと対話します。実際には、入れ子になった静的クラスは、パッケージングの便宜のために別のトップレベル クラスに入れ子になったトップレベル クラスの動作です。

ネストされた静的クラスには、外側のクラス名を使用してアクセスします。

OuterClass.StaticNestedClass

たとえば、ネストされた静的クラスのオブジェクトを作成するには、次の構文を使用します。

OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();

静的クラスをインスタンス化することはできないと思っていたので、太字の文がよくわかりません。

それが何を意味するか分かりますか?

4

5 に答える 5

52

kiheroが言うように混乱staticしているか、メソッドを持つクラス(たまたま静的メソッドを持つクラス)で概念を混乱させています。abstractstatic

静的なネストされたクラスは、それを囲むクラスのインスタンスを必要としない単なるネストされたクラスです。C++ に精通している場合、C++ のすべてのクラスは「静的」クラスです。Java では、ネストされたクラスはデフォルトで静的ではありません (この非静的な種類は「内部クラス」とも呼ばれます)。これは、外部クラスのインスタンスが必要であることを意味し、隠しフィールドの舞台裏で追跡しますが、これにより、内部クラスは関連するエンクロージング クラスのフィールドを参照できます。

public class Outer {

    public class Inner { }

    public static class StaticNested { }

    public void method () {
        // non-static methods can instantiate static and non-static nested classes
        Inner i = new Inner(); // 'this' is the implied enclosing instance
        StaticNested s = new StaticNested();
    }

    public static void staticMethod () {
        Inner i = new Inner(); // <-- ERROR! there's no enclosing instance, so cant do this
        StaticNested s = new StaticNested(); // ok: no enclosing instance needed

        // but we can create an Inner if we have an Outer: 
        Outer o = new Outer();
        Inner oi = o.new Inner(); // ok: 'o' is the enclosing instance
    }

}

静的メソッド内で非静的内部クラスをインスタンス化する方法の他の多くの例

ネストされたクラスのフィールドに特にアクセスする必要がない限り、ネストされたすべてのクラスをデフォルトで静的に宣言します。

于 2013-08-17T22:39:58.100 に答える
24

ネストされた静的クラス自体は、まったく静的ではありません。Java では、静的なクラスはありません。static ネストされたクラスの static キーワードは、それが外部クラスの別の静的メンバーであることを意味します。しかし、それは別の生のクラスです。そのため、このクラスをインスタンス化できます

于 2015-05-10T14:58:06.380 に答える
5

と混同staticしていabstractます。抽象クラスはインスタンス化できません。staticトップレベルクラスの有効な修飾子ではありませんが、内部クラスの意味はあなたが引用したものです.

于 2013-08-17T22:29:27.350 に答える