为什么在空引用上调用(静态)方法不会引发 NullPointerException?

2022-08-31 20:56:32

我用Java编写了这个程序

public class Why {

  public static void test() {
    System.out.println("Passed");
  }

  public static void main(String[] args) {
    Why NULL = null;
    NULL.test();
  }

}

我读到在对象上调用方法会导致,但上面的程序没有?这是为什么呢?难道我没有正确理解某些东西吗?nullNullPointerException


答案 1

test()是一种方法。成员属于该类型,不需要实例即可访问。staticstatic

只能通过类型表达式访问成员。也就是说,您应该按如下方式编写它:static

Why.test(); // always invoke static method on the type it belongs to!

Java确实允许您通过对象引用表达式访问成员,但这非常具有误导性,因为这不是成员访问的实际语义。staticstatic

Why aNull = null; 
aNull.test(); // DO NOT EVER DO THIS!
// invokes Why.test(), does NOT throw NullPointerException

通过对象引用表达式访问成员时,只有声明的引用类型才重要。这意味着:static

  • 引用是否实际存在并不重要,因为不需要实例null
  • 如果引用不是 ,则无论对象的运行时类型是什么,都没有动态调度!!!null

如您所见,在成员访问等两点上,情况恰恰相反。这就是为什么永远不应该以“非”方式访问成员的原因,因为它对它的实际操作给出了非常误导性的外观。staticstatic

相关问题


答案 2

静态方法不需要对对象的引用。因此,即使对对象的引用为 null,也可以将其称为 null。这就是主要方法的工作原理。

尝试从对象中删除静态指定以查看空指针异常。