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

How come invoking a (static) method on a null reference doesn't throw NullPointerException?

提问人:Artjem 提问时间:7/21/2010 最后编辑:polygenelubricantsArtjem 更新时间:11/22/2017 访问量:11402

问:

我用Java写了这个程序

public class Why {

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

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

}

我读到在对象上调用方法会导致,但上面的程序没有?为什么会这样?我是否理解不正确?nullNullPointerException

java static null nullpointerexception

评论

1赞 7/21/2010
一旦 Java 解释器加载了类,就会创建一个静态成员变量,并且初始化也在此时完成。
6赞 polygenelubricants 7/21/2010
由于您正在学习,因此您应该熟悉编码约定: java.sun.com/docs/codeconv/html/CodeConventions.doc8.html :具体来说,全大写名称是为常量保留的。
1赞 polygenelubricants 7/21/2010
...尽管我想这可能是您首先的意图,因为您可能希望始终如此,在这种情况下,您可能想了解关键字以及它对字段与局部变量(以及类和方法)的含义。NULLnullfinal
0赞 Not a bug 1/15/2014
在这里,您可以找到 static 的编译器级实现。stackoverflow.com/q/21037406/1686291
1赞 Abdul Mohsin 12/12/2017
我喜欢它Why NULL = null;

答:

81赞 polygenelubricants 7/21/2010 #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

相关问题

4赞 Vlad 7/21/2010 #2

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

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

3赞 JohnFx 7/21/2010 #3

它是一个静态方法,允许您在不实例化实例的情况下调用方法。

3赞 MrJacqes 7/21/2010 #4

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

你可以做类似 (Why)(null).test() 的事情,它只使用 (Why)(null) 来获取类。

评论

4赞 siegi 7/25/2012
(Why)(null)是无效的 Java 语法。正确的语法是 。:-)((Why) null)
1赞 Rupesh Yadav 10/17/2013 #5

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

任何对象都可以更改类变量的值,但类变量也可以在不创建类实例的情况下进行操作,这同样适用于静态方法。 有关更多信息,请参阅此