为什么在null引用上调用(静态)方法不会抛出NullPointerException?

为什么在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,但上面的程序没有?为什么是这样?我不正确地理解某事吗?


慕仙森
浏览 704回答 3
3回答

慕尼黑8549860

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 NullPointerExceptionstatic通过对象引用表达式访问成员时,只有声明的引用类型才对。这意味着:实际引用是否无关紧要null,因为不需要实例如果引用不是null,那么对象的运行时类型是什么并不重要,没有动态调度!正如您所看到的,对于实例成员访问,两个点上的确切对立都是正确的。这就是为什么static成员应该永远不要在一个“非访问static”的方式,因为它给了什么它实际上做一个非常误导的外观。相关问题为什么Java不允许覆盖静态方法?(理解this至关重要!)为什么不通过实例调用静态方法为Java编译器的错误?

守着一只汪

您应该在IDE中打开各种警告。您可能会看到有关以非静态方式访问静态成员的警告。您可以执行类似(Why)(null).test()的操作,它只使用(Why)(null)来获取类。

MMTTMM

静态方法不需要对对象的引用。所以你可以调用它甚至引用该对象为null。这就是主要方法的工作原理。尝试从对象中删除静态指定以查看空指针异常。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java