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();
}
}
有人可以解释如何在上面的代码中调用静态方法吗?
答案 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 ...