web-dev-qa-db-ja.com

静的なネストされたクラスをJavaでインスタンス化できますか?

オラクルのJava tutorials から私はこのテキストを見つけました:

クラスのメソッドと変数と同様に、静的なネストされたクラスはその外部クラスに関連付けられています。また、静的クラスメソッドと同様に、静的ネストクラスは、その包含クラスで定義されているインスタンス変数またはメソッドを直接参照することはできません。オブジェクト参照を通じてのみ使用できます。

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

静的なネストされたクラスは、囲んでいるクラス名を使用してアクセスされます。

OuterClass.StaticNestedClass

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

OuterClass.StaticNestedClassnestedObject = new OuterClass.StaticNestedClass();

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

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

24
user1031431

キヒーローが言うようにstaticabstractと混同している、またはstaticメソッドを持つクラス(たまたま静的なクラスである)で概念を混乱させているメソッド)。

静的なネストされたクラスは、それを囲むクラスのインスタンスを必要としないネストされたクラスです。 C++に精通している場合、C++のallクラスは「静的」クラスです。 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
    }

}

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

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

41
Jason C

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

17
Abhishek raut

staticabstractを混同しています。抽象クラスはインスタンス化できません。 staticは最上位クラスの有効な修飾子ではありませんが、内部クラスの意味は引用したものです。

5
kiheru

静的クラスを少し誤解したと思います。すべての抽象クラスとインターフェースをインスタンス化できるわけではありませんが、静的クラスをインスタンス化することはできます。 すべての静的クラスはネストされた静的クラスであることに注意してください。ご覧のように、静的クラスを作成することはできません。 Eclipseで新しいクラスを作成してみてください

静的クラスは常にそれを囲む「親クラス」に属し、静的クラスと非静的クラスの違いは次のとおりです。「親クラス」の静的プロパティのように子静的クラスを参照できます。

ParentClass.NestedStaticClass nestedstatic = new ParentClass.NestedStaticClass();

ただし、次のように、親クラスをインスタンス化することによって、静的でないネストされたクラスを参照することしかできません。

ParentClass parent = new ParentClass();
ParentClass.NestedClass nested = parent.new NestedClass();

違いは、静的フィールドと非静的フィールドの違いと同じです。

1
Dai Niu