我们可以在Java中使用null对象调用静态方法吗?如果是这样,怎么样?

时间:2014-07-17 09:54:16

标签: java static

由于可以直接从类中调用静态方法(即ClassName.methodName),为什么需要使用类的对象调用静态方法?

如果有人知道,请举例说明。

public static void methodA(){

}

4 个答案:

答案 0 :(得分:16)

以下代码包含一个示例,其中通过null引用调用静态方法。

public class Test {
    public static void main(String... args) {
        Test test = null;
        test.greeting(); // call with null reference
    }
    public static void greeting() {
        System.out.println("Hello World");
    }
}

由于Test::greeting是静态方法,因此表达式test.greeting()Test.greeting()相同。因此,运行时没有抛出NullPointerException

答案 1 :(得分:9)

调用静态成员或方法时不需要实例。

由于静态成员属于类而不是实例。

Example 15.11.1-2. Receiver Variable Is Irrelevant For static Field Access

  

以下程序演示了可以使用null引用来访问类(静态)变量而不会导致异常:

自我规范的例子。

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

分析其发生的原因

  

即使favorite()的结果为null,也不会抛出NullPointerException。那" Mount"打印显示主表达式确实在运行时完全评估,尽管事实上只使用其类型而不是其值来确定要访问的字段(因为字段山是静态的)。

答案 2 :(得分:5)

很好,您可以使用null对象调用静态方法。

请参阅下面的示例。

public class Hashing {

    public static void Hash() {
        System.out.println("hello");
    }

    public static void main(String[] args) {
        Hashing h = null;
        h.Hash();
    }
}

上面的代码段将打印 hello

因为在编译时h.hash()将转换为Hashing.hash(),因为hash()静态方法。

当我解编译.class文件时,我得到了这段代码。

/*
 * Decompiled with CFR 0_114.
 */
import java.io.PrintStream;

public class Hashing {
    public static void Hash() {
        System.out.println("hello");
    }

    public static void main(String[] args) {
        Object h = null;
        Hashing.Hash();
    }
}

正如您在上面的摘录中看到的h.Hash();转换为Hashing.Hash();

HTH !!

答案 3 :(得分:0)

是的,这是一种奇怪的情况。以下是示例。

{
  "rules": {
    "houses": {
      ".indexOn": ["is_empty"]
    }
  }
}

输出:foo

说明: 它应该抛出一个空指针异常,但它只是给你一个警告"来自类型Test的静态方法foo()应该以静态方式访问"。但是在执行它时会起作用。