为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕仙森 2019-07-27 10:52:36
为什么在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,但上面的程序没有?为什么是这样?我不正确地理解某事吗?
查看完整描述

3 回答

?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

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”的方式,因为它给了什么它实际上做一个非常误导的外观。

相关问题


查看完整回答
反对 回复 2019-07-27
?
守着一只汪

TA贡献1872条经验 获得超3个赞

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

您可以执行类似(Why)(null).test()的操作,它只使用(Why)(null)来获取类。


查看完整回答
反对 回复 2019-07-27
?
MMTTMM

TA贡献1869条经验 获得超4个赞

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

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


查看完整回答
反对 回复 2019-07-27
  • 3 回答
  • 0 关注
  • 703 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信