2017-08-17 2 views
0

私は、次のインスタンス化はコンパイルされません理由を理解するのが大好きだ:Javaオブジェクトのインスタンス - これで間違って何:

Superclass.Subclass myObject = new Superclass.Subclass(); 

エラーメッセージが読み:

意味する何
No enclosing instance of type Superclass is accessible. Must qualify the allocation with an enclosing instance of type Superclass (e.g. x.new A() where x is an instance of Superclass). 

をインスタンスを囲むことによって?なぜこれが必要ですか?

このメッセージは、構文がなければならないことを述べているようだ:

Superclass mySuperObj = new Superclass(); 
Superclass.Subclass mySubObj = mySuperObj.new Subclass(); 

が、それは私の方法か、なぜこの代替構文を使用しなければならないと間違っているかを説明するために失敗しました。

+0

ここで、スーパークラスを宣言するコードは次のとおりです。サブクラス?あなたは[mcve]を投稿するべきです - あなたのケースでは、** Complete **のCに焦点を当てるべきです。 –

答えて

2

new [enclosing class].[enclosed class](...)イディオムは、静的ネストされたクラス、つまり囲むクラスのメンバーとしてstaticとして宣言されたネストされたクラスを初期化するために使用されます。

イディオムは、内部クラス、つまりのインスタンスで囲まれたクラスのメンバーとして宣言されたネストされたクラスを初期化するために使用されます。

例で

...

class A { 
    static class B {} 
    class C {} 
} 

あなたが使用します。

  • new A.B()
  • new A().new C()、またはaと呼ばれるAの特定のインスタンスで、
  • ​​

  • は、内部クラスのオブジェクトを作成するための構文は

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

    NOTあるdocumentation

+0

ありがとう、メナ。あなたの例は、シナリオごとに異なるイディオムを使用しなければならないことを示しています。しかし、なぜ2つの異なるイディオムがなければならないのですか?どちらの状況でも最初のイディオムを使用できないのはなぜですか?それは私には分かりません。 – IqbalHamid

+0

@IqbalHamidようこそ。構文は任意の構成です。この場合、静的メンバーとインスタンスメンバーアクセスを区別する他のイディオムと一貫していますが。これらは非常に異なるコンテキストなので、順番にJavaで必要です。 – Mena

0

を参照してください。

Superclass.Subclass myObject = new Superclass.Subclass(); 

ので: InnerClassのインスタンスのみOuterClassのインスタンス内に存在することができます。

内部クラスをインスタンス化するには、まず外部クラスをインスタンス化する必要があります。次に、この構文で外部オブジェクト内の内側のオブジェクトを作成しますので....あなたの代わりに、サブクラスから話が、内部クラスいけない。この場合、

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

Read Java Docs for more details

0

を、この場合、内部クラスのインスタンスを作成するには、外部クラスのインスタンスが必要です。

public class Foo { 

    public static void main(String[] args) { 
     Foo myFooObject = new Foo(); 
     Foo.InnerClass myFooInnerClass = myFooObject.new InnerClass(); 
     System.out.println(myFooObject); 
     System.out.println(myFooInnerClass); 
    } 

    class InnerClass { 
     @Override 
     public String toString() { 
      return "Am inner class"; 
     } 
    } 
} 
関連する問題