我只是和我的朋友讨论使用类名调用静态方法,并尝试了这段代码,并期望它在运行时抛出 NPE。但事实证明它没有作用。我只是想了解执行顺序。
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
}
}
我知道静态方法应该使用它们的类名来调用,我什至知道当我们使用实例调用静态方法时,IDE 会发出编译器警告。但我们也可以通过创建实例来调用它们,但是,我从未在这里创建过实例,o
应该得到它的默认值 null,从而调用o.method()
应该在运行时抛出 NPE,但事实并非如此。你们能解释一下这段代码中的执行顺序吗?
它之所以有效,是因为重要的是编译时类型 of the o
场地。编译器会编译o.method()
到相同的字节码One.method()
.
特别是,如果您有课Two
延伸One
,并且都声明一个static void method()
, then
One x = new Two();
x.method(); // calls One.method(), not Two.method()
有利于混淆目的,但不太利于可维护性......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)