2011-12-18 9 views
2

Javaチュートリアルは、静的な入れ子になったクラスが新しいEnclosingClassNameHere.StaticNestedClassNameHere(のような外側のクラスの名前を使用してアクセスされていることを言います)なぜJavaで静的クラスのインスタンスを作成したいのですか?

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

答えて

6

"static"は誤解を招く可能性があります。それが本当に意味するのは、クラスが独立して存在できるということです。非静的な内部クラスは、その内部クラスのインスタンスなしでは存在できません。

IMOの場合、自分のクラス以外の内部クラスを使用するときは、そのクラスを移動してそのクラスを独自のトップレベルクラスにすることを検討する必要があります。クラス間の関係が密接に結合されているため、内部クラスとして保持する必要があるケースはごくわずかです。あなたのコード例で

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

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

静的でない場合は、それを実行できませんでした。インスタンスStaticNestedClass()は、インスタンスOuterClassからのみ作成できます。

あなたは、独自の.javaファイルにそれを移動した場合、あなたはほぼ同じように扱うことができます:あなたの本当の問題に関しては

StaticNestedClass notNestedAnymore = new StaticNestedClass(); 

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

5

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

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

実際には、staticキーワードの使用方法はstaticフィールドと一致しています。どちらの場合も、囲みクラスのインスタンスを持たないstaticエンティティにアクセスできます。 staticクラスの場合、基本的には「外部クラスのインスタンスを持たずにこの静的ネストされたクラスのインスタンスを作成できます。デフォルトでは(staticキーワードを使用しない場合)、ネストされたクラスは内部クラスになります。この場合、あなたは、単に書くことはできません。代わりに、あなたは少しあいまいな構文でOuterClassインスタンスを渡すために必要とされる

new OuterClass.StaticNestedClass(); 

を:

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

幸いnew InnerClass()OuterClass体内を実行したときに、 thisは、囲むインスタンスとして暗黙的に使用されます。

+0

私はこの部分を理解しています。なぜなら、通常はC#でインスタンスを必要としない** static **クラスの**インスタンス**を作成する理由は分かりません。ClassName.memberName –

+0

@ user1104888なぜなら、この文脈では、単語「静的」の性質を誤解している。あなたは静的なクラス変数を考えています - ここでクラス自体は静的ですが、クラスのインスタンスを作成するのとはまったく異なります。 –

+0

@ user1104888:あなたの問題に対処するために私の答えを更新しました。 –

1

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 
     } 

    } 
} 

単にこの暗黙の参照を削除し、それは、静的および非静的内部クラスの唯一の違いです。

関連する問題