静态上下文中的本地类实例创建表达式

时间:2015-01-07 08:04:55

标签: java class local-class

JLS 15.9.2告诉我们如何确定封闭实例: 设C是要实例化的类,让我成为正在创建的实例。

  

如果C是内部类,那么我可能会立即封闭   实例(第8.1.3节),确定如下:

     

[...]

     

如果C是本地类,则:

     
      
  • 如果C出现在静态上下文中,那么我没有立即封闭   实例

  •   
  • 否则,如果类实例创建表达式出现在中   静态上下文,然后发生编译时错误。

  •   
  • 否则,让O成为C的直接封闭类。让n为a   整数,使得O是第n个词汇封闭类型声明   类实例创建表达式出现的类。

  •   
     

i的直接封闭实例是词法上的第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
    }
}

DEMO

这有什么问题?你不能提供一个描述第二点的实际例子吗?

2 个答案:

答案 0 :(得分:1)

我想以下情况意味着:

public class A {

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

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

标记的行应该失败,因为内部类B不是静态的,所以它需要包含A的实例。没有这样的封闭实例,因为方法createB()是静态的。

更新:我误解了关于内部类的问题,这是我的例子所示。在本地类的上下文中,我也无法解释文档。

答案 1 :(得分:1)

您应该阅读以下两行:

  
      
  • 如果C出现在静态上下文中,那么我没有立即封闭的实例。

  •   
  • 否则,如果类实例创建表达式出现在静态上下文中,则会发生编译时错误。

  •   

您的情况是第一种情况 - 您在静态上下文中定义了类Foomain方法),因此实例f没有封闭实例。

但是,如果您在Foo方法之外定义了类main,并尝试在Foo方法中创建main的实例,除非您将Foo更改为静态类,否则您将收到错误。

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
    }
}