提问人:Artjem 提问时间:7/21/2010 最后编辑:polygenelubricantsArtjem 更新时间:11/22/2017 访问量:11402
为什么在 null 引用上调用(静态)方法不会引发 NullPointerException?
How come invoking a (static) method on a null reference doesn't throw 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
答:
81赞
polygenelubricants
7/21/2010
#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 编译器来说不是错误?
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
静态变量和方法与类相关联,而不是与任何对象相关联。类的每个实例共享一个类变量,该变量位于内存中的一个固定位置。
任何对象都可以更改类变量的值,但类变量也可以在不创建类实例的情况下进行操作,这同样适用于静态方法。 有关更多信息,请参阅此。
评论
NULL
null
final
Why NULL = null;