请看这段代码:
class Ideone
{
static int value = 3;
Ideone getIdeone()
{
System.out.println("getIdeone() called");
return null;
}
public static void main (String[] args) throws java.lang.Exception
{
Ideone ideone = new Ideone();
System.out.println(ideone.getIdeone().value);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
调用getIdeone()
3
Ideone链接在这里
正如你必须观察到的那样,我正在调用getIdeone()哪个返回null然后value从null对象获取.
这里发生了什么?编译器是否执行一些编译时优化并value直接从类中获取,原因是它是静态的吗?
Glo*_*del 10
因为value是一个static字段,所以不需要实例来访问它,因此null就足够了.它确实直接来自班级.
编译器已经警告过你:
应以静态方式访问静态字段Ideone.value
作为奖励练习,看看当涉及子类时会发生什么.底部的代码将给出这个输出:
在Test中调用getIdeone()
3
(所以没有 5),即使(在运行时)getIdeone()预期会返回一个Test.这是因为编译器已将其转换为对静态字段的调用Ideone- 在运行时发生的事情并不重要.
public class Ideone {
static final int value = 3;
Ideone getIdeone() {
System.out.println("getIdeone() called");
return null;
}
public static void main(String[] args) throws java.lang.Exception {
Ideone ideone = new Ideone().new Test();
System.out.println(ideone.getIdeone().value);
}
class Test extends Ideone {
static final int value = 5;
@Override
Test getIdeone() {
System.out.println("getIdeone() in Test called");
return null;
}
}
}
Run Code Online (Sandbox Code Playgroud)