如何调用一个空引用(静态)方法不会抛出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 ,但上述程序不? 为什么是这样? 我不正确地理解一些东西吗?

test()是一个static方法。 static成员属于该types,不需要实例访问。

一个static成员只能通过一个typesexpression式来访问。 那就是,你应该写下如下:

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

Java确实允许你通过一个对象引用expression式来访问一个static成员,但这是非常令人误解的,因为这不是 static成员访问的实际语义。

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

当通过对象引用expression式访问static成员时,只有引用的声明types很重要。 这意味着:

  • 引用实际上是null没关系,因为不需要实例
  • 如果引用不为null ,那么对象的运行时types是什么并不重要, 不存在dynamic调度

正如你所看到的,对于实例成员访问来说,两个点上的确切相反点都是正确的。 这就是为什么static成员不应该以“非static ”的方式被访问,因为它会给它的实际操作带来一个非常误导的外观。

相关问题

  • 为什么Java不允许重写静态方法? (了解this一点至关重要!)
  • 为什么不通过Java编译器的错误实例调用静态方法?

静态方法不需要对该对象的引用。 所以你可以调用它甚至引用该对象为null。 这就是主要方法的工作原理。

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

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

您应该打开IDE中的各种警告。 您将有机会以非静态方式看到有关访问静态成员的警告。

你可以做一些像(Why)(null).test(),它只使用(Why)(null)来获得类。

静态variables和方法与类关联,而不是与任何对象关联。 每个类的实例共享一个类variables,它位于内存中的一个固定位置。

任何对象都可以改变类variables的值,但是也可以在不创build类的实例的情况下操作类variables,同样适用于静态方法。 更多的参考这一点 。