Java 静态上下文中的本地类实例创建表达式
说明如何确定封闭实例: 让C成为被实例化的类,让我成为被创建的实例 如果C是一个内部类,那么我可以有一个直接封闭的 实例(§8.1.3),确定如下: [……] 如果C是本地类,则:Java 静态上下文中的本地类实例创建表达式,java,class,local-class,Java,Class,Local Class,说明如何确定封闭实例: 让C成为被实例化的类,让我成为被创建的实例 如果C是一个内部类,那么我可以有一个直接封闭的 实例(§8.1.3),确定如下: [……] 如果C是本地类,则: 如果C出现在静态上下文中,那么我没有立即封闭 例如 否则,如果类实例创建表达式出现在 静态上下文,则发生编译时错误。 否则,设O为C的直接封闭类。设n为 整数,使得O是第n个词汇性封闭类型声明 类实例创建表达式出现在其中的类的 紧随其后的i实例在词汇上是第n个 封闭的实例 我不明白黑体字的意思。让我举一个我不应该
- 如果C出现在静态上下文中,那么我没有立即封闭 例如
- 否则,如果类实例创建表达式出现在 静态上下文,则发生编译时错误。
- 否则,设O为C的直接封闭类。设n为 整数,使得O是第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
}
}
怎么了?你不能提供一个实际的例子来描述第二点吗?我想下面的例子是指:
public class A {
public class B { /* ... */ }
public static void createB() {
new B(); // <<=== This should fail
}
}
公共A类{
公共类B{/*…*/}
公共静态void createB(){
新建B();//您应该阅读以下两行:
- 如果C出现在静态上下文中,那么我没有立即封闭的实例
- 否则,如果类实例创建表达式发生在静态上下文中,则会发生编译时错误
您的案例是第一个案例-您在静态上下文中定义了类Foo
(main
方法),因此实例f
没有封闭实例
但是,如果您在main
方法之外定义类Foo
,并尝试在main
方法中创建Foo
的实例,则会出现错误,除非将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
}
}
但是Foo不是一个本地类。引用的是本地类。此外,没有任何关于在中定义的另一个类的直接内部类的内容,但是B类不是本地类。我以为标记的行是在谈论完全本地类。好吧,我放弃了。我也不知道那句话的意思。我不得不d问题是,当本地类的声明发生在非静态上下文中时,怎么可能将类的实例创建表达式嵌入到静态上下文中呢?