Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么这个代码有效?_Java_Static - Fatal编程技术网

Java 为什么这个代码有效?

Java 为什么这个代码有效?,java,static,Java,Static,伙计们,我最近看到了一些代码,但不知道它为什么会工作 public class Test1{ static Test1 test(){ System.out.println("test"); return null; } static void print(){ System.out.println("print"); } public static void main(String...string

伙计们,我最近看到了一些代码,但不知道它为什么会工作

 public class Test1{

    static Test1 test(){
        System.out.println("test");
        return null;
    }

    static void print(){
        System.out.println("print");
    }

    public static void main(String...strings){
        test().print();
    }

}
仔细看,
print()
是一种静态方法。这意味着可以在没有
Test1
实例的情况下调用它。也就是说,它可以简单地称为:

Test.print();
test()
方法返回null这一事实与此无关。事实上,如果您使用的是现代IDE,它可能会在调用
test().print()
时发出警告,警告您试图在对象实例上调用静态方法

不存在NullPointerException,因为JVM没有尝试遵从test()返回的对象。JVM知道它不需要在对象实例上调用静态方法


如果你想知道更多关于底层实现的信息,以及
invokespecial
invokestatic
之间的区别,我建议。

如果你真的想一想,这是有意义的。为什么你认为没有呢?虽然这应该可以很好地编译,但这是一个可怕代码可读性的极好例子:)Supose u有5美元,你把这5美元给你自己,在这种情况下,你会说我给了自己5美元。是一样的,。方法返回类,该类也有tes。。。。。。。诸如此类on@RichardTingle,谢谢,真的是重复的。我知道这一点,但你能给我更详细的解释吗?为什么我们不接收NPE?@KirillSolokhov JVM只知道当对象是静态方法时,它不需要取消引用该对象。@Kirill假设它不为null,编译器会怎么做?使用声明的类并调用静态方法。与实际实例交谈是浪费时间,因此不必费心。因此,JVM甚至不知道它是空的