意外行为 - java是否在这里执行编译时优化?

Gre*_*lin 3 java static

请看这段代码:

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)