JLS 15.9.2告诉我们如何确定封闭实例:让C成为被实例化的类,让i成为被创建的实例。
如果C是一个内部类,那么我可能有一个直接封闭的实例(§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
}
}
演示
怎么了?你不能提供一个实际的例子来描述第二点吗?
我猜下面的例子是指:
public class A {
public class B { /* ... */ }
public static void createB() {
new B(); // <<=== This should fail
}
}
标记的行应该失败,因为内部类B不是静态的,所以它需要一个封闭的实例。没有这样的封闭实例,因为方法createB()
是静态的。
更新:我误解了关于内部类的问题,这就是我的例子所展示的。在本地类的上下文中,我也不能解释留档。
你应该读这两行:
>
如果C出现在静态上下文中,则i没有立即包含的实例。
否则,如果类实例创建表达式发生在静态上下文中,则会发生编译时错误。
您的案例是第一个案例-您在静态上下文中定义了类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
}
}
问题内容: 尝试将Edge类(子类?)的新实例添加到我的arraylist时,出现“无法从静态上下文引用的非静态变量”错误。我不知道我在做什么错! 问题答案: 您需要创建嵌套类: 否则,嵌套类将保持非静态,这意味着它将保留对其外部类实例的引用。因此,只有实例方法或您可以访问外部类实例的其他地方才能实例化内部类。 通常,公共静态类是顶级类的理想候选者。唯一的例外是,当他们将自己的外部类与外部类联系在
当我尝试将 Edge 类(子类?)的新实例添加到我的数组列表中时,我收到“无法从静态上下文中引用的非静态变量”错误。我不知道我做错了什么!
静态在下面有意义吗(我来自Java背景)?它会编译,但惯例/标准是什么?
问题内容: 这个问题已经在这里有了答案 : 7年前关闭。 可能重复: 为什么我会得到“无法从静态上下文引用的非静态变量”? 这是代码 错误说: 非静态类 Node 不能从静态上下文中引用 为什么不应该在main()方法中引用Node类? 问题答案: Java中的非静态嵌套类包含对父类 实例 的隐式引用。因此,要实例化a ,您还需要具有一个实例。在静态上下文(主要方法)中,没有要引用的实例。因此,编
根据JLS §8.1.3,为什么Java不允许在内部类中建立静态上下文?
我有以下代码: 当我尝试编译它时,会出现以下错误: 因此,我尝试使dbConnect静态如下: