怎么会在一个空引用调用(静态)方法不抛出NullPointerException?怎么会在一个空引用

2019-05-10 16:38发布

我用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 ,可是上面的程序不? 为什么是这样? 我不能正确理解的东西吗?

Answer 1:

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是至关重要的!)
  • 为什么不通过调用实例的方式静态方法的Java编译器错误?


Answer 2:

静态方法并不需要的对象的引用。 所以,你可以调用它甚至参照对象为null。 这方法是如何工作的主体。

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



Answer 3:

这是一个静态方法,它允许你调用它的方法,而不实例化一个实例。



Answer 4:

你应该打开你的IDE中的各种警告。 有可能到头来你会看到在非静态的方式访问静态成员警告。

你可以这样做(为什么)。测试(),它只是使用(为什么)(空),以获取类(空)。



Answer 5:

静态变量和方法与类相关联,而不是与任何对象。 所述类的每个实例共享一个类的变量,它是在存储器中的一个固定位置。

任何对象都可以改变类变量的值,但类变量也可以在不创建该类的一个实例,并且在同一申请静态方法操纵。 更多的是指这个 。



文章来源: How come invoking a (static) method on a null reference doesn't throw NullPointerException?