为什么对静态变量的非静态引用可编译?

时间:2013-05-29 22:20:54

标签: java syntax

假设我有以下代码:

public class Everything{
    public static int answer = 42;

    public int getAnswer(){
        return this.answer;
    }
}

从技术上讲,this.answer实际上并不存在,但编译器让我们发出警告。为什么我们不会收到编译错误?

2 个答案:

答案 0 :(得分:3)

this是对Everything实例的有效引用。因此,它是对Everything类的有效引用,因此是访问该类的任何静态成员和/或方法的有效方法。

你甚至可以这样做:

Everything nothing = null;
nothing.answer; // Does not throw an NPE!!

通常,这不是很好的做法......例如,IDEA会警告您“通过实例引用访问静态成员”。

答案 1 :(得分:0)

当加载Everything类时,所有静态块和静态变量按它们出现的顺序执行/初始化。因此,对静态变量的任何进一步引用都将参考那些。使用类名或实例从同一个类访问它们无关紧要。 (甚至是fge指出的空引用)