假设我有以下代码:为什么对静态变量的非静态引用可编译?
public class Everything{
public static int answer = 42;
public int getAnswer(){
return this.answer;
}
}
技术上来讲,this.answer
实际上并不存在,但是编译器让我们了与警告。为什么我们不会得到编译错误呢?
假设我有以下代码:为什么对静态变量的非静态引用可编译?
public class Everything{
public static int answer = 42;
public int getAnswer(){
return this.answer;
}
}
技术上来讲,this.answer
实际上并不存在,但是编译器让我们了与警告。为什么我们不会得到编译错误呢?
this
是对Everything
的实例的有效参考。因此,它是对Everything
类的有效参考,因此是访问该类的任何静态成员和/或方法的有效方法。
你甚至可以这样做:
Everything nothing = null;
nothing.answer; // Does not throw an NPE!!
一般来说,这不是很好的做法... IDEA,例如,会警告你,你“通过一个实例引用访问静态成员”。
当加载Everything类时,所有的静态块和静态变量都按它们出现的顺序执行/初始化。所以对静态变量的任何进一步的引用都会引用这些。使用类名或实例从同一个类访问它们并不重要。 (甚至fge指出的空引用)
您的IDE很可能会显示警告。 *通过实例引用*或类似的东西访问静态成员。 – maba
它们是可编译的,因为规范说它是允许的。还有什么其他原因? – dlev