由于可以直接从类中调用静态方法(即ClassName.methodName),为什么需要使用类的对象调用静态方法?我们可以用Java中的空对象调用静态方法吗?如果是这样,怎么样?
如果有人知道的话,请详细说明一下。
public static void methodA(){
}
由于可以直接从类中调用静态方法(即ClassName.methodName),为什么需要使用类的对象调用静态方法?我们可以用Java中的空对象调用静态方法吗?如果是这样,怎么样?
如果有人知道的话,请详细说明一下。
public static void methodA(){
}
以下代码包含一个示例,其中通过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
。
调用静态成员或方法时不需要实例。
由于静态成员属于类而不是实例。
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”证明主要表达式在运行时确实被充分评估。
+ 1的很好的解释! –
String s = null; System.out.println(“”+ s.trim());抛出NPE为什么? – LMK
@LMK'trim()'在这里不是一个静态方法:)它需要特定的实例来执行修剪操作。 –
是的,这是一个奇怪的情况。下面是例子。
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()的型式试验应在被访问的警告一种静态的方式“。但是在执行时会起作用。
很好,你可以用空对象调用一个静态方法。
请看下面的例子。
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 !!
你试过吗? –
你尝试过'((YourClass)null).methodA()'? – Kayaman
“......那么为什么需要用对象调用静态方法......” - 它是**不是**必需的。 –