なぜ私はJavaで静的クラスのインスタンスを作成したいのですか?

The Java Tutorial says that the static nested classes are accessed by using the name of the enclosing class like new EnclosingClassNameHere.StaticNestedClassNameHere()

なぜ静的クラスのインスタンスを作成したいのですか?誰か説明していただけますか?

2

3 答え

"static" in this case can be misleading. What it really means is that the class can exist independently. Non-static inner classes can't exist without an instance of the enclosing class.

IMO、それが入っているクラスの外でインナークラスを使い始めるときには、それを移動してそれ自身のトップレベルクラスにすることを検討する必要があります。クラス間の関係が密接に結合されているため、内部クラスとして保持する必要があるケースはごくわずかです。

あなたのコード例:

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

StaticNestedClassのスタンドアロンインスタンスを作成しています。

それが静的でなかったら、あなたはそれをすることができませんでした。 OuterClass のインスタンスからのみ StaticNestedClass()のインスタンスを作成できます。

独自の.javaファイルに移動した場合は、ほぼ同じように扱うことができます。

StaticNestedClass notNestedAnymore = new StaticNestedClass();

あなたの本当の質問:なぜあなたはそれのインスタンスを作成したいですか?どのクラスのインスタンスを作成するのと同じ理由で、必要な作業がいくつかあります。

6
追加された

このコードを混乱させることはありません。静的なネストされたクラスは、さらに別の名前空間を導入する単なる方法です。

静的ネストされたクラスを作成することで、外部クラスと内部クラスの間に非常に強い関係が表現されます。通常、ネストされたクラスはヘルパーまたは外部クラスの一部です。たとえば、 Tree クラスを作成する場合、 Node クラスはネストされた静的クラスの候補です。 Tree は、 Node クラスの目的を明確に説明しています。

実際、 static キーワードの使用は static フィールドと一貫しています。どちらの場合でも、 static エンティティには、囲むクラスのインスタンスなしでアクセスできます。 static クラスの場合、基本的には: "外部クラスのインスタンスを持たないこの静的入れ子クラスのインスタンスを作成できます"。デフォルトでは( static キーワードが使用されていない場合)、ネストされたクラスは内部クラスになります。この場合、単に次のように書くことはできません。

new OuterClass.StaticNestedClass();

その代わりに、 OuterClass インスタンスを、あいまいな構文で渡す必要があります。

OuterClass outerClassInstance = new OuterClass();
outerClassInstance.new InnerClass();

幸いにも、 OuterClass 本体の new InnerClass()内部で実行されている場合、 this は暗黙的に囲むインスタンスとして使用されます。

5
追加された
@ user1104888:あなたの問題に対処するために私の答えを更新しました。
追加された 著者 Tomasz Nurkiewicz,
@ user1104888あなたはこの文脈で static という単語の性質を誤解しているからです。あなたは静的なクラス変数を考えています - ここでクラス自体は静的ですが、クラスのインスタンスを作成するのとはまったく異なります。
追加された 著者 Dave Newton,
私はこの部分を理解しています。なぜなら、通常はC#でインスタンスを必要としない例では、静的クラスのインスタンスを作成するのはなぜか分かりません。ClassName.memberName
追加された 著者 Dmitry Berdnikov,
ありがとう、今私は誤解された単語 'statis'を参照してください。私はそれをC#の「静的」なものと考えることが多かったので、上記の例は無意味だと考えました。残念ながら、チュートリアルでは、この記事で最も重要な文章はありません。「外部クラスのインスタンスを持たずにこの静的ネストされたクラスのインスタンスを作成できます。
追加された 著者 Dmitry Berdnikov,

Javaの内部クラスでは、外部クラスのインスタンスへの暗黙の参照があります。こうすることで、外部クラスのメンバーに直接アクセスできます。これは、コールバックに使用されるアノニマスクラスで便利です。

class A{
   private int a = 3;
   class Inner{
      Inner(){

         System.out.println(a);//also A.this.a
      }
   }
   static class StaticInner{
       StaticInner(){
          System.out.println(a);//FAILS
       }

   }
}

内部クラスstaticを宣言すると、単にこの暗黙の参照が削除され、静的内部クラスと非静的内部クラスの唯一の違いになります。

1
追加された