2013-05-29 41 views
0

假设我有以下代码:为什么对静态变量的非静态引用可编译?

public class Everything{ 
    public static int answer = 42; 

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

技术上来讲,this.answer实际上并不存在,但是编译器让我们了与警告。为什么我们不会得到编译错误呢?

+0

您的IDE很可能会显示警告。 *通过实例引用*或类似的东西访问静态成员。 – maba

+0

它们是可编译的,因为规范说它是允许的。还有什么其他原因? – dlev

回答

3

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

你甚至可以这样做:

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

一般来说,这不是很好的做法... IDEA,例如,会警告你,你“通过一个实例引用访问静态成员”。

+0

我绝对同意,没有人应该写这样的代码。我想我只是总是将一个类的实例和类本身视为完全不同的构造。我认为类和类实例之间的界限可以被模糊化,但是只有在编写可怕的代码时才真的很奇怪。 – CodeBlind

+0

@BenLawry将此行为与C#进行对比,在该实例变量上调用静态方法是编译时错误。 – dlev

0

当加载Everything类时,所有的静态块和静态变量都按它们出现的顺序执行/初始化。所以对静态变量的任何进一步的引用都会引用这些。使用类名或实例从同一个类访问它们并不重要。 (甚至fge指出的空引用)

相关问题