Java 为什么我可以用静态方法打印此字段?

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个词汇封闭实例。”。由于示例中

我正在使用Eclipse开普勒和JRE 7

buildRunner
方法中-为什么我能够看到Main的
this
?在静态方法中,Main的“this”是什么?为什么要编译

只有当
value
是最终值时,我才能这样做。我不能调用Main和stuff的实例方法,但value不是seattred
static
!此外,如果我想在
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);
            }
        };

    }
}