我用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
成员所属的类型,并且不需要一个实例来访问。
甲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编译器错误?
静态方法并不需要的对象的引用。 所以,你可以调用它甚至参照对象为null。 这方法是如何工作的主体。
尝试从对象中删除指定静态看空指针异常。
这是一个静态方法,它允许你调用它的方法,而不实例化一个实例。
你应该打开你的IDE中的各种警告。 有可能到头来你会看到在非静态的方式访问静态成员警告。
你可以这样做(为什么)。测试(),它只是使用(为什么)(空),以获取类(空)。
静态变量和方法与类相关联,而不是与任何对象。 所述类的每个实例共享一个类的变量,它是在存储器中的一个固定位置。
任何对象都可以改变类变量的值,但类变量也可以在不创建该类的一个实例,并且在同一申请静态方法操纵。 更多的是指这个 。
文章来源: How come invoking a (static) method on a null reference doesn't throw NullPointerException?