The JLS 15.9.2告诉我们如何确定封闭实例:
令 C 为正在实例化的类,并令 i 为正在创建的实例。
如果 C 是一个内部类,那么我可能有一个直接封闭的
实例(§8.1.3),确定如下:
[...]
如果 C 是本地类,则:
如果 C 出现在静态上下文中,则 i 没有立即包围
实例。
否则,如果类实例创建表达式出现在
静态上下文,然后会发生编译时错误。
否则,令 O 为 C 的直接封闭类。令 n 为
使得 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
这有什么问题吗?你不能提供一个实际的例子来描述第二点吗?
您应该阅读这两行:
您的情况是第一种情况 - 您定义了该类Foo
在静态上下文中(main
方法),因此实例f
没有封闭实例。
但是,如果您定义该类Foo
之外的main
方法,并尝试创建实例Foo
in the 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
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)