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
}
}
这有什么问题?你不能提供一个描述第二点的实际例子吗?
答案 0 :(得分:1)
我想以下情况意味着:
public class A {
public class B { /* ... */ }
public static void createB() {
new B(); // <<=== This should fail
}
}
标记的行应该失败,因为内部类B不是静态的,所以它需要包含A的实例。没有这样的封闭实例,因为方法createB()
是静态的。
更新:我误解了关于内部类的问题,这是我的例子所示。在本地类的上下文中,我也无法解释文档。
答案 1 :(得分:1)
您应该阅读以下两行:
如果C出现在静态上下文中,那么我没有立即封闭的实例。
否则,如果类实例创建表达式出现在静态上下文中,则会发生编译时错误。
您的情况是第一种情况 - 您在静态上下文中定义了类Foo
(main
方法),因此实例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
}
}