为什么这段代码不会抛出NullPointerException

Per*_*ror 12 java static static-methods classloader

我刚刚与我的朋友讨论了使用类名调用静态方法,并尝试了这个代码并期望它在运行时抛出NPE.但事实证明它是dint.我只是想了解执行顺序.

public class One {

    public static void method() {
        System.out.println("in static one");
    }
}

public class Two {

    static One o;

    public static void main(String[] args) {
        o.method(); // expected NPE here, as o is null
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道静态方法应该用它们的类名调用,我甚至知道当我们用实例调用静态方法时IDE会给出编译器警告.但我们也可以通过创建一个实例来调用它们,但是,我从来没有在这里创建过一个实例,o应该得到它的默认值null,因此调用o.method()应该在运行时抛出一个NPE,但事实并非如此.你们能否详细说明这段代码中的执行顺序.

Ian*_*rts 7

它的工作原理,因为重要的是在编译时类型的的o领域.编译器将编译o.method()为相同的字节代码One.method().

特别是,如果你有一个Two扩展的类One,并且都声明了a static void method(),那么

One x = new Two();
x.method(); // calls One.method(), not Two.method()
Run Code Online (Sandbox Code Playgroud)

适用于混淆目的,不太适合可维护性......


Ste*_*Kuo 6

method是静态的,所以它不关心One实例.

One o = null;
o.method();
Run Code Online (Sandbox Code Playgroud)

是相同的:

One.method();
Run Code Online (Sandbox Code Playgroud)