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();
}
}
有人可以解释一下如何在上面的代码中调用静态方法吗?
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();
}
}
有人可以解释一下如何在上面的代码中调用静态方法吗?
它已被编译器优化掉,仅仅是因为不需要类的实例。编译器基本上取代了
csm.method();
经过
CallingStaticMethod.method();
一般来说,自己这样做也是一个好习惯。即使是普通的 IDE 也会警告您通过实例访问静态方法,至少 Eclipse 在这里会这样做。
Java 允许您使用 Class 实例来调用静态方法,但您不应混淆这种允许,就好像该方法将在用于调用它的实例上调用一样。
实例.方法();
是相同的
类.方法();
Java 语言规范说引用 get 被评估,然后被丢弃,然后静态方法被调用。
15.12.4.1。计算目标参考(如有必要)
这与使用this
引用调用静态方法时的行为相同。this
被评估然后被丢弃,然后调用该方法。
规范中甚至还有一个与您的示例类似的示例。
当一个目标引用被计算然后因为调用模式是静态的而被丢弃时,不会检查该引用以查看它是否为空:
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();
}
}
好吧,这完全没问题。类 A 的对象实例没有访问静态方法。无论您通过类名或引用调用它,编译器都会通过类 java.lang.Class 的实例调用它。
仅供参考,java中的每个类(上图中的CallingStaticMethod)都是类'java.lang.Class'的一个实例。并且无论何时定义一个类,实例都会被创建为 java.lang.Class CallingStaticMethod = new java.lang.Class();
因此该方法在“CallingStaticMethod”上被调用,因此不会发生空指针异常。
希望这可以帮助。
是的,我们可以。只有当我们使用空对象调用非静态方法时,它才会抛出NullPointerException 。如果方法是静态的,它将运行;如果方法是非静态的,它将通过NPE ...