为什么在null引用上调用(静态)方法不会抛出NullPointerException?我用Java编写了这个程序public class Why {
public static void test() {
System.out.println("Passed");
}
public static void main(String[] args) {
Why NULL = null;
NULL.test();
}}我读到调用一个null对象的方法导致NullPointerException,但上面的程序没有?为什么是这样?我不正确地理解某事吗?
3 回答
慕尼黑8549860
TA贡献1818条经验 获得超11个赞
test()
是一种static
方法。一个static
成员所属的类型,并且不需要一个实例来访问。
甲static
构件应该仅可以经由型表达访问。也就是说,您应该按如下方式编写:
Why.test(); // always invoke static method on the type it belongs to!
Java允许您static
通过对象引用表达式访问成员,但这是非常误导的,因为这不是static
成员访问的实际语义。
Why aNull = null; aNull.test(); // DO NOT EVER DO THIS!// invokes Why.test(), does NOT throw NullPointerException
static
通过对象引用表达式访问成员时,只有声明的引用类型才对。这意味着:
实际引用是否无关紧要
null
,因为不需要实例如果引用不是
null
,那么对象的运行时类型是什么并不重要,没有动态调度!
正如您所看到的,对于实例成员访问,两个点上的确切对立都是正确的。这就是为什么static
成员应该永远不要在一个“非访问static
”的方式,因为它给了什么它实际上做一个非常误导的外观。
相关问题
为什么Java不允许覆盖静态方法?(理解
this
至关重要!)
守着一只汪
TA贡献1872条经验 获得超3个赞
您应该在IDE中打开各种警告。您可能会看到有关以非静态方式访问静态成员的警告。
您可以执行类似(Why)(null).test()的操作,它只使用(Why)(null)来获取类。
添加回答
举报
0/150
提交
取消