如何调用一个空引用(静态)方法不会抛出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
,但上述程序不? 为什么是这样? 我不正确地理解一些东西吗?
test()
是一个static
方法。 static
成员属于该types,不需要实例访问。
一个static
成员只能通过一个typesexpression式来访问。 那就是,你应该写下如下:
Why.test(); // always invoke static method on the type it belongs to!
Java确实允许你通过一个对象引用expression式来访问一个static
成员,但这是非常令人误解的,因为这不是 static
成员访问的实际语义。
Why aNull = null; aNull.test(); // DO NOT EVER DO THIS! // invokes Why.test(), does NOT throw NullPointerException
当通过对象引用expression式访问static
成员时,只有引用的声明types很重要。 这意味着:
- 引用实际上是
null
没关系,因为不需要实例 - 如果引用不为
null
,那么对象的运行时types是什么并不重要, 不存在dynamic调度 !
正如你所看到的,对于实例成员访问来说,两个点上的确切相反点都是正确的。 这就是为什么static
成员不应该以“非static
”的方式被访问,因为它会给它的实际操作带来一个非常误导的外观。
相关问题
- 为什么Java不允许重写静态方法? (了解
this
一点至关重要!) - 为什么不通过Java编译器的错误实例调用静态方法?
静态方法不需要对该对象的引用。 所以你可以调用它甚至引用该对象为null。 这就是主要方法的工作原理。
尝试从对象中删除静态指定以查看空指针exception。
这是一个静态方法,它允许你调用方法而不用实例化一个实例。
您应该打开IDE中的各种警告。 您将有机会以非静态方式看到有关访问静态成员的警告。
你可以做一些像(Why)(null).test(),它只使用(Why)(null)来获得类。
静态variables和方法与类关联,而不是与任何对象关联。 每个类的实例共享一个类variables,它位于内存中的一个固定位置。
任何对象都可以改变类variables的值,但是也可以在不创build类的实例的情况下操作类variables,同样适用于静态方法。 更多的参考这一点 。