由于可以直接从类中调用静态方法(即ClassName.methodName),为什么需要使用类的对象调用静态方法?
如果有人知道,请举例说明。
public static void methodA(){
}
答案 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()应该以静态方式访问"。但是在执行它时会起作用。