Java 为什么我可以用静态方法打印此字段?
我正在使用Eclipse开普勒和JRE 7 在Java 为什么我可以用静态方法打印此字段?,java,eclipse,anonymous-class,Java,Eclipse,Anonymous Class,我正在使用Eclipse开普勒和JRE 7 在buildRunner方法中-为什么我能够看到Main的this?在静态方法中,Main的“this”是什么?为什么要编译 只有当value是最终值时,我才能这样做。我不能调用Main和stuff的实例方法,但value不是seattredstatic!此外,如果我想在buildRunner方法中使用,在new Runnable的run方法之外,编译器会阻止我这样做。表示“形式TypeName的表达式的值。这是这个的第n个词汇封闭实例。”。由于示例中
buildRunner
方法中-为什么我能够看到Main的this
?在静态方法中,Main的“this”是什么?为什么要编译
只有当value
是最终值时,我才能这样做。我不能调用Main和stuff的实例方法,但value不是seattredstatic
!此外,如果我想在buildRunner
方法中使用,在new Runnable
的run
方法之外,编译器会阻止我这样做。表示“形式TypeName的表达式的值。这是这个的第n个词汇封闭实例。”。由于示例中没有Main的封闭实例,因此代码无效
在javac中,代码生成错误“非静态变量此
不能从静态上下文引用”。它在Eclipse中编译的事实似乎是Eclipse中一个模糊的bug(Eclipse有自己的编译器)。您确定这段代码可以编译吗?javac不会编译它(Main.java:9:error:non-static variable这不能从静态上下文引用)中的代码无效。看起来像Eclipse编译器中的一个bug。您不是。这甚至不会编译。使用此内部运行方法将指向Runnableobject@user3580294在它报告的错误不仅仅是复杂的。它运行并输出3。@George只是一个糟糕的优化,它错误地用编译时常量替换了不可访问的最终字段。@George-这毫无意义。修复代码,以便可以从命令行进行编译。然后运行它,如果有任何错误,那么您可以回来问一个有效的问题。我强烈建议您习惯从命令行编译。命令行从不说谎;)除此之外,Boann的帖子应该被接受为答案(因为它确实回答了为什么您的代码“看到”了静态方法中的引用)。@ChiefTwoPencils这是一个bug,尽管它可能是由优化尝试引起的。如果它打算工作,那么Main.this.value
也应该可以从Main
的静态方法中读取,而无需将表达式包装到内部Runnable
,但是如果您尝试这样做,Eclipse会说:“不能在静态上下文中使用this
”。
public class Main {
private final int value = 3;
public static Runnable buildRunner() {
return new Runnable() {
@Override
public void run() {
System.out.println(Main.this.value);
}
};
}
}