我用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
,但上述程序却没有?为什么是这样?我不正确地理解某事吗?
答案 0 :(得分:78)
test()
是一种static
方法。 static
成员属于该类型,不需要实例访问。
static
成员应仅通过类型表达式访问。也就是说,您应该按如下方式编写它:
Why.test(); // always invoke static method on the type it belongs to!
Java允许您通过对象引用表达式访问static
成员,但是
这是非常误导,因为这是 NOT static
成员访问的实际语义。
Why aNull = null;
aNull.test(); // DO NOT EVER DO THIS!
// invokes Why.test(), does NOT throw NullPointerException
通过对象引用表达式访问static
成员时,只有声明的引用类型才对。这意味着:
null
并不重要,因为不需要实例null
,那么对象的运行时类型是什么并不重要,没有动态调度 !!! 正如您所看到的,对于实例成员访问,两个点上的确切对立都是正确的。这就是为什么static
成员应该以“非static
”方式访问从不的原因,因为它会对其实际行为产生非常误导性的外观。
答案 1 :(得分:3)
静态方法不需要对对象的引用。所以你可以调用它甚至引用该对象为null。这就是主要方法的工作原理。
尝试从对象中删除静态指定以查看空指针异常。
答案 2 :(得分:3)
这是一个静态方法,它允许您在不实例化实例的情况下调用方法。
答案 3 :(得分:3)
您应该在IDE中打开各种警告。您可能会看到有关以非静态方式访问静态成员的警告。
您可以执行类似(Why)(null).test()的操作,它只使用(Why)(null)来获取类。
答案 4 :(得分:1)
静态变量&方法与类相关联,而不是与任何对象相关联。该类的每个实例共享一个类变量,该变量位于内存中的一个固定位置。
任何对象都可以更改类变量的值,但是也可以在不创建类的实例的情况下操作类变量,同样适用于静态方法。 更多refer this。