使用null对象引用调用静态方法时会发生什么?

时间:2010-02-08 17:50:53

标签: java null static-methods

public class CallingStaticMethod {
public static void method() {
    System.out.println("I am in method");
}
public static void main(String[] args) {
    CallingStaticMethod csm = null;
    csm.method();
   }
}

有人可以解释如何在上面的代码中调用静态方法吗?

5 个答案:

答案 0 :(得分:22)

它已经被编译器优化掉了,因为没有必要拥有类的实例。编译器基本上替换

csm.method();

通过

CallingStaticMethod.method();

一般来说,这也是一个很好的做法。即使普通的IDE也会警告你通过实例访问静态方法,至少Eclipse会在这里做。

答案 1 :(得分:3)

Java允许您使用Class实例来调用静态方法,但是您不应该混淆这个容差,就像在用于调用它的实例上调用该方法一样。

instance.method();

相同

Class.method();

答案 2 :(得分:1)

java语言规范说引用get被评估,然后被丢弃,然后调用静态方法。
15.12.4.1. Compute Target Reference (If Necessary)

使用this引用调用静态方法时,这是相同的行为。 this得到评估然后丢弃然后调用该方法。

规范中甚至有一个类似于您的示例的示例。

  

当计算目标引用然后因为调用模式是静态而被丢弃时,不会检查引用以查看它是否为null:

class Test1 {
    static void mountain() {
        System.out.println("Monadnock");
    }
    static Test1 favorite(){
        System.out.print("Mount ");
        return null;
    }
    public static void main(String[] args) {
        favorite().mountain();
    }
}

答案 3 :(得分:0)

嗯这完全没问题。 A类的对象实例不访问静态方法。无论是通过类名还是引用调用它,编译器都将通过类java.lang.Class的实例调用它。

仅供参考,java中的每个类(上图中的CallingStaticMethod)都是类'java.lang.Class'的实例。无论何时定义类,实例都创建为java.lang.Class CallingStaticMethod = new java.lang.Class();

因此该方法在'CallingStaticMethod'上调用,因此不会发生空指针异常。

希望这有帮助。

答案 4 :(得分:0)

我们可以。 仅当我们使用 null 对象调用非静态方法时,它才会抛出 NullPointerException 。如果方法是静态的,它将运行&如果方法是非静态的,它将通过 NPE ...

To know more click here...