web-dev-qa-db-ja.com

静的にネストされたクラスオブジェクトのインスタンス化が許可されるのはなぜですか?

Java言語Androidアプリケーション開発のための言語を学び始めました。

静的クラスに基づく私の理解によれば、静的クラスのオブジェクトをインスタンス化することはできません。

しかし、静的ネストされたクラスオブジェクトのインスタンス化が次の状況で許可されるのはなぜですか?

class EnclosingClass 
{     
      //...     
      class static StaticInnerClass 
      {         
          //...     
      } 
} 

静的としてマークされている場合、なぜ内部クラスのオブジェクトを作成できるのですか?

EnclosingClass.StaticInnerClass s = new EnclosingClass.StaticInnerClass()
21
Parag Meshram

静的クラスに基づく私の理解によれば、静的クラスのオブジェクトをインスタンス化することはできません。

「静的クラス」の意味についてのあなたの理解は正しくありません。基本的に、Javaの「静的クラス」は、含まれているクラスのインスタンスへの暗黙の参照を持たないネストされたクラスです。特に以下の詳細については、 JLSのセクション8.5.1 を参照してください。

Staticキーワードは、非内部クラスまたはインターフェイスTの本体内のメンバータイプCの宣言を変更する場合があります。その効果は、Cが内部クラスではないことを宣言することです。 Tの静的メソッドの本体にTの現在のインスタンスがないのと同様に、CにもTの現在のインスタンスがなく、字句的に囲むインスタンスもありません。

おそらく、完全に異なるC#の静的クラスについて考えていたのでしょうか。

27
Jon Skeet

静的としてマークされている場合、なぜ内部クラスのオブジェクトを作成できるのですか?

次に、staticコンテキストでnested classを使用する必要がある場合があります。

public class Test {

    public static void main(String args[]) {
        InnerClass innerClass = new InnerClass();
    }

    class InnerClass {

    }
}  

この場合、innerClassをインスタンス化しようとすると、エラーが発生します:

タイプTestの囲んでいるインスタンスにアクセスできません。タイプTestの囲んでいるインスタンスで割り当てを修飾する必要があります(例:x.new A()ここで、xはTestのインスタンスです)。

これを回避するには、タイプTestのオブジェクトをインスタンス化し、そこからinnerClassのインスタンスを作成します。

Test test = new Test();
InnerClass innerClass = test.new InnerClass();

または、innerClassも静的として宣言し、静的コンテキストでインスタンス化します。

public class Test {

    public static void main(String args[]) {
        InnerClass innerClass = new InnerClass();
    }

    static class InnerClass {

    }
}
1
Alessandro

それをチェックしてください、多分それはあなたを助けることができます ネストされたクラス

0
Alex Muni