2

JLS 15.9.2は、囲んでいるインスタンスを決定する方法を教えてくれます。インスタンス化されるクラスを C とし、作成されるインスタンスを i とします。

C が内部クラスの場合、i は次のように決定される、すぐに囲んでいるインスタンス (§8.1.3) を持つことができます。

[...]

C がローカル クラスの場合、次のようになります。

  • C が静的コンテキストで発生する場合、 i にはすぐに囲んでいるインスタンスはありません。

  • それ以外の場合、クラス インスタンス作成式が 静的コンテキストで発生すると、コンパイル時エラーが発生します。

  • それ以外の場合は、O を C のすぐ外側のクラスとします。n を整数とし、O が、クラス インスタンス作成式が現れるクラスの n 番目の語彙的に外側を囲む型宣言になるようにします。

i のすぐ外側のインスタンスは、this の n 番目の字句的に外側のインスタンスです。

太字のケースの意味がわかりませんでした。コンパイルされるべきではなかった例を挙げましょう。

class A{
    int a;
    public static void main (String[] args) throws java.lang.Exception{
        class Foo{
            void bar(){
            }
        }
        Foo f = new Foo(); //Instance creation expression occured in the static context
    }
}

デモ

それの何がいけないの?2番目のポイントを説明する実際の例を提供できませんか?

4

2 に答える 2

0

私は次の場合を意味していると思います:

public class A {

   public class B { /* ... */ }

   public static void createB() {
      new B();  // <<=== This should fail
   }
}

内部クラス B は静的ではないため、マークされた行は失敗するはずです。したがって、A の囲みインスタンスが必要です。メソッドcreateB()が静的であるため、そのような囲みインスタンスはありません。

更新:私は一般的に内部クラスに関する質問を間違えました。これは私の例が示すものです。ローカル クラスのコンテキストでは、ドキュメントも解釈できません。

于 2015-01-07T08:12:12.560 に答える
0

次の 2 行を読む必要があります。

  • C が静的コンテキストで発生する場合、 i にはすぐに囲んでいるインスタンスはありません。

  • それ以外の場合、クラス インスタンス作成式が静的コンテキストで発生すると、コンパイル時エラーが発生します。

あなたのケースは最初のケースです - クラスFooを静的コンテキスト (mainメソッド) で定義したため、インスタンスfにはそれを囲むインスタンスがありません。

Fooただし、メソッドの外側でクラスを定義し、mainメソッド内で のインスタンスを作成しようとすると、静的クラスに変更しない限り、エラーが発生します。FoomainFoo

class A
{
    int a;
    class Foo
    {
        void bar()
        {
        }
    }
    public static void main (String[] args) throws java.lang.Exception
    {
        Foo f = new Foo(); // this should fail
    }
}
于 2015-01-07T08:12:41.533 に答える