12
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();
   }
}

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

4

5 回答 5

22

它已被编译器优化掉,仅仅是因为不需要类的实例。编译器基本上取代了

csm.method();

经过

CallingStaticMethod.method();

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

于 2010-02-08T17:53:37.860 回答
3

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

实例.方法();

是相同的

类.方法();

于 2010-02-08T17:54:11.563 回答
1

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();
    }
}
于 2017-10-23T20:24:22.157 回答
0

好吧,这完全没问题。类 A 的对象实例没有访问静态方法。无论您通过类名或引用调用它,编译器都会通过类 java.lang.Class 的实例调用它。

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

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

希望这可以帮助。

于 2012-11-08T08:48:04.493 回答
0

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

要了解更多请点击这里...

于 2014-07-09T04:54:29.900 回答