2014-07-17 64 views
5

由于可以直接从类中调用静态方法(即ClassName.methodName),为什么需要使用类的对象调用静态方法?我们可以用Java中的空对象调用静态方法吗?如果是这样,怎么样?

如果有人知道的话,请详细说明一下。

public static void methodA(){ 

} 
+1

你试过吗? –

+1

你尝试过'((YourClass)null).methodA()'? – Kayaman

+3

“......那么为什么需要用对象调用静态方法......” - 它是**不是**必需的。 –

回答

11

以下代码包含一个示例,其中通过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

+0

先生,请解释为什么NPE不投掷? – LMK

+1

@LMK在我的帖子中附上完整的原因,这在spec中有解释。请看一看。 –

+0

这是相当自我解释。对问候的调用不使用实例(它为空),因此不会发生NPE。 – JamesB

8

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

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

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

下面的程序说明了一个空引用可用于访问类(静态)变量,而不会引起一个异常:

从规范它自的例子。

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

为什么它正在发生

即使最喜欢的()的结果是空的分析,一个不抛出NullPointerException。尽管事实上只有它的类型而不是它的值被用于确定访问哪个字段(因为字段山是静态的),所以打印“Mount”证明主要表达式在运行时确实被充分评估。

+2

+ 1的很好的解释! –

+0

String s = null; System.out.println(“”+ s.trim());抛出NPE为什么? – LMK

+1

@LMK'trim()'在这里不是一个静态方法:)它需要特定的实例来执行修剪操作。 –

0

是的,这是一个奇怪的情况。下面是例子。

public class Test{ 
    public static String foo(){ 
    System.out.println("foo"); 
    return ""; 
    } 

    public static void main(String args[]){ 
      Test t=null; 
      t.foo();//no error will be thrown 
    } 
} 

输出:富

说明: 预计这应该抛出一个空指针异常,但它只是给你说,“静态方法foo()的型式试验应在被访问的警告一种静态的方式“。但是在执行时会起作用。

2

很好,你可以用空对象调用一个静态方法。

请看下面的例子。

public class Hashing { 

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

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

上面的代码片段将打印你好

因为在编译时间,因为hash()h.hash()将被转换为Hashing.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 !!

相关问题